【问题标题】:Reference every resource created using for_each loop引用使用 for_each 循环创建的每个资源
【发布时间】:2020-02-12 18:47:54
【问题描述】:

我正在使用 for_each 创建多个 s3 存储桶,并且在创建资源时没有问题。稍后我在引用这些资源时遇到了麻烦。我希望能够引用所有资源。像这样:

resource "aws_s3_bucket" "dm_client" {
    for_each = toset(var.dm_client_bucket)

    bucket = format("dm-%s-%s",var.env,each.value)
    acl = "private"

    versioning {
        enabled = true
    }
...
data "aws_iam_policy_document" "dm_permission_client" {
    statement {
        sid = "ClientAccess"
        actions = [
            "s3:List*",
            "s3:Get*"
        ]
        resources = [
            aws_s3_bucket.dm_internal["*"].arn,
            "${aws_s3_bucket.dm_internal["*"].arn}/*",
            aws_s3_bucket.dm_client["*"].arn,
            "${aws_s3_bucket.dm_client["*"].arn}/*"
        ]
    }
}```
I've tried using *, "*", etc.. To no avail..

【问题讨论】:

    标签: amazon-web-services terraform


    【解决方案1】:

    当您使用for_each 时,资源值变成了从您的键到代表资源实例的对象的映射。 [*] 运算符用于列表,因此在这种情况下不起作用。

    相反,您可以写一个for expression

    [for b in aws_s3_bucket.dm_internal : b.arn]
    

    在您描述的情况下,您需要一个列表,但类似的语法也可以从键到 ARN 字符串派生映射:

    { for k, b in aws_s3_bucket.dm_internal : k => b.arn }
    

    [*] 运算符 ("Splat Expressions") 是 for 表达式应用于列表或集合时的简写。


    aws_iam_policy_document 中的 resources 参数需要一个字符串列表,但如果您只是直接使用 for 表达式,您将获得一个字符串列表列表。要获取参数所期望的字符串的平面列表,请使用concat

      resources = concat(
        [for b in aws_s3_bucket.dm_internal : b.arn],
        [for b in aws_s3_bucket.dm_internal : "${b.arn}/*"],
        [for b in aws_s3_bucket.dm_client : b.arn],
        [for b in aws_s3_bucket.dm_client : "${b.arn}/*"],
      )
    

    【讨论】:

    • 感谢您的回复!不幸的是,当我使用您的示例时。它返回错误 创建 IAM 策略时出错 dm-dev-service-policy: MalformedPolicyDocument: Resource dm-dev-job must be in ARN format or "*".
    • 听起来至少有一个 S3 存储桶 ARN 不是此配置所期望的格式。如果您运行 terraform plan 并查找针对该资源上的存储桶策略建议的 JSON 对象,您应该能够在那里看到正在生成的 ARN,并确保它们都具有有效的语法。我对 S3 ARN 结构不是很熟悉,但我最初的猜测是 arn 属性可能已经有一个路径部分,因此在末尾附加 /* 可能会产生无效结果。
    • 感谢您的回复。我实际上意识到,使用您的示例将引用不是策略正在创建的 s3 存储桶的存储桶,从而导致资源无效。
    猜你喜欢
    • 2021-11-25
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    • 2020-12-17
    • 2021-04-15
    • 2020-12-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多