You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 04:05:25