我正在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角色。
还有另一种方法可以实现这一目标吗?
答案 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.11或0.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或更早版本,没有直接的方法来实现。