본문으로 이동
Kim Jongwon
← 전체 프로젝트

Terraform | MSP 8기 교육 미션 | 선택 심화 | 2026.04.09 - 2026.04.10

AWS Terraform Module Refactoring

한 파일에 모인 Terraform을 모듈과 dev/prod 환경으로 나눈 교육 미션

한 곳에 모인 Terraform 코드를 4개 모듈과 dev/prod 환경으로 나누고, 모듈끼리 출력값을 직접 연결했습니다.

모듈

4개

네트워크, 비밀값, 메시징, 캐시

환경

dev/prod

상태 파일과 변수 분리

연결

출력 → 입력

모듈끼리 값 직접 전달

Terraform 모듈 구성

미션 1~4를 모듈 4개로 재구성

한 곳에 모인 자원을 모듈로 나누고 dev/prod 환경에서 불러 씁니다.

M1

Foundation

VPC, Subnet, NAT, SG, IAM

M2

Secrets

SSM Parameter Store, Secrets Manager

M3

Messaging

SNS 발행, SQS 대기열, DLQ

M4

Cache

ElastiCache Redis, TLS, AUTH

M5

Modular

모듈 + dev/prod 환경으로 재구성

environments/dev

NAT 1개, cache.t3.micro, state key: dev

environments/prod

NAT 2개, cache.r6g.large, state key: prod

선택 심화 과제의 모듈 구성과 출력 연결

과제 배경

모듈로 나눈 이유

리소스가 한 파일에 모여 있으면 어떤 값이 어디서 오는지, dev와 prod가 무엇이 다른지 코드만 봐서는 알기 어렵습니다. 모듈 경계와 환경 차이를 코드에 드러내는 것이 목표였습니다.

직접 한 일

  • 기본 미션 1~4의 Terraform 자원을 작성하고 자원별 출력값을 정의했습니다.
  • 선택 심화에서 네트워크, 비밀값, 메시징, 캐시 4개 모듈의 입력과 출력을 설계했습니다.
  • dev/prod 루트 모듈을 나누고 환경별 차이를 변수로 명시했습니다.

결과

  • 4개 모듈 + dev/prod 환경 구조로 리팩터링
  • 모듈 출력을 다음 모듈 입력으로 직접 연결
  • dev plan 약 47개 자원 확인, prod와 차이 비교

구현 방식

모듈 연결과 환경 분리

같은 모듈을 dev와 prod에서 다른 값으로 불러 쓰는 방식입니다.

  • 선택 심화(Mission 5)에서 미션 1~4의 자원을 4개 모듈로 나누고, dev/prod 루트 모듈이 같은 모듈을 다른 변수로 호출하게 했습니다.
  • 네트워크, 비밀값 모듈의 출력을 캐시 모듈 입력으로 바로 넘겨, 다른 상태 파일을 읽는 terraform_remote_state 없이 연결했습니다.
  • dev와 prod는 상태 파일 위치, NAT 게이트웨이 수, 메시지 보관 기간, Redis 구성을 다르게 둬 비용과 가용성 차이를 코드로 드러냈습니다.
TerraformAWS modulesS3 BackendElastiCacheSecrets Manager

다이어그램

환경 차이와 모듈 연결

dev/prod 설정 차이와 모듈 출력이 다음 모듈로 넘어가는 구조입니다.

dev와 prod 환경의 state key, NAT gateway, Redis node, message retention 차이를 나타낸 비교표
dev와 prod 환경 설정 비교 원본 보기
networking과 secrets 모듈의 output이 cache 모듈 input으로 전달되는 root module 내부 chaining 구조
모듈 출력 → 다음 모듈 입력 연결 구조 원본 보기

핵심 코드

모듈 출력을 다음 모듈로 넘기는 코드

네트워크, 비밀값 모듈의 출력이 캐시 모듈 입력으로 바로 들어갑니다.

dev 루트 모듈에서 모듈을 연결하는 코드

mission5-modular/environments/dev/main.tf

terraform {
  backend "s3" {
    bucket = "<your-bucket-name>"
    key    = "deepdive/mission5/dev/terraform.tfstate"
    region = "us-east-2"
  }
}

module "networking" {
  source             = "../../modules/networking"
  single_nat_gateway = true
}

module "secrets" {
  source = "../../modules/secrets"
}

module "cache" {
  source = "../../modules/cache"

  private_subnet_ids = module.networking.private_subnet_ids
  sg_redis_id        = module.networking.sg_redis_id
  redis_auth_token   = module.secrets.redis_auth_token

  node_type                = var.cache_node_type
  num_cache_clusters       = var.cache_num_clusters
  apply_immediately        = var.cache_apply_immediately
  snapshot_retention_limit = var.cache_snapshot_retention
}

직접 확인하기

코드와 자료

아래 링크에서 코드, 설계 문서, 실행 기록을 직접 확인할 수 있습니다.

맡은 범위

  • MSP 8기 교육 미션을 혼자 수행했습니다. 모듈 경계, 환경별 변수, 모듈 간 출력 연결 코드를 직접 작성했습니다.

범위와 한계: 교육 미션 범위에서 validate, plan과 문서로 확인한 결과입니다.