본문으로 건너뛰기
hannctl
PDF

case-studies aws-terragrunt DESIGN.md

AWS Terragrunt DRY IaC 설계 및 구현

Terraform 모듈 16개를 루트 설정 하나로 묶고, Terragrunt가 의존성 그래프를 읽어 순서대로 실행하게 한 구조입니다.

iam_custom_policyiam_useriam_custom_roleiam_groupvpcelastic_ipebsinternet_gatewaysecurity_groupvpc_endpointvpc_peeringelasticache_subnet_groupnat_gatewayroute_tableinstance_profileec2_instance
live/root.hclbackend · provider · 공통 inputslive/dev/account.hcl계정별 값<리전>/region.hcl리전별 값_envcommon/<module>.hclsource · dependency · mock_outputs<리소스>/terragrunt.hcl자기 inputs만 적음backend.tfprovider.tf루트 설정 1개가 복사본 16개를 대체
Terragrunt가 backend.tf와 provider.tf를 생성합니다. 루트 설정 1개가 복사본 16개를 대체합니다.
terragrunt: 모듈 버전 업그레이드 런북$ terragrunt state pull > backup.tfstate$ find . -name '.terragrunt-cache' -type d -prune -exec rm -rf {} +# terraform.source를 새 버전으로 변경$ terragrunt init$ terragrunt state push backup.tfstate$ terragrunt plan# 상태 백업# 캐시 정리# 코드 변경은 이것뿐# 새 모듈 내려받기# 필요할 때만 상태 복원# 변경 없음 확인No changes.
plan이 No changes.를 출력해야 업그레이드가 끝납니다. 변경이 보이면 멈추고 원인을 봅니다.

루트에서 생성하는 provider

이 코드가 하는 일: Terragrunt의 generate 블록이 각 유닛 폴더에 provider.tf 파일을 만들어 넣습니다. 리전은 region 설정에서, Environment 태그는 계정 이름에서 가져오고, 모든 리소스에 ManagedBy = terragrunt 태그를 자동으로 붙입니다. 마지막 줄은 계정 설정과 리전 설정의 locals를 합쳐 모든 유닛의 공통 inputs로 넘기므로, 유닛 파일에는 그 유닛에만 필요한 값만 남습니다.

generate "provider" {
  path      = "provider.tf"
  if_exists = "overwrite_terragrunt"
  contents  = <<PROVIDER
provider "aws" {
  region = "${local.aws_region}"

  default_tags {
    tags = {
      Environment = "${local.account_name}"
      ManagedBy   = "terragrunt"
    }
  }
}
PROVIDER
}

inputs = merge(local.account_vars.locals, local.region_vars.locals)

dependency와 mock_outputs

이 코드가 하는 일: 이 유닛이 옆 폴더의 elastic_ip 유닛에 의존한다고 선언합니다. Terragrunt는 이 선언으로 elastic_ip를 먼저 실행하고, 그 출력(eip_id)을 이 유닛의 입력으로 넘깁니다. 아직 실제 출력이 없을 때는 mock_outputs의 가짜 ID를 쓰되 init, validate, plan 명령에서만 허용하므로, 클라우드 없이 전체를 검증할 수 있으면서도 가짜 값으로 실제 apply가 되는 일은 막습니다.

dependency "elastic_ip" {
  config_path = "${get_terragrunt_dir()}/../elastic_ip"

  mock_outputs = {
    eip_id = {
      "demo-eip-1" = "eipalloc-00000000000000001"
      "demo-eip-2" = "eipalloc-00000000000000002"
    }
  }
  mock_outputs_allowed_terraform_commands = ["init", "validate", "plan"]
}
© 2026 Kim JunHyun · Built with Astro · 이 사이트의 인프라도 코드로 관리합니다

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

테마 고르기

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

처음 화면으로 →