如何通过子网名称获取美国东部区域的正确AWS子网ID?
问题分析与解决方案
问题根源有两个:
data.aws_subnets.selected.id不是子网ID列表——这个属性是数据源自身的标识符(通常返回AWS区域),正确的子网ID列表属性是**ids**(复数形式)。- 当前配置硬编码了子网名称,无法外部传入,不符合你"通过传入子网名称提取ID"的需求。
以下是具体修改步骤:
1. 给data模块添加变量定义
在./data目录下新建variables.tf,定义接收子网名称的变量:
variable "subnet_names" { description = "需要过滤的子网名称列表" type = list(string) }
2. 修改data模块的data.tf
把硬编码的子网名称替换为变量,保留VPC过滤逻辑:
data "aws_vpc" "vpc-id" { filter { name = "tag:Name" values = ["kdt-vpc"] } } data "aws_subnets" "selected" { filter { name = "vpc-id" values = [data.aws_vpc.vpc-id.id] } filter { name = "tag:Name" values = var.subnet_names # 使用外部传入的子网名称列表 } }
3. 修改data模块的outputs.tf
输出正确的子网ID列表(用ids而非id):
output "subnet_ids" { description = "选中的子网ID列表" value = data.aws_subnets.selected.ids }
4. 修改主模块的main.tf
调用data模块时传入目标子网名称:
module "data" { source = "./data" subnet_names = ["kdt-private-subnet-0", "kdt-private-subnet-1"] # 这里传入需要查询的子网名称 } output "subnet_ids" { description = "选中的子网ID列表" value = module.data.subnet_ids }
验证效果
执行terraform apply后,输出会返回包含两个子网ID的列表,而非之前的区域名称。
内容的提问来源于stack exchange,提问作者Dharmarao Katkuri
相关产品推荐
相关产品推荐

