环形的Terraform巢



我在这里有点挣扎,想知道这是否可能。我有一个vars贴花,如下所示:

variable "subnets" {
type = list(object({
name = string
cidr_block = string
}))
default = [
{
name = private
cidr_block = 10.0.0.1/24
},
{
name = public
cidr_block = 10.0.0.2/24
}
]
}

然后我使用数据源查询当前区域中的区域

data aws_availability_zones available {}

现在我要做的是在每个az区域中创建上面的子网,我似乎无法将这些区域组合到上面的var.

我正在尝试的是

resource aws_suubnet subnet {
for each  = {for idx,az.name in data.aws_availability_zones.available.names : idx => az.name}
vpc_id    = var.vpc_id
availability_zone = data.aws_availability_zones.available.names[each.key]
cidr_block = (this is where I want to query my var.subnets but I don't seem to be able to do another for 
here)
}

我希望最终得到6个子网,3个私有子网和3个公共子网,每个区域各有一个子网。非常感谢您的帮助。感谢

我认为您在这里的意图是动态选择两个可用的可用性区域,并在每个区域中声明一个子网。

这是可能的,我将在下面展示一个配置示例,但首先我想提醒大家,这是一个潜在的风险设计,因为可用性区域的设置可能会随着时间的推移而变化,因此您可能会发现,在不对您的配置进行任何直接更改的情况下,稍后的Terraform计划建议在不同的可用性区域中重新创建一个子网或两个子网。

因此,我通常建议将子网分配给可用性区域,这是您有意选择的,并在配置中静态编码,而不是动态选择,以确保您的配置效果随着时间的推移保持稳定,除非您有意更改它。


有了这个警告,我仍然想回答这里的一般问题,因为";拉链拉在一起";在其他情况下可能会出现两个不同长度的集合,因此了解其模式可能仍然很有用,包括如果您最终决定将可用性区域列表作为变量而不是数据源查找。

variable "subnets" {
type = list(object({
name       = string
cidr_block = string
}))
}
data "aws_availability_zones" "available" {
}
locals {
# The availability zones are returned as an unordered
# set, so we'll sort them to be explicit that we're
# depending on one particular ordering.
zone_names = sort(data.aws_availabililty_zones.available.names)
subnets = tolist([
for i, sn in var.subnets : {
name       = sn.name
cidr_block = sn.cidr_block
zone       = element(local.zone_names, i)
}
])
}

上例中的最后一个表达式依赖于element函数,它类似于像local.zone_names[i]那样的索引,但如果i太大,它不会返回错误,而是会换行并再次从区域列表中重新选择相同的项目。

相关内容

  • 没有找到相关文章

最新更新