我可以在Terraform中使用“计数”从帐户ID列表中创建一个accept_role_policy吗?

时间:2019-08-06 11:31:36

标签: amazon-web-services terraform amazon-iam terraform-provider-aws

我正在AWS中设置一个资源,该资源可从其他AWS账户访问。可以访问此资源的帐户列表因部署(QA,Pre-Prod,PROD等)而异。

帐户列表如下所示。

variable "my_list" {
    default = ["123456789", "111222333"]
}

以下是我对角色的信任策略的期望。

 "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::123456789:root",
        "AWS": "arn:aws:iam::111222333:root"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

我曾尝试在aws_iam_role资源的Terraform中使用count,但是正如预期的那样,count正在创建多个IAM角色。

还有另一种方法可以实现这一目标吗?

2 个答案:

答案 0 :(得分:1)

包含多个帐户的信任策略应将id == 0作为委托人的密钥,但该值应为根帐户的ARN列表。 AWS user guide中对此进行了描述,并提供了两种指定AWS账户的有效方法:使用完整的ARN或仅使用账户ID。他们提供的示例如下所示:

AWS

它将是一个较大的信任策略文档的一部分,该文档看起来像:

"Principal": { 
  "AWS": [
    "arn:aws:iam::123456789012:root",
    "999999999999"
  ]
}

要获得较短样式的输出,则只需使用{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::123456789012:root", "999999999999" ] }, "Action": "sts:AssumeRole" } ] } 函数(Terraform 0.110.12):

jsonencode

或者使用更长的样式以及完整的ARN作为帐户的根:

resource "aws_iam_role" "example_short" {
  name = "example-short"

  assume_role_policy = <<EOF
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": ${jsonencode(var.my_list)}
      },
      "Action": "sts:AssumeRole"
    }
  ]
}
EOF
}

答案 1 :(得分:0)

如果您使用Terraform 0.12.0或更高版本,则可以将IAM策略文档构造为数据结构,并使用jsonencode将其格式化为aws_iam_role期望的字符串格式:

  policy = jsonencode({
    "Version": "2012-10-17",
    "Statement": [
      {
        "Sid": "",
        "Effect": "Allow",
        "Principal": {
          for acct in var.my_list : "AWS" => "arn:aws:iam::${acct}:root"
        },
        "Action": "sts:AssumeRole"
      }
    ]
  })

对于Terraform 0.11或更早版本,没有直接的方法来实现。