使用 Terraform 按可用区域的顺序创建多个子网

问题描述 投票:0回答:2

Terraform 新手,并尝试使用 DRY 方法从 Adrian Cantril 的类创建以下 VPC。

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]

amazon-web-services terraform subnet cidr availability-zone
2个回答
2
投票

这应该很干:

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

请参阅 setproductfor statements 以了解

locals.subnets
中发生的情况。

相关说明,在学习时尝试从头开始创建 VPC 和子网是个好主意,但如果您进入生产阶段,我建议使用此 Terraform VPC 模块 - https://registry.terraform .io/modules/terraform-aws-modules/vpc/aws/latest.


0
投票

我认为有一个更简单的方法可以实现这一点:

# 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]

}

© www.soinside.com 2019 - 2024. All rights reserved.