【问题标题】:Terraform iterate over listTerraform 遍历列表
【发布时间】:2019-03-21 02:22:14
【问题描述】:

我想将 3 个独立变量(dev_id、prod_id、stage_id)替换为包含所有三个变量的单个列表,并迭代它们,将它们应用于策略。

这是 terraform 可以做到的吗?

data "aws_iam_policy_document" "iam_policy_document_dynamodb" {
  statement {
    effect    = "Allow"
    resources = ["arn:aws:dynamodb:${var.region}:${var.account_id}:table:${var.dynamodb_table_name}"]

    actions = [
      "dynamodb:GetItem",
      "dynamodb:PutItem",
      "dynamodb:DeleteItem",
    ]

    principals {
      type = "AWS"

      identifiers = [
        "arn:aws:iam::${var.dev_id}:root",
        "arn:aws:iam::${var.prod_id}:root",
        "arn:aws:iam::${var.stage_id}:root"
      ]
    }
  }
}

我研究了循环和插值,但似乎 99% 的时间插值是用“计数”完成的,它只适用于创建多个资源(我希望我不是在说大谎)。

比如我用过

principals {
   count = "${length(var.list)}"
   identifiers = ["arn:aws:iam::${var.list[count.index]}"]
}

但这并不成功。

是否有某种方法可以实现将这 3 个变量替换为单个列表(或映射)并对其进行迭代的最终目标?

【问题讨论】:

  • 您希望输出策略是什么样的?
  • 我希望策略看起来与第一个代码块中的完全一样,也就是说,它应该包含 3 个不同的帐户 ID。但是,我想通过迭代来做到这一点,而不是对 3 个帐户进行硬编码......@ydaetskcoR

标签: terraform terraform-provider-aws


【解决方案1】:

鉴于您有帐户 ID 列表,您尝试过吗?

var "accounts" {
  default = ["123", "456", "789"]
  type = "list"
}

locals {
  accounts_arn = "${formatlist("arn:aws:iam::%s", var.accounts)}"
}

然后在您的政策文件中:

principals {
  type = "AWS"
  identifiers = ["${local.accounts_arn}"]
}

我还没有真正尝试过,但想不出它不起作用的原因。

【讨论】:

  • 这是一个非常优雅的解决方案,我不知道。它似乎可以按预期工作,但不幸的是我还无法验证它,因为我收到了政策错误。在命令行上设置变量时,它不会读取我的环境变量,而是将其视为字符串:我这样做: terraform plan \ --var list_account_ids=["${DEV_ID}", "${PROD_ID}", "${STAGE_ID}"] 并将 $DEV_ID 视为字符串 "$DEV_ID"...
  • 在纠正了其他问题之后,我设法根据您的建议运行 terraform apply (顺便说一句,根据我得到“本地”而不是“本地”的错误),但现在我得到了格式错误的策略错误“aws_s3_bucket.s3_bucket:放置 S3 策略时出错:MalformedPolicy:策略具有无效资源”。
  • 典型的语法错误。你的回答很好,我会接受的,谢谢! @Magd Kudama
  • 这是我在 TF 中做过的最酷的事情。谢谢@Magd,我试过了,效果很好:)
猜你喜欢
  • 2019-08-24
  • 2022-01-04
  • 2017-07-23
  • 2021-11-27
  • 2019-08-08
  • 2019-07-23
  • 2022-12-11
  • 2021-04-10
  • 2020-06-23
相关资源
最近更新 更多