【问题标题】:Use templatefile in Terraform on AWS policy which uses IAM policy variables [duplicate]在使用 IAM 策略变量的 Terraform on AWS 策略中使用模板文件 [重复]
【发布时间】:2020-08-12 03:46:18
【问题描述】:

我正在尝试使用 Terraform 在 AWS 中构建云基础设施。我想通过 terraform 的templatefile 函数为使用基于属性的授权 (ABAC) 的 S3 存储桶添加策略。我的问题是terraform和AWS使用的变量语法是一样的(${...})。

这是策略模板:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AllowReadRole1",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": "arn:aws:s3:::${bucketName}/*",
            "Effect": "Allow",
            "Principal": "*",
            "Condition": {
                "s3:ExistingObjectTag/myid": "${aws:PrincipalTag/myid}"
            }
        }
    ]
}

terrafrom 文件的相关部分是:

resource "aws_s3_bucket_policy" "mybuckets-policy" {
  bucket = aws_s3_bucket.mybuckets[count.index].bucket
  policy = templatefile("${path.module}/bucket-policy.json", {
    bucketName = aws_s3_bucket.mybuckets[count.index].bucket
  })
  count = 2
}

所以我想要的是模板的 ${bucketName} 部分被 terraform 替换,同时保持 AWS 表达式 ${aws:PrincipalTag/user-id} 就位。 但是在上面的配置上运行 terraform 会导致错误消息

调用函数“模板文件”失败:./bucket-policy.json:14,49-50: Extra 插值表达式后的字符;期望一个右大括号结束 插值表达式,但发现多余的字符..

如果我在我的模板中放入另一个项目 ${foobar} 而没有为其指定值,则错误消息是

“vars”参数的值无效:vars 映射不包含键“foobar”, 引用于 ./bucket-policy.json:11,30-36。

如何让 terraform 对模板文件进行部分评估,同时保持所有其他项目不变?

【问题讨论】:

  • 您是否考虑过将您的保单放入 HEREDOC 中?在这些情况下,它通常要简单得多。此外,您当前的示例已经剥离了 aws:PrincipalTag 部分,因此它现在不是一个有意义的示例(没有任何 AWS 特定的使用相同的插值语法)。您还可以通过将 $ 加倍来从 Terraform 中转义 $ 插值,因此请使用 $${...}
  • 我修复了策略示例。
  • 你试过用$${aws:PrincipalTag/myid}转义${aws:PrincipalTag/myid}吗?
  • 是的,效果很好。谢谢你。如果您将其发布为答案,我将很乐意接受。
  • @ydaetskcoR 下次像这样更改欺骗目标; meta.stackoverflow.com/questions/355666/…

标签: amazon-web-services terraform terraform-provider-aws terraform-template-file aws-policies


【解决方案1】:

在上面的示例中,语法 ${} 将导致 Terraform 尝试将字段评估为插值函数。由于您想按字面意思使用此值,而不是作为插值函数,因此需要使用两个 $ 符号进行双重转义。

$${aws:PrincipalTag/user-id}

【讨论】:

  • 虽然此解决方案运行良好,但我仍然更喜欢这样一种解决方案,我可以防止这些字段在 terraform 中被解释,而无需更改策略文件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-09-23
  • 1970-01-01
  • 2018-04-13
  • 2021-05-21
  • 2016-06-05
  • 2022-01-19
  • 2018-12-08
相关资源
最近更新 更多