Terraform Stacks: MyCoCo의 Landing Zone 종속성 올바르게 구현
Source: Dev.to
Elevator Pitch
모든 성장하는 플랫폼 팀은 동일한 아키텍처 문제에 직면합니다: 네트워킹, 보안, 아이덴티티와 같은 공유 인프라가 이를 사용하는 애플리케이션과 독립적으로 진화해야 하지만, 이러한 랜딩 존에 대한 변경은 하위 시스템에 예측할 수 없이 파급됩니다. MyCoCo의 플랫폼 팀은 일상적인 네트워킹 업데이트가 47분간의 프로덕션 장애를 일으켰을 때 이 문제를 뼈저리게 체감했습니다. 이제 HCP Terraform에서 일반 제공되는 Terraform Stacks는 랜딩 존 관리를 조정의 악몽에서 자동으로 오케스트레이션되는 의존성 그래프로 전환시켜, 기본 인프라 변경을 안전하고 가시적으로 만들며 모든 소비 애플리케이션에 자동으로 전파합니다.
TL;DR
- 문제: 랜딩 존 변경(네트워킹, 보안, IAM 베이스라인)으로 인해 보이지 않는 의존성이 생겨 플랫폼 팀이 공유 인프라를 업데이트하면 하위 애플리케이션이 깨집니다.
- 해결책: Linked Stacks가 포함된 Terraform Stacks가 랜딩 존 관계를 형식화하고, 기본 인프라가 변경될 때 자동으로 하위 계획을 트리거합니다.
- 효과: MyCoCo는 랜딩 존 업데이트로 인한 갑작스러운 장애를 없애고, 팀 간 조정 시간을 Slack 메시지 몇 시간에서 HCP Terraform 자동 알림 몇 개로 줄였습니다.
- 핵심 구현: 랜딩 존 Stack은
publish_output블록으로 출력을 공개하고, 제품 Stack은upstream_input블록으로 이를 소비하며 자동 변경 전파를 수행합니다. - 요약: 플랫폼 팀이 애플리케이션 팀이 사용하는 공유 인프라를 관리한다면, Linked Stacks는 암묵적 의존성을 명시적이고 자동 오케스트레이션되는 관계로 바꿔줍니다.
The Challenge: When Landing Zone Updates Break Everything
MyCoCo의 아키텍처는 규모가 커지는 모든 플랫폼 팀이 채택하는 패턴을 따랐습니다: 플랫폼 팀이 관리하는 중앙 집중식 랜딩 존을 제품 팀이 Terraform 데이터 소스로 소비합니다. 다섯 개 제품 팀, 세 개 환경, 두 개 리전—표면적으로는 깔끔한 관심사 분리였습니다. 실제로는 보이지 않는 의존성이 곳곳에 있었습니다.
위기는 금요일 오후에 찾아왔습니다. 플랫폼 팀이 일상적인 서브넷 재구성을 푸시했습니다. GitHub Actions는 성공적으로 실행됐고, 테스트도 통과했습니다. 하지만 세 시간 뒤, 지원 팀이 보안 그룹 ID가 재구성된 상태를 참조하는 애플리케이션 업데이트를 배포했습니다. 프로덕션이 47분 동안 다운됐습니다.
“랜딩 존은 안정적인 기반이어야 합니다,” 라고 Sam(시니어 DevOps 엔지니어)이 말했습니다. “하지만 우리는 어떤 제품 Stack이 어떤 출력에 의존하는지 알 방법이 없었기 때문에, 깨질 때까지 깜짝 장애의 원천이 되었습니다.”
Jordan(플랫폼 엔지니어)은 베타 단계부터 Terraform Stacks를 주시해 왔습니다. GA 릴리스에 포함된 Linked Stacks는 MyCoCo가 필요로 하던 바로 그 것이었습니다: 명시적이고 가시적이며 자동으로 조정되는 랜딩 존 의존성.
The Solution: Stacks for Landing Zone Architecture
Terraform Stacks는 세 가지 상호 연결된 개념을 통해 랜딩 존 문제를 해결합니다:
- Components – 재사용 가능한 인프라 정의.
- Deployments – 환경별 인스턴스화.
- Linked Stacks – 교차 Stack 의존성 형식화.
Important: Stacks는 HCP Terraform 전용 기능이며, 오픈소스 Terraform에서는 사용할 수 없습니다. RUM 기반 요금제에서는 관리되는 각 리소스가 청구에 포함됩니다. 특히 많은 하위 소비자가 있는 대규모 랜딩 존을 마이그레이션하기 전에 비용 모델을 명확히 파악하세요.
Components: Reusable Landing Zone Modules
Components는 Terraform 모듈을 재사용 가능한 빌딩 블록으로 감쌉니다. 랜딩 존의 경우 네트워킹, 보안, 아이덴티티 컴포넌트를 한 번 정의한다는 의미입니다:
# landing-zone/components.tfcomponent.hcl
component "vpc" {
source = "./modules/vpc"
inputs = {
environment = var.environment
cidr_block = var.cidr_block
region = var.region
}
providers = {
aws = provider.aws.main
}
}
component "security_baseline" {
source = "./modules/security"
inputs = {
vpc_id = component.vpc.vpc_id
environment = var.environment
}
providers = {
aws = provider.aws.main
}
}
Components는 내부 의존성을 자동으로 해결합니다—security_baseline은 별도 오케스트레이션 스크립트 없이 vpc가 준비될 때까지 기다립니다.
Deployments: Environment Parity Without the Drift
Deployments를 사용하면 Components를 한 번 정의하고, 입력값만 바꿔서 여러 환경에 인스턴스화할 수 있습니다:
# landing-zone/deployments.tfdeploy.hcl
deployment "development" {
inputs = {
environment = "dev"
cidr_block = "10.1.0.0/16"
region = "ca-central-1"
}
}
deployment "production" {
inputs = {
environment = "prod"
cidr_block = "10.0.0.0/16"
region = "ca-central-1"
}
}
두 배포는 정확히 동일한 VPC와 보안 베이스라인 컴포넌트를 실행하지만, 입력값만 다릅니다. 각 배포는 자체 격리된 상태 파일을 유지하므로 한 환경의 변경이 다른 환경에 실수로 영향을 미치지 않습니다.
Payoff: 플랫폼 팀이 VPC 컴포넌트 로직을 업데이트하면 그 변경이 dev와 prod 모두에 일관되게 적용됩니다. 별도 유지보수로 인한 “dev에서는 동작하지만 prod에서는 깨짐” 상황이 사라집니다.
Linked Stacks: The Landing Zone Game‑Changer
Linked Stacks는 취약한 데이터 소스를 명시적이고 자동으로 조정되는 관계로 대체합니다.
랜딩 존 Stack은 하위 소비를 위해 특정 출력을 공개합니다:
# landing-zone/deployments.tfdeploy.hcl (continued)
publish_output "vpc_id" {
description = "Production VPC for application stacks"
value = deployment.production.vpc_id
}
publish_output "private_subnet_ids" {
description = "Private subnets for application workloads"
value = deployment.production.private_subnet_ids
}
제품 Stack은 upstream_input 블록을 사용해 랜딩 존에 대한 명시적 의존성을 선언합니다:
# product-stack/deployments.tfdeploy.hcl
upstream_input "landing_zone" {
type = "stack"
source = "app.terraform.io/mycoco/platform/landing-zone"
}
deployment "production" {
inputs = {
environment = "prod"
vpc_id = upstream_input.landing_zone.vpc_id
subnet_ids = upstream_input.landing_zone.private_subnet_ids
}
}
Critical benefit: 플랫폼 팀이 랜딩 존을 업데이트하면—서브넷 추가, 보안 그룹 수정, 라우팅 변경 등—HCP Terraform이 자동으로 모든 하위 제품 Stack의 플랜을 트리거합니다. “누가 이 변경을 알아야 할까?” 라는 대화가 사라지고, 잊힌 의존성으로 인한 금요일 사고도 사라집니다.
Results: Landing Zone Changes Without Fear
랜딩 존을 Stacks로 마이그레이션한 지 6주가 지난 후 변화는 눈에 띄었습니다:
- 랜딩 존 업데이트가 불안한 Slack 공지에서 일상적인 운영으로 전환되었습니다.
- 네트워킹 변경이 필요할 때마다 HCP Terraform이 자동으로 5개 제품 Stack에 대한 플랜을 큐에 넣고, 제품 팀은 어떤 상위 변경이 자신의 실행을 트리거했는지 정확히 확인합니다.
- 관찰 기간 동안 랜딩 존 드리프트와 관련된 사고 빈도가 0으로 감소했습니다.
- 팀 간 조정 시간은 수시간의 수동 메시징에서 자동 알림 몇 개로 크게 축소되었습니다.
MyCoCo는 이제 랜딩 존 진화를 숨겨진 위험이 아닌 1급 가시적 프로세스로 다루며, 플랫폼과 제품 워크로드 모두를 더 빠르고 안전하게 제공할 수 있게 되었습니다.