본문으로 건너뛰기
hannctl
PDF

case-studies aws-terraform DESIGN.md

AWS 멀티 리전 Terraform 설계 및 구현

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

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 맵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 맵

이 코드가 하는 일: 리전별로 원하는 네트워크 상태를 맵으로 선언합니다. 바깥 키는 리전(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
}
© 2026 Kim JunHyun · Built with Astro · 이 사이트의 인프라도 코드로 관리합니다

↑↓ 이동 · Enter 열기 · Esc 닫기

테마 고르기

사원증을 누르면 그 테마로, 보던 내용과 같은 곳으로 이동합니다. 끌면 흔들리기만 합니다.

처음 화면으로 →