Skip to main content

Module: multi-az-subnets

Terraform module for multi-AZ subnets provisioning.

The module creates private and public subnets in the provided Availability Zones.

The public subnets are routed to the Internet Gateway specified by var.igw_id.

nat_gateway_enabled flag controls the creation of NAT Gateways in the public subnets.

The private subnets are routed to the NAT Gateways provided in the var.az_ngw_ids map.

If you are creating subnets inside a VPC, consider using cloudposse/terraform-aws-dynamic-subnets instead.

Screenshots

terraform-aws-multi-az-subnets Example of terraform apply outputs

Usage

locals {
public_cidr_block = cidrsubnet(var.cidr_block, 1, 0)
private_cidr_block = cidrsubnet(var.cidr_block, 1, 1)
}

module "vpc" {
source = "cloudposse/vpc/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
stage = var.stage
name = var.name
cidr_block = var.cidr_block
}

module "public_subnets" {
source = "cloudposse/multi-az-subnets/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
stage = var.stage
name = var.name
availability_zones = ["us-east-2a", "us-east-2b", "us-east-2c"]
vpc_id = module.vpc.vpc_id
cidr_block = local.public_cidr_block
type = "public"
igw_id = module.vpc.igw_id
nat_gateway_enabled = "true"
}

module "private_subnets" {
source = "cloudposse/multi-az-subnets/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
stage = var.stage
name = var.name
availability_zones = ["us-east-2a", "us-east-2b", "us-east-2c"]
vpc_id = module.vpc.vpc_id
cidr_block = local.private_cidr_block
type = "private"

az_ngw_ids = module.public_subnets.az_ngw_ids
}

Examples

Given the following configuration

module "vpc" {
source = "cloudposse/vpc/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
name = "vpc"
stage = var.stage
cidr_block = var.cidr_block
}

locals {
public_cidr_block = cidrsubnet(module.vpc.vpc_cidr_block, 1, 0)
private_cidr_block = cidrsubnet(module.vpc.vpc_cidr_block, 1, 1)
}

module "public_subnets" {
source = "cloudposse/multi-az-subnets/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
stage = var.stage
name = var.name
availability_zones = ["us-east-2a", "us-east-2b", "us-east-2c"]
vpc_id = module.vpc.vpc_id
cidr_block = local.public_cidr_block
type = "public"
igw_id = module.vpc.igw_id
nat_gateway_enabled = "true"
}

module "private_subnets" {
source = "cloudposse/multi-az-subnets/aws"
# Cloud Posse recommends pinning every module to a specific version
# version = "x.x.x"

namespace = var.namespace
stage = var.stage
name = var.name
availability_zones = ["us-east-2a", "us-east-2b", "us-east-2c"]
vpc_id = module.vpc.vpc_id
cidr_block = local.private_cidr_block
type = "private"
az_ngw_ids = module.public_subnets.az_ngw_ids
}

output "private_az_subnet_ids" {
value = module.private_subnets.az_subnet_ids
}

output "public_az_subnet_ids" {
value = module.public_subnets.az_subnet_ids
}

the output Maps of AZ names to subnet IDs look like these

public_az_subnet_ids = {
us-east-2a = subnet-ea58d78e
us-east-2b = subnet-556ee131
us-east-2c = subnet-6f54db0b
}
private_az_subnet_ids = {
us-east-2a = subnet-376de253
us-east-2b = subnet-9e53dcfa
us-east-2c = subnet-a86fe0cc
}

and the created subnet IDs could be found by the AZ names using map["key"] or lookup(map, key, [default]),

for example:

public_az_subnet_ids["us-east-2a"]

lookup(private_az_subnet_ids, "us-east-2b")