PF-01 · AWS · IaC
AWS 멀티 리전 Terraform
리전별 locals 맵 하나를 고치면 16개 AWS 리전에 같은 인프라가 만들어지는 Terraform 모듈 모음입니다.
- 역할
- 설계 · 구현
- 기간
- 개인 프로젝트 · 2026.11 공개
- CSP
- AWS
- 규모
- 16개 리전 · 모듈 24종 · 예제 3개
- 핵심 기술
- Terraform · AWS · EKS · CloudWatch · AWS Chatbot
- 16
- 리전별 provider 별칭
- 24
- 공개한 Terraform 모듈
- 3
- 검증한 예제
한눈에 보기
문제
같은 형태의 리소스를 여러 리전에 만들어야 했습니다. 리전이 늘수록 복사한 코드가 늘고 리전마다 설정이 달라질 위험이 커졌습니다.
접근
리전별 locals 맵에 원하는 상태를 선언하고 module과 for_each로 일괄 생성합니다. provider는 리전마다 별칭을 두고 같은 role을 assume합니다. for_each가 provider를 동적으로 고를 수 없어 리전별 module 블록은 반복합니다.
결과
변경은 맵 항목 하나로 끝나고, 키가 고정이라 순서를 바꿔도 리소스가 다시 생성되지 않습니다. 모듈 24종에 암호화, IMDSv2, 비공개 S3 같은 기본값을 넣었고 EKS와 알림 예제까지 3종을 공개했습니다.
자세히 보기
리전별 locals 맵
이 코드가 하는 일: 리전별로 원하는 네트워크 상태를 맵으로 선언합니다.
# 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
이 코드가 하는 일: 맵의 항목마다 VPC 모듈을 실행하고 리전 provider를 연결합니다.
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
}배운 점
반복을 줄이는 것만큼 키를 고정하는 것이 중요했습니다. count 대신 for_each를 쓰면 항목 순서가 바뀌어도 리소스가 다시 만들어지지 않습니다.
다음에 개선할 점
CI에서는 예제를 검증만 하고 apply하지 않습니다. 모듈의 변수 설명이 짧은 것도 다음에 고칠 부분입니다.