A common scenario: there’s a new deployment you would like to roll out to AWS. Let’s say you pick “us-east-1” as your cloud region. There are multiple availability zones within it:

  • us-east-1a
  • us-east-1b
  • us-east-1c
  • us-east-1d
  • us-east-1e
  • us-east-1f

Suppose you want to pick two of them for your service/app, and you don’t particularly care about which one. How to proceed?

Option #1: Hard-coding

Pick two arbitrary zones and hard-code them.

variable "availability_zones" {
  type    = list(string)
  default = ["us-east-1a", "us-east-1b"]
}

resource "aws_subnet" "private" {
  vpc_id            = aws_vpc.chartmuseum.id
  cidr_block        = element(var.private_subnets, count.index)
  availability_zone = element(var.availability_zones, count.index)
  count             = length(var.private_subnets)
}

Caveat: The paradox of choice, unnecessary decision fatigue.

Option #2: Pick the first two

Use the AWS data source to dynamically find all zones, and pick the first two.

data "aws_availability_zones" "available" {
  state = "available"
}

resource "aws_subnet" "private" {
  vpc_id            = aws_vpc.chartmuseum.id
  cidr_block        = element(var.private_subnets, count.index)
  availability_zone = element(data.aws_availability_zones.available.names, count.index)
  count             = length(var.private_subnets)
}

Note that terraform plan should display the full zone list.

Caveat: Heavily biased towards the first two zones.

Option #3: Random shuffling

Pick two zones at random!

data "aws_availability_zones" "available" {
  state = "available"
}

resource "random_shuffle" "aws_availability_zone_names" {
  input        = data.aws_availability_zones.available.names
  result_count = 2
}

resource "aws_subnet" "private" {
  vpc_id            = aws_vpc.chartmuseum.id
  cidr_block        = element(var.private_subnets, count.index)
  availability_zone = element(random_shuffle.aws_availability_zone_names.result, count.index)
  count             = length(var.private_subnets)
}

Winner: In my opinion, this is the most elegant approach.

random_shuffle will output the selected regions upon running terraform apply.