Terraform 新手,并尝试使用 DRY 方法从 Adrian Cantril 的类创建以下 VPC。
我可以创建前 4 个子网,但是当我尝试重复它时,它会在每个 AZ 中重复它,从而给我一个错误。
我尝试了一些其他方法,为每个可用区创建 1 个子网,例如AZ A 中为 10.16.0.0/20,AZ B 中为 10.16.16.0 /20,等等..
下面是我正在使用的代码片段。
variable "vpc_cidr" {
type = string
default = "10.16.0.0/16"
}
resource "aws_subnet" "private_subnets-az-a" {
count = 4
vpc_id = aws_vpc.vpc.id
cidr_block = cidrsubnet(var.vpc_cidr, 4, count.index)
availability_zone = data.aws_availability_zones.available.names[0]
}
resource "aws_subnet" "private_subnets-az-b" {
count = 4
vpc_id = aws_vpc.vpc.id
cidr_block = cidrsubnet(var.vpc_cidr, 4, count.index)
availability_zone = data.aws_availability_zones.available.names[1]
这应该很干:
locals {
region = "us-east-1"
subnets = {
for i, v in setproduct(["a", "b", "c"], ["reserved", "db", "app", "web"]) :
"${local.region}${v[0]}-${v[1]}" =>
{
az = "${local.region}${v[0]}"
cidr = cidrsubnet("10.16.0.0/16", 4, i)
}
}
}
resource "aws_subnet" "this" {
for_each = local.subnets
vpc_id = aws_vpc.vpc.id
cidr_block = each.value.cidr
availability_zone = each.value.az
}
这将根据图创建 12 个子网。
locals.subnets
看起来像这样:
subnets = {
"us-east-1a-reserved" = {
"az" = "us-east-1a"
"cidr" = "10.16.0.0/20"
}
"us-east-1a-db" = {
"az" = "us-east-1a"
"cidr" = "10.16.16.0/20"
}
"us-east-1a-app" = {
"az" = "us-east-1a"
"cidr" = "10.16.32.0/20"
}
"us-east-1a-web" = {
"az" = "us-east-1a"
"cidr" = "10.16.48.0/20"
}
"us-east-1b-reserved" = {
"az" = "us-east-1b"
"cidr" = "10.16.64.0/20"
}
// ... and so on
}
此
for_each
方法比count
变体更有用,因为您可以按如下方式访问创建的子网:aws_subnet.this["us-east-1a-reserved"].arn
而不是aws_subnet.this[3].arn
。
请参阅 setproduct 和 for statements 以了解
locals.subnets
中发生的情况。
相关说明,在学习时尝试从头开始创建 VPC 和子网是个好主意,但如果您进入生产阶段,我建议使用此 Terraform VPC 模块 - https://registry.terraform .io/modules/terraform-aws-modules/vpc/aws/latest.
我认为有一个更简单的方法可以实现这一点:
# Loop up Availability Zones.
data "aws_availability_zones" "available" {}
# Create subnets.
resource "aws_subnet" "default" {
count = 3
vpc_id = aws_vpc.default.id
cidr_block = "10.0.${count.index}.0/24"
availability_zone = data.aws_availability_zones.available.names[count.index]
}