构造对象的嵌套循环以创建多个子网



一直在尝试创建多个子网资源,并在某些时候卡住了。下面是代码:

# variables.tf
variable "vpcs" {
type = map(object({
cidr = string
tags = map(string)
tenancy = string
}))
default = {
"RU" = {
cidr = "10.0.0.0/16"
tags = {
"Name" = "RU-VPC"
}
tenancy = "default"
}
"UZ" = {
cidr = "192.168.0.0/16"
tags = {
"Name" = "UZ-VPC"
}
tenancy = "default"
}
}

}
variable "subnets" {
type = map(object({
cidr = string
az = string
tags = map(string)
}))
default = {
"RU-Public-A" = {
az = "us-east-1a"
cidr = "10.0.1.0/24"
tags = {
"Name" = "RU-Public-A"
}
}
"RU-Public-B" = {
az = "us-east-1b"
cidr = "10.0.2.0/24"
tags = {
"Name" = "RU-Public-B"
}
}
"UZ-Public-A" = {
az = "us-east-1a"
cidr = "192.168.1.0/24"
tags = {
"Name" = "UZ-Public-A"
}
}
"RU-Public-B" = {
az = "us-east-1b"
cidr = "192.168.1.0/24"
tags = {
"Name" = "UZ-Public-B"
}
}
}

}
# main.tf
terraform {
required_providers {
aws = {
source  = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
data "aws_availability_zones" "available" {
state = "available"
}

resource "aws_vpc" "main" {
for_each = var.vpcs
cidr_block = each.value["cidr"]
instance_tenancy = each.value["tenancy"]
tags = each.value["tags"]

}
resource "aws_internet_gateway" "main" {
for_each = aws_vpc.main
vpc_id = each.value.id
tags = {
"Name" = "${each.key}-IGW"
}

}
resource "aws_subnet" "public" {

}

因此,我能够创建多个vpc并使用循环将Internet网关连接到它们。但是对于子网,我有一个问题,因为我不知道如何实现对象的嵌套循环。在谷歌上搜索,但没有找到类似的问题。

任何帮助或提示将不胜感激。谢谢你。

您的subnets具有次优设计导致你的问题。如果按照下面的格式来写会好得多,也容易得多:

variable "subnets" {
type = map(map(object({
cidr = string
az = string
tags = map(string)
})))
default = {

RU = {      
"Public-A" = {
az = "ap-southeast-2a"
cidr = "10.0.1.0/24"
tags = {
"Name" = "RU-Public-A"
}
}
"Public-B" = {
az = "ap-southeast-2b"
cidr = "10.0.2.0/24"
tags = {
"Name" = "ap-southeast-2b"
}
}
},
UZ = {
"Public-A" = {
az = "ap-southeast-2a"
cidr = "192.168.1.0/24"
tags = {
"Name" = "UZ-Public-A"
}
}
"Public-B" = {
az = "ap-southeast-2b"
cidr = "192.168.2.0/24"
tags = {
"Name" = "UZ-Public-B"
}
}
}
}  
}

那么你就把压扁:

locals {
flat_subnets = merge([
for vpck, vpcv in var.vpcs: {
for subnetk, subnetv in var.subnets[vpck]: 
"${vpck}-${subnetk}" => {
vpc_key = vpck
subnet = subnetv
}
}
]...)
}

并用作:

resource "aws_subnet" "public" {
for_each = local.flat_subnets

vpc_id     = aws_vpc.main[each.value.vpc_key].id
cidr_block = each.value.subnet.cidr
availability_zone = each.value.subnet.az

tags = each.value.subnet.tags
}

最新更新