AWS 멀티 리전 Terraform 설계 및 구현
리전별 locals 맵 하나를 고치면 16개 AWS 리전에 같은 인프라가 만들어지는 Terraform 모듈 모음입니다.
리전별 locals 맵
이 코드가 하는 일: 리전별로 원하는 네트워크 상태를 맵으로 선언합니다. 바깥 키는 리전(seoul), 그 안의 키는 VPC 이름(demo-seoul)이고, 값에는 VPC의 CIDR과 서브넷 목록(이름, CIDR, 가용 영역, 공인 IP 자동 할당 여부)이 들어갑니다. 리전이나 VPC를 늘릴 때는 이 맵에 항목 하나를 더하면 되고, 리소스를 만드는 코드는 바뀌지 않습니다.
# Declare the wanted state per region. Adding a region or a VPC is one more map entry.
locals {
networks = {
seoul = {
demo-seoul = {
cidr_block = "10.0.0.0/16"
subnets = [
{ subnet_name = "demo-seoul-a", subnet_cidr = "10.0.1.0/24", ipv6_cidr_block = null, availability_zone = "ap-northeast-2a", autoassign_public = "false", tags = {} },
{ subnet_name = "demo-seoul-c", subnet_cidr = "10.0.2.0/24", ipv6_cidr_block = null, availability_zone = "ap-northeast-2c", autoassign_public = "false", tags = {} },
]
}
}
맵을 읽는 module과 for_each
이 코드가 하는 일: 서울 리전 맵(local.networks.seoul)의 항목마다 VPC 모듈을 한 번씩 실행합니다. 맵의 키(each.key)가 VPC 이름이 되고, 값(each.value)에서 CIDR과 서브넷 목록을 꺼내 모듈에 넘깁니다. providers로 서울 리전 별칭(aws.seoul)을 연결하므로 이 블록이 만드는 리소스는 모두 서울 리전에 생기고, 키가 리소스의 주소가 되어 맵의 순서를 바꿔도 기존 VPC가 다시 만들어지지 않습니다.
module "seoul_vpc" {
source = "../../modules/vpc"
for_each = local.networks.seoul
providers = { aws = aws.seoul }
vpc_name = each.key
cidr_block = each.value.cidr_block
instance_tenancy = "default"
use_ipv6_cidr_block = false
subnets = each.value.subnets
}