Terraform working with Maps and Sets

Updated April 7, 2024
Created March 2, 2022


This is just sample code and doesn't actually work due to "Elastic IPs are not supported for load balancers with type 'application'"

locals {
  subnet_azs = [
    "eu-west-2a",
    "eu-west-2b",
    "eu-west-2c",
  ]

  eip_count = var.env == "prod" ? length(local.subnet_azs) : 0
}

resource "aws_eip" "cms" {
  count = local.eip_count

  lifecycle {
    prevent_destroy = true
  }
}

resource "aws_default_subnet" "default" {
  for_each = toset(local.subnet_azs)

  availability_zone = each.key
}

resource "aws_lb" "default" {
  name               = "default"
  internal           = false
  load_balancer_type = "application"
  security_groups    = [aws_security_group.lb.id]

  dynamic "subnet_mapping" {
    for_each = aws_default_subnet.default

    content {
      subnet_id     = subnet_mapping.value.id
      allocation_id = var.env == "prod" ? aws_eip.cms[index(local.subnet_azs, subnet_mapping.value.availability_zone)].id : null
    }
  }
}

output "fixed_ip_addresses" {
  description = "For A Record setting"
  value = aws_eip.cms.*.public_ip
}

Comments?