Terraform, кажется, не повторяется в моем списке при вызове из модуля - PullRequest
0 голосов
/ 09 апреля 2019

У меня есть простой модуль, который выглядит примерно так:

module "EncryptionKeys" {
  source                 = "../../../../Modules/KeyGenerator"
  item_list              = ["${module.static_variables.item_list}"]
  account_id             = "${module.static_variables.account_id}"
  key_alias_suffix       = "a-suffix"
  key_administrator_role = "${data.aws_iam_role.admins.name}"
  key_user_suffix        = "some-other-suffix"
}

Вот ключевой ресурс в модуле:

resource "aws_kms_key" "key" {
  count               = "${length(var.item_list)}"
  description         = "${var.description}"
  policy             = "${data.aws_iam_policy_document.key_document.json}"
  enable_key_rotation = "${var.enable_key_rotation}"
}

Сам модуль создает роль / политику AWS IAM со следующим оператором:

statement {
  sid = "Allow use of the key for users"
  effect = "Allow"
  principals {
    identifiers = 
["arn:aws:iam::${var.account_id}:role/${var.key_administrator_role}", "${element(split(".",var.item_list[count.index]),0)}-${var.key_user_suffix}"]
    type = "AWS"
}
actions = [
  "kms:Encrypt",
  "kms:Decrypt",
  "kms:ReEncrypt*",
  "kms:GenerateDataKey*",
  "kms:DescribeKey"
]
resources = ["*"]
 }

Проблема? Когда я просматриваю успешный план Terraform, item_list правильно анализируется в соответствии с элементом, но это всегда только одно и то же значение. т.е. если у меня есть item_list, определенный как:

item_list = ["a.blah", "b.foo", "c.bar", "d.foobar"]

будет четыре экземпляра соответствующих ресурсов, правильное разделение произойдет в «.», Но все будут названы как «a».

"{
 "Version": "2012-10-17",
 "Id": "key=consolepolicy-3",
 "Statement": [
 {
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Action": "kms:*",
  "Resource": "*",
  "Principal": {
    "AWS": "arn:aws:iam::123456789:role/Admins"
  }
},
{
  "Sid": "Allow attachment of persistent resources for admin",
  "Effect": "Allow",
  "Action": [
    "kms:RevokeGrant",
    "kms:ListGrants",
    "kms:CreateGrant"
  ],
  "Resource": "*",
  "Principal": {
    "AWS": "arn:aws:iam::123456789:role/Admins"
  },
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
},
{
  "Sid": "Allow use of the key for users",
  "Effect": "Allow",
  "Action": [
    "kms:ReEncrypt*",
    "kms:GenerateDataKey*",
    "kms:Encrypt",
    "kms:DescribeKey",
    "kms:Decrypt"
  ],
  "Resource": "*",
  "Principal": {
    "AWS": [
      "a-stg-role",
      "arn:aws:iam::123456789:role/Admins"
    ]
  }
},
{
  "Sid": "Allow attachment of persistent resources for users",
  "Effect": "Allow",
  "Action": [
    "kms:RevokeGrant",
    "kms:ListGrants",
    "kms:CreateGrant"
  ],
  "Resource": "*",
  "Principal": {
    "AWS": [
      "a-stg-role",
      "arn:aws:iam::123456789:role/Admins"
    ]
  },
  "Condition": {
    "Bool": {
      "kms:GrantIsForAWSResource": "true"
    }
  }
}
]
}"

Я делаю что-то в корне неправильно с count / count.index здесь? Почему он не зацикливает item_list и почему он всегда получает одно и то же значение?

1 Ответ

1 голос
/ 10 апреля 2019

Вы указываете счетчик для ключа ресурса, но это не означает, что он доступен для вашего aws_iam_policy_document.

Попробуйте включить счетчик в aws_iam_policy_document, например,

data "aws_iam_policy_document" "key_document" {
  count = "${length(var.item_list)}"

  # rest of template ....
}

Затем обратитесь к списку политик из ключевого ресурса с помощью счетчика в ключевом ресурсе: policy = "${element(data.aws_iam_policy_document.key_document.*.json, count.index)}"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...