如何在Terraform中将多个子网ID列表传递给中转网关VPC附加资源?
解决方案
你可以直接利用Terraform的集合操作函数,从aws_subnet.tgw_subnet资源中提取所有子网ID的列表,无需使用data块。具体来说,使用values()函数将for_each生成的映射型资源转换为列表,再通过[*].id提取每个子网的ID。
修改后的完整配置如下:
provider "aws" { region = "eu-west-1" } variable "tgw_id" { default = "tgw_aa_bb_cc" } variable "vpc" { default = "10.10.0.0/16" } variable "tgw_subnets" { default = ["10.10.1.0/24", "10.10.2.0/24", "10.10.3.0/24"] } variable "availability_zones" { default = ["eu-west-1a", "eu-west-1b", "eu-west-1c"] } resource "aws_vpc" "new_vpc" { cidr_block = var.vpc } resource "aws_subnet" "tgw_subnet" { for_each = toset(var.availability_zones) vpc_id = aws_vpc.new_vpc.id cidr_block = var.tgw_subnets[index(var.availability_zones, each.value)] availability_zone = each.value } resource "aws_ec2_transit_gateway_vpc_attachment" "vpc_attachment" { subnet_ids = values(aws_subnet.tgw_subnet)[*].id transit_gateway_id = var.tgw_id vpc_id = aws_vpc.new_vpc.id }
关键说明
- 因为
aws_subnet.tgw_subnet使用了for_each,它的类型是映射(map),键是每个可用区名称,值是对应子网的资源对象。 values(aws_subnet.tgw_subnet)会把映射中的所有值(子网资源)提取为一个列表。[*].id是Terraform的splat表达式,会遍历列表中的每个子网对象,提取它们的id属性,最终生成一个子网ID的列表,正好满足subnet_ids参数的需求。
内容的提问来源于stack exchange,提问作者pswitch
相关产品推荐
相关产品推荐

