如何在 terraform 资源中的 zipmap 和列表上创建嵌套的 for 循环
How to create a nested for-loop over zipmaps and lists in terraform resources
我有 2 个 zipmap,我想通过 嵌套 for 循环 循环,即 inner 和 外部循环。
在Python
中那会很容易,例如:
for i in list_1:
for j in list_2:
# do sth.
print(i, j)
1) 我的定义 zipmaps
zipmap 1:“masked_cidr_blocks_zipmap”
dms_ip_addresses = data.dns_a_record_set.input_dms.addrs
cidr_blocks = [for idx in range(length(dms_ip_addresses)) : join("", [dms_ip_addresses[idx], "/16"])]
masked_cidr_blocks_zipmap = zipmap(range(length(cidr_blocks)),
[for idx in range(length(cidr_blocks)) : cidrsubnet(cidr_blocks[idx], 0, 0)])
根据 zipmap docs,zipmap 的结构类似于 zipmap(keyslist, valueslist)
,例如(发明值):
> zipmap(["0", "1"], ["199.99.0.0/16", "199.97.0.0/16"])
{
"0" = "199.99.0.0/16",
"1" = "199.97.0.0/16",
}
zipmap 2:“network_acls”
network_acls = zipmap(range(length(data.aws_network_acls.main.ids)),
data.aws_network_acls.main.ids)
这种情况下的一个例子可以是(虚构的价值观):
> zipmap(["0", "1"], ["acl-328ufjf2j3923rjf22", "acl-23489289jf23rf232r"])
{
"0" = "acl-328ufjf2j3923rjf22",
"1" = "acl-23489289jf23rf232r",
}
2) 意图创建嵌套的 for 循环
请注意以下是伪代码,它不像terraform
中那样工作(不幸的是):
resource "aws_network_acl_rule" "dms_control_port" {
for_each = local.network_acls # outer for-loop
for_each = local.masked_cidr_blocks_zipmap # inner for-loop
network_acl_id = each_outer.value
rule_number = 415 + each_inner.key
egress = false
protocol = "tcp"
rule_action = "allow"
cidr_block = each_inner.value
from_port = 443
to_port = 443
}
如何 在我的资源“aws_network_acl_rule”“dms_control_port”中实现这种嵌套循环行为
用外循环值或内循环值填充不同的参数?
您正在通过展平数据集来模拟双 for_each
。所以对于你的例子:
locals {
network_acls = {
"0" = "acl-328ufjf2j3923rjf22",
"1" = "acl-23489289jf23rf232r",
}
masked_cidr_blocks_zipmap = {
"0" = "199.99.0.0/16",
"1" = "199.97.0.0/16",
}
# flatten data structure
acls_cidr = merge([
for ni,acl in local.network_acls:
{
for maskedi,cidr in local.masked_cidr_blocks_zipmap:
"${ni}-${maskedi}" => {
"ni" = ni
"maskedi" = maskedi
"acl" = acl
"cidr" = cidr
}
}
]...)
}
给出:
{
"0-0" = {
"acl" = "acl-328ufjf2j3923rjf22"
"cidr" = "199.99.0.0/16"
"maskedi" = "0"
"ni" = "0"
}
"0-1" = {
"acl" = "acl-328ufjf2j3923rjf22"
"cidr" = "199.97.0.0/16"
"maskedi" = "1"
"ni" = "0"
}
"1-0" = {
"acl" = "acl-23489289jf23rf232r"
"cidr" = "199.99.0.0/16"
"maskedi" = "0"
"ni" = "1"
}
"1-1" = {
"acl" = "acl-23489289jf23rf232r"
"cidr" = "199.97.0.0/16"
"maskedi" = "1"
"ni" = "1"
}
}
那么你只需使用 single for_each
(仅在下面举例 - 我不知道你的设置中的哪个变量):
resource "aws_network_acl_rule" "dms_control_port" {
for_each = local.acls_cidr
network_acl_id = each.value.ni
rule_number = 415 + each.value.maskedi
egress = false
protocol = "tcp"
rule_action = "allow"
cidr_block = each.value.cidr
from_port = 443
to_port = 443
}
我有 2 个 zipmap,我想通过 嵌套 for 循环 循环,即 inner 和 外部循环。
在Python
中那会很容易,例如:
for i in list_1:
for j in list_2:
# do sth.
print(i, j)
1) 我的定义 zipmaps
zipmap 1:“masked_cidr_blocks_zipmap”
dms_ip_addresses = data.dns_a_record_set.input_dms.addrs
cidr_blocks = [for idx in range(length(dms_ip_addresses)) : join("", [dms_ip_addresses[idx], "/16"])]
masked_cidr_blocks_zipmap = zipmap(range(length(cidr_blocks)),
[for idx in range(length(cidr_blocks)) : cidrsubnet(cidr_blocks[idx], 0, 0)])
根据 zipmap docs,zipmap 的结构类似于 zipmap(keyslist, valueslist)
,例如(发明值):
> zipmap(["0", "1"], ["199.99.0.0/16", "199.97.0.0/16"])
{
"0" = "199.99.0.0/16",
"1" = "199.97.0.0/16",
}
zipmap 2:“network_acls”
network_acls = zipmap(range(length(data.aws_network_acls.main.ids)),
data.aws_network_acls.main.ids)
这种情况下的一个例子可以是(虚构的价值观):
> zipmap(["0", "1"], ["acl-328ufjf2j3923rjf22", "acl-23489289jf23rf232r"])
{
"0" = "acl-328ufjf2j3923rjf22",
"1" = "acl-23489289jf23rf232r",
}
2) 意图创建嵌套的 for 循环
请注意以下是伪代码,它不像terraform
中那样工作(不幸的是):
resource "aws_network_acl_rule" "dms_control_port" {
for_each = local.network_acls # outer for-loop
for_each = local.masked_cidr_blocks_zipmap # inner for-loop
network_acl_id = each_outer.value
rule_number = 415 + each_inner.key
egress = false
protocol = "tcp"
rule_action = "allow"
cidr_block = each_inner.value
from_port = 443
to_port = 443
}
如何 在我的资源“aws_network_acl_rule”“dms_control_port”中实现这种嵌套循环行为 用外循环值或内循环值填充不同的参数?
您正在通过展平数据集来模拟双 for_each
。所以对于你的例子:
locals {
network_acls = {
"0" = "acl-328ufjf2j3923rjf22",
"1" = "acl-23489289jf23rf232r",
}
masked_cidr_blocks_zipmap = {
"0" = "199.99.0.0/16",
"1" = "199.97.0.0/16",
}
# flatten data structure
acls_cidr = merge([
for ni,acl in local.network_acls:
{
for maskedi,cidr in local.masked_cidr_blocks_zipmap:
"${ni}-${maskedi}" => {
"ni" = ni
"maskedi" = maskedi
"acl" = acl
"cidr" = cidr
}
}
]...)
}
给出:
{
"0-0" = {
"acl" = "acl-328ufjf2j3923rjf22"
"cidr" = "199.99.0.0/16"
"maskedi" = "0"
"ni" = "0"
}
"0-1" = {
"acl" = "acl-328ufjf2j3923rjf22"
"cidr" = "199.97.0.0/16"
"maskedi" = "1"
"ni" = "0"
}
"1-0" = {
"acl" = "acl-23489289jf23rf232r"
"cidr" = "199.99.0.0/16"
"maskedi" = "0"
"ni" = "1"
}
"1-1" = {
"acl" = "acl-23489289jf23rf232r"
"cidr" = "199.97.0.0/16"
"maskedi" = "1"
"ni" = "1"
}
}
那么你只需使用 single for_each
(仅在下面举例 - 我不知道你的设置中的哪个变量):
resource "aws_network_acl_rule" "dms_control_port" {
for_each = local.acls_cidr
network_acl_id = each.value.ni
rule_number = 415 + each.value.maskedi
egress = false
protocol = "tcp"
rule_action = "allow"
cidr_block = each.value.cidr
from_port = 443
to_port = 443
}