Terraform遍历列表

时间:2018-10-16 14:04:04

标签: terraform terraform-provider-aws

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

这是地形可以做的吗?

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]}"]
}

但是没有成功。

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

1 个答案:

答案 0 :(得分:7)

给出您的帐户ID列表,您是否尝试过?

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

然后在您的保单文件中:

GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Double.class, (JsonSerializer<Double>) (src, typeOfSrc, context) -> {
    DecimalFormat df = new DecimalFormat("#.####");
    df.setRoundingMode(RoundingMode.CEILING);
    return new JsonPrimitive(Double.parseDouble(df.format(src)));
});
Gson gson = builder.create();

我实际上还没有尝试过,但是想不出它不起作用的原因。