如何用Terraform为AWS每个可用区生成唯一CIDR块?
解决Terraform中每个可用区生成唯一CIDR块的问题
你当前遇到的情况是:循环生成可用区对应的CIDR块时,所有结果都是重复的10.0.101.0/24,但你需要每个可用区对应唯一的子网,比如10.0.101.0/24、10.0.102.0/24这类依次递增的CIDR。
问题根源
你使用的cidrsubnet("10.0.0.0/16", 8, 101)里,第三个参数是固定的子网索引值101,不管循环多少次,生成的都是同一个子网。要让每个可用区对应不同的子网,必须让这个索引值随循环动态变化。
解决方案
修改public_subnets的for循环,引入索引变量,用当前循环的索引 + 初始值101作为cidrsubnet的第三个参数。这样每个可用区会对应递增的子网索引,生成唯一的CIDR块。
修正后的public_subnets代码:
public_subnets = [for idx, az in data.aws_availability_zones.available.names : cidrsubnet("10.0.0.0/16", 8, 101 + idx)]
完整修正后的示例代码
data "aws_ami" "app_ami" { most_recent = true filter { name = "name" values = ["bitnami-tomcat-*-x86_64-hvm-ebs-nami"] } filter { name = "virtualization-type" values = ["hvm"] } owners = ["979382823631"] # Bitnami } data "aws_availability_zones" "available" { state = "available" } module "vpc" { source = "terraform-aws-modules/vpc/aws" name = "my-vpc" cidr = "10.0.0.0/16" azs = data.aws_availability_zones.available.names public_subnets = [for idx, az in data.aws_availability_zones.available.names : cidrsubnet("10.0.0.0/16", 8, 101 + idx)] enable_nat_gateway = true } resource "aws_instance" "blog" { ami = data.aws_ami.app_ami.id instance_type = "t3.nano" vpc_security_group_ids = [module.blog_security_group.security_group_id] tags = { Name = "HelloWorld" } } module "blog_security_group" { source = "terraform-aws-modules/security-group/aws" version = "5.1.0" name = "blog" description = "Allow HTTP and HTTPS from my IP in." vpc_id = data.aws_vpc.default.id ingress_rules = ["http-80-tcp", "https-443-tcp"] ingress_cidr_blocks = ["0.0.0.0/0"] egress_rules = ["all-all"] egress_cidr_blocks = ["0.0.0.0/0"] }
修改后,循环会根据每个可用区的索引(从0开始),依次生成101+0=101、101+1=102、101+2=103等索引的子网,正好匹配你期望的CIDR序列。
内容的提问来源于stack exchange,提问作者David Gard
相关产品推荐
相关产品推荐

