본문으로 건너뛰기
프로젝트 목록

PF-01 · AWS · IaC

AWS 멀티 리전 Terraform

리전별 locals 맵 하나를 고치면 16개 AWS 리전에 같은 인프라가 만들어지는 Terraform 모듈 모음입니다.

역할
설계 · 구현
기간
개인 프로젝트 · 2026.11 공개
CSP
AWS
규모
16개 리전 · 모듈 24종 · 예제 3개
핵심 기술
Terraform · AWS · EKS · CloudWatch · AWS Chatbot
GitHub
16
리전별 provider 별칭
24
공개한 Terraform 모듈
3
검증한 예제

한눈에 보기

provider 별칭 16개, 같은 assume_roleus-west-2us-west-1us-east-2us-east-1sa-east-1ap-south-1ap-southeast-1ap-southeast-2ap-northeast-3ap-northeast-2ap-northeast-1eu-north-1eu-west-1eu-west-2eu-west-3eu-central-1assume_role모든 리전에서 같은 role_arn16개 리전 · 모듈 24종 · 리전별 locals 맵
리전을 늘려도 수정할 곳은 locals 맵 항목과 리전별 module 블록입니다.

문제

같은 형태의 리소스를 여러 리전에 만들어야 했습니다. 리전이 늘수록 복사한 코드가 늘고 리전마다 설정이 달라질 위험이 커졌습니다.

접근

리전별 locals 맵에 원하는 상태를 선언하고 module과 for_each로 일괄 생성합니다. provider는 리전마다 별칭을 두고 같은 role을 assume합니다. for_each가 provider를 동적으로 고를 수 없어 리전별 module 블록은 반복합니다.

결과

변경은 맵 항목 하나로 끝나고, 키가 고정이라 순서를 바꿔도 리소스가 다시 생성되지 않습니다. 모듈 24종에 암호화, IMDSv2, 비공개 S3 같은 기본값을 넣었고 EKS와 알림 예제까지 3종을 공개했습니다.

자세히 보기

리전별 locals 맵locals { networks = { seoul = { demo-seoul = { cidr_block = "10.0.0.0/16" subnets = [ ... ] } } }}for_eachVPCcidr_blockSubnetsubnets 목록Security Group규칙 맵을 for_each로EC2 / EKS서비스별 인스턴스와 노드 그룹맵 한 칸을 더하면 리소스가 그만큼 늘어납니다
키가 고정되어 있어 항목 순서를 바꿔도 다시 생성되지 않습니다.
EKS 1.32public + private 엔드포인트 · 허용 대역만ingamer7i.xlarge × 5battlem7i.large × 2mergem7i.large × 2r7i.xlarger7i.xlarger7i.xlarger7i.xlarger7i.xlargem7i.largem7i.largem7i.largem7i.largelabels = { "app/role" = 서비스 이름 }
노드 라벨로 서비스를 구분해 워크로드가 자기 노드 그룹에 올라갑니다.

리전별 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하지 않습니다. 모듈의 변수 설명이 짧은 것도 다음에 고칠 부분입니다.

Open to work · 클라우드 인프라/보안