使用Terraform模块复制基础架构会导致同名IAM策略出错

问题描述 投票:-1回答:1

我已经创建了如下的基础架构,我正在尝试查看模块是否适用于我使用Terraform在AWS上复制基础架构。

variable "access_key" {}
variable "secret_key" {}

provider "aws" {
  access_key = "${var.access_key}"
  secret_key = "${var.secret_key}"
  alias  = "us-east-1"
  region = "us-east-1"
}

variable "company" {}

module "test1" {
  source = "./modules"
}

module "test2" {
  source = "./modules"
}

我的模块如下:

 resource "aws_iam_policy" "api_dbaccess_policy" {
   name = "lambda_dbaccess_policy"
   policy = "${file("${path.module}/api-dynamodb-policy.json")}"
 }

但不知何故,当我在我的main.tf中使用相同的模块时,它给出了同一个命名资源策略的错误。我该如何处理这种情况?

我想在prod / stage / dev环境中使用相同的main.tf。我该如何实现?

我的实际模块看起来像the code in this question

如何使用模块并能够动态命名模块资源?例如stage_iam_policy / prod_iam_policy等。这是正确的方法吗?

amazon-web-services terraform terraform-provider-aws
1个回答
1
投票

无论您在何处使用该模块,您都将IAM策略命名为相同。对于IAM策略,它们由其名称唯一标识,而不是一些随机ID(例如标识为i-...的EC2实例),因此您不能在同一AWS账户中拥有2个具有相同名称的IAM策略。

相反,您必须为名称添加一些额外的唯一性,例如通过使用附加到名称的模块的参数,如下所示:

module "test1" {
  source     = "./modules"
  enviroment = "foo"
}

module "test1" {
  source     = "./modules"
  enviroment = "bar"
}

在您的模块中,您将拥有以下内容:

variable "enviroment" {}

resource "aws_iam_policy" "api_dbaccess_policy" {
  name   = "lambda_dbaccess_policy_${var.enviroment}"
  policy = "${file("${path.module}/api-dynamodb-policy.json")}"
}

或者,如果你没有一些有用的东西,你可以使用,如nameenvironment等,那么你可以直接使用一些随机性:

resource "random_pet" "random" {}

resource "aws_iam_policy" "api_dbaccess_policy" {
  name   = "lambda_dbaccess_policy_${random_pet.random.id}"
  policy = "${file("${path.module}/api-dynamodb-policy.json")}"
}
© www.soinside.com 2019 - 2024. All rights reserved.