Terraform中从多状态文件提取VPC ID并生成字符串列表
从混合状态文件提取VPC ID并配置Route53 Zone
1. 提取VPC ID到本地列表
修改locals.tf,新增all_vpc_ids定义,针对不同状态文件的输出结构分别处理:
locals { aws_regions = toset(["eu-west-1", "eu-central-1", "us-east-2", "us-west-2", "ap-south-1", "ap-southeast-1"]) terraform_state_file = "eu-west-1/terraform.tfstate" # 提取所有区域的VPC ID列表 all_vpc_ids = flatten([ for region in local.aws_regions : # 处理eu-west-1的Terraform状态文件(单个VPC ID) region == "eu-west-1" ? [data.terraform_remote_state.plt-network-state[region].outputs.dev_vpc_id] : # 处理其他区域的Terragrunt状态文件(从vpcs_all数组提取所有id) [for vpc in data.terraform_remote_state.plt-network-state[region].outputs.vpcs_all : vpc.id] ]) # 若仅需特定环境(如dev)的VPC ID,替换上面的all_vpc_ids为: # all_vpc_ids = compact(flatten([ # for region in local.aws_regions : # region == "eu-west-1" ? [data.terraform_remote_state.plt-network-state[region].outputs.dev_vpc_id] : # [for vpc in data.terraform_remote_state.plt-network-state[region].outputs.vpcs_all : # vpc.environment == "dev" ? vpc.id : null] # ])) }
2. 在Route53 Zone中使用dynamic VPC块
配置aws_route53_zone资源,通过dynamic "vpc"块遍历生成的VPC信息,自动关联多区域VPC:
场景1:每个区域仅关联一个VPC
resource "aws_route53_zone" "example" { name = "example.com." dynamic "vpc" { for_each = { for region in local.aws_regions : region => { id = region == "eu-west-1" ? data.terraform_remote_state.plt-network-state[region].outputs.dev_vpc_id : data.terraform_remote_state.plt-network-state[region].outputs.vpcs_all[0].id } } content { vpc_id = vpc.value.id vpc_region = vpc.key } } }
场景2:每个区域需关联多个VPC
resource "aws_route53_zone" "example" { name = "example.com." dynamic "vpc" { for_each = flatten([ for region in local.aws_regions : region == "eu-west-1" ? [ { id = data.terraform_remote_state.plt-network-state[region].outputs.dev_vpc_id region = region } ] : [ for vpc in data.terraform_remote_state.plt-network-state[region].outputs.vpcs_all : { id = vpc.id region = region } ] ]) content { vpc_id = vpc.value.id vpc_region = vpc.value.region } } }
验证与调试
可以通过terraform console查看生成的VPC ID列表是否符合预期:
terraform console > local.all_vpc_ids
内容的提问来源于stack exchange,提问作者user3616775
相关产品推荐
相关产品推荐

