Terraform - 从地图构造字符串列表

Terraform - construct list of strings from map

.

我正在尝试构建要作为对象添加到 S3 存储桶的前缀列表。结果应该是这样的:

Bucket ----> /Partner1 ----> /Client1 ----> /User1
        |               |              |--> /User2
        |               |
        |               |--> /Client2 ----> /User1
        |
        |--> /Partner2 ----> /Client1 ----> /User1

等等...

我定义这个变量:

variable "s3_folders_map" {
    type = map
    default = {
      Partner1 = {
        client1 = ["User1", "User2", "User3", "User4", "User5"]
        client2 = ["User1"]
        client3 = ["User1"]
      }
      Partner2 = {
        client1 = ["User1"]
      }
      Partner3 = {
        client1 = ["User1"]
      }
    }
}

然后尝试提取前缀列表,例如

/Partner1/Client1/User1
/Partner1/Client1/User2
/Partner1/Client2/User1
...

使用这个:

locals {
  s3_folders     = flatten([
    for partner, client in var.s3_folders_map: [
      flatten([for user in client: {
        "partner" = partner
        "client" = client
        "user" = user
        }
      ])
    ]
  ])
}

output "s3_folders" {
  value = local.s3_folders
}

这是我在 运行 terraform 计划时看到的:

  + s3_folders = [
      + {
          + client  = {
              + "client1" = [
                  + "User1",
                  + "User2",
                  + "User3",
                  + "User4",
                  + "User5",
                ]
              + "client2" = [
                  + "User1",
                ]
              + "client3" = [
                  + "User1",
                ]
            }
          + partner = "Partner1"
          + user    = [
              + "User1",
              + "User2",
              + "User3",
              + "User4",
              + "User5",
            ]
        },
      + {
          + client  = {
              + "client1" = [
                  + "User1",
                  + "User2",
                  + "User3",
                  + "User4",
                  + "User5",
                ]
              + "client2" = [
                  + "User1",
                ]
              + "client3" = [
                  + "User1",
                ]
            }
          + partner = "Partner1"
          + user    = [
              + "User1",
            ]
        },
      + {
          + client  = {
              + "client1" = [
                  + "User1",
                  + "User2",
                  + "User3",
                  + "User4",
                  + "User5",
                ]
              + "client2" = [
                  + "User1",
                ]
              + "client3" = [
                  + "User1",
                ]
            }
          + partner = "Partner1"
          + user    = [
              + "User1",
            ]
        },
      + {
          + client  = {
              + "client1" = [
                  + "User1",
                ]
            }
          + partner = "Partner2"
          + user    = [
              + "User1",
            ]
        },
      + {
          + client  = {
              + "client1" = [
                  + "User1",
                ]
            }
          + partner = "Partner3"
          + user    = [
              + "User1",
            ]
        },
    ]

当有多个用户时,user 看起来像是一个列表,而我想遍历该列表并提取每个用户名。我在这里做错了什么?

您需要 三个 for 循环:

  s3_folders  = flatten([
    for partner, clients in var.s3_folders_map: [
        for client, users in clients: [
          for user in users: "${partner}/${client}/${user}"
        ]      
    ]
  ])

给出:

s3_folders = [
  "Partner1/client1/User1",
  "Partner1/client1/User2",
  "Partner1/client1/User3",
  "Partner1/client1/User4",
  "Partner1/client1/User5",
  "Partner1/client2/User1",
  "Partner1/client3/User1",
  "Partner2/client1/User1",
  "Partner3/client1/User1",
]