使用Terraform模块复制基础结构会引发同名IAM策略错误

时间:2018-09-05 17:43:28

标签: amazon-web-services terraform terraform-provider-aws

我已经创建了以下基本基础设施,我正在尝试查看模块是否对我有用,以使用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等。这是正确的方法吗?

1 个答案:

答案 0 :(得分:1)

无论使用模块的位置如何,您都将IAM策略命名为相同的名称。使用IAM策略时,它们是通过名称唯一标识的,而不是通过某些随机ID来唯一标识的(例如,标识为%ERRORLEVEL%的EC2实例),因此在同一AWS账户中不能有两个具有相同名称的IAM策略。< / p>

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

i-...

,并且在您的模块中将具有以下内容:

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")}" } name等,那么您可以直接使用一些随机性:

environment