使用 Terraform 模块复制基础设施会针对同名 IAM 策略抛出错误
Replicate infrastructure using Terraform module throws error for same name IAM policy
我已经创建了如下的基本基础设施,我正在尝试查看模块是否适合我使用 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。如何实现?
我的实际模块看起来像 。
如何使用模块并动态命名模块资源?例如stage_iam_policy
/ prod_iam_policy
等。这是正确的方法吗?
无论在何处使用该模块,您都将相同的 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")}"
}
或者,如果您没有一些有用的东西可以使用,例如 name
或 environment
等,那么您可以直接使用一些随机性:
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")}"
}
我已经创建了如下的基本基础设施,我正在尝试查看模块是否适合我使用 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。如何实现?
我的实际模块看起来像
如何使用模块并动态命名模块资源?例如stage_iam_policy
/ prod_iam_policy
等。这是正确的方法吗?
无论在何处使用该模块,您都将相同的 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")}"
}
或者,如果您没有一些有用的东西可以使用,例如 name
或 environment
等,那么您可以直接使用一些随机性:
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")}"
}