Репликация инфраструктуры с использованием модуля Terraform выдает ошибку для политики IAM с тем же именем - PullRequest
0 голосов
/ 05 сентября 2018

Я создал базовую инфраструктуру, как показано ниже, и я пытаюсь проверить, работают ли модули для репликации инфраструктуры на 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 и т. Д. Это правильный подход?

1 Ответ

0 голосов
/ 06 сентября 2018

Вы называете политику IAM одинаковой независимо от того, где вы используете модуль. В политиках IAM они однозначно идентифицируются по своему имени, а не по некоторому случайному идентификатору (например, экземплярам EC2, которые идентифицируются как i-...), поэтому вы не можете иметь 2 политики 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")}"
}
...