Репликация инфраструктуры с помощью модуля Terraform выдает ошибку для политики IAM с таким же именем

Я создал базовую инфраструктуру, как показано ниже, и пытаюсь проверить, работают ли у меня модули для репликации инфраструктуры на AWS с помощью Terraform.

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, он выдает ошибку для политики ресурсов с таким же именем. Как мне справиться с таким сценарием?

Я хочу использовать тот же main.tf для среды prod / stage / dev. Как мне этого добиться?

Мой фактический модуль выглядит как код в этом вопросе.

Как использовать модули и иметь возможность динамически называть ресурсы модуля? например stage_iam_policy / prod_iam_policy и т. Д. Это правильный подход?


person Community    schedule 05.09.2018    source источник


Ответы (1)


Вы называете политику IAM одинаково, независимо от того, где вы используете модуль. С помощью политик IAM они однозначно идентифицируются своим именем, а не каким-то случайным идентификатором (например, экземпляры EC2, которые обозначаются как i-...), поэтому у вас не может быть двух политик IAM с одинаковыми именами в одной учетной записи AWS.

Вместо этого вы должны добавить к имени дополнительную уникальность, например, используя параметр модуля, добавленный к имени, примерно так:

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")}"
}
person ydaetskcoR    schedule 06.09.2018
comment
Тай за ответ. Это решило мою проблему. Я не передавал переменную в объявлении module. - person ; 06.09.2018