我创建了一个用于创建 AWS 子网的模块。在模块中,我使用 for_each 循环来创建子网。我假设我可以索引给定子网的资源 ID,但循环似乎没有以可预测的顺序输出子网 ID 索引......不确定我在这里遗漏了什么。任何帮助表示赞赏!
main.tf
module "subnets" {
source = "./modules/subnets/"
vpc_id = aws_vpc.main.id
subnets = [
{
name = "private-1a"
cidr_block = "10.0.0.0/28"
availability_zone = "us-east-1a"
},
{
name = "private-1b"
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1b"
},
{
name = "public-1a"
cidr_block = "10.0.2.0/24"
availability_zone = "us-east-1a"
},
{
name = "public-1b"
cidr_block = "10.0.3.0/24"
availability_zone = "us-east-1b"
}
]
}
output "private1a" {
value = module.security_subnets.subnet_id[0]
}
output "private1b" {
value = module.security_subnets.subnet_id[1]
}
output "public1a" {
value = module.security_subnets.subnet_id[2]
}
output "public1b" {
value = module.security_subnets.subnet_id[3]
}
模块
locals {
subnets = {
for i in var.subnets :
i.name => i
}
}
resource "aws_subnet" "main" {
for_each = local.subnets
vpc_id = var.vpc_id
cidr_block = each.value.cidr_block
availability_zone = each.value.availability_zone
tags = merge(
{
"Name" = format("%s", each.value.name)
}
)
}
output subnet_id {
value = values(aws_subnet.main)[*].id
}
答案 0 :(得分:0)
作为一般规则,依赖于返回的项目的顺序不是一个好的做法,因为如果您决定在两者之间添加某些内容或删除某些内容,这可能会导致未来的问题。 >
不过,在您的情况下,项目返回的顺序是明确定义的。由于您使用的是 values,因此顺序是:
<块引用>值按字典顺序由其对应的键返回,因此值的返回顺序与键从键返回的顺序相同。
答案 1 :(得分:0)
对 subnets
变量使用映射结构而不是数组应该通过索引返回值,然后解决在顺序改变时混合值的问题(比如删除了一个项目):
module "subnets" {
source = "./modules/subnets/"
vpc_id = aws_vpc.main.id
subnets = {
"private-1a" = {
name = "private-1a"
cidr_block = "10.0.0.0/28"
availability_zone = "us-east-1a"
},
"private-1b" = {
name = "private-1b"
cidr_block = "10.0.1.0/24"
availability_zone = "us-east-1b"
},
"public-1a" = {
name = "public-1a"
cidr_block = "10.0.2.0/24"
availability_zone = "us-east-1a"
},
"public-1b" = {
name = "public-1b"
cidr_block = "10.0.3.0/24"
availability_zone = "us-east-1b"
}
}
}
output "private1a" {
value = module.security_subnets.subnet_id["private-1a"]
}
// and so on