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",
]
我正在尝试构建要作为对象添加到 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",
]