기준: SOA-C02 시험 가이드오류 제보
Week 6는 CloudFormation을 단순 "인프라 생성 도구"에서 "대규모 조직의 운영 플랫폼"으로 바라보는 주간이었다. Day 1의 템플릿 구조와 스택 라이프사이클에서 시작해, Day 2의 변경 안전 관리(Change Set, Drift, Rollback Trigger), Day 3의 대규모 IaC 패턴(Nested/Cross-Stack/StackSets), Day 4의 자가 서비스와 동적 설정(Service Catalog, AppConfig, AppRegistry)까지 이어졌다.
SOA-C02에서 CloudFormation은 단순 API 암기 문제가 아니다. "어떤 상황에서 어떤 도구를 선택해야 하는가", "이 변경이 Replacement를 유발하는가", "스택이 이 상태일 때 어떤 복구 방법이 가능한가"를 판단하는 능력을 측정한다. 이 복습은 그 판단력을 기르는 데 집중한다.
CloudFormation 운영 플랫폼
============================================================
[Template 구조] [안전한 변경 관리]
- Resources만 필수 - Change Set (dry-run)
- 10개 섹션 (나머지 선택) - Drift Detection (괴리 감지)
- Pseudo Parameters - Rollback Trigger (자동 복구)
- Intrinsic Functions - Stack Policy (수정 차단)
- Dynamic References - Termination Protection
│ │
▼ ▼
[Stack 라이프사이클] [대규모 IaC 패턴]
ROLLBACK_COMPLETE - Nested Stack (모듈화)
→ 삭제 후 재생성 - Cross-Stack (팀 간 공유)
UPDATE_ROLLBACK_FAILED - StackSets (조직 전체)
→ continue-update-rollback - Auto-deployment (신규 계정)
DELETE_FAILED
→ --retain-resources
│ │
▼ ▼
[리소스 보호] [거버넌스 & 동적 설정]
DeletionPolicy: Snapshot/Retain - Service Catalog (자가 서비스)
UpdateReplacePolicy: Snapshot - Launch Constraint (대리 실행)
cfn-signal (readiness 확인) - AppConfig (런타임 설정)
AutoScalingRollingUpdate - AppRegistry (자산 그룹화)
스택 패턴 비교:
| 항목 | Nested Stack | Cross-Stack | StackSets |
|---|---|---|---|
| 관계 | 부모-자식 (cascade 삭제) | 독립 (느슨한 결합) | 한 템플릿 → 멀티 대상 |
| 라이프사이클 | 부모가 자식 통제 | 각자 독립 | StackSet이 일괄 관리 |
| 값 전달 | !GetAtt Stack.Outputs.Key | !ImportValue 'export-name' | Parameters |
| 주요 제약 | 부모 삭제 시 자식도 삭제 | Import 중 Export 변경 불가 | SCP/Permission 충돌 주의 |
| 사용 사례 | 단일 앱 컴포넌트 분리 | 팀 간 VPC/IAM 공유 | 조직 보안/컴플라이언스 표준 |
변경 안전 도구 비교:
| 항목 | Change Set | Drift Detection | Stack Policy | Rollback Trigger |
|---|---|---|---|---|
| 시점 | 업데이트 전 | 사후 상시 점검 | 업데이트 중 | 업데이트 후 |
| 목적 | 변경 내용 미리 확인 | 수동 변경 감지 | 특정 리소스 수정 차단 | 서비스 이상 시 자동 복구 |
| 핵심 출력 | Replacement: True/False/Conditional | MODIFIED/DELETED/IN_SYNC | Allow/Deny | 자동 롤백 시작 |
| 트리거 | 운영자 수동 실행 | cron/수동 | 모든 update-stack | CloudWatch Alarm |
리소스 보호 정책 비교:
| 정책 | 적용 시점 | 보호 대상 | 기본값 |
|---|---|---|---|
DeletionPolicy: Delete | 스택 삭제 시 | 해당 리소스 | Delete (삭제) |
DeletionPolicy: Retain | 스택 삭제 시 | 해당 리소스 | 보존 (삭제 안 됨) |
DeletionPolicy: Snapshot | 스택 삭제 시 | RDS/EBS/ElastiCache | 스냅샷 후 삭제 |
UpdateReplacePolicy: Snapshot | 업데이트로 인한 교체 시 | RDS/EBS | 스냅샷 후 기존 삭제 |
Stack Policy Update:Delete Deny | update-stack 실행 시 | 지정 리소스 | (설정 안 하면 모두 허용) |
| Termination Protection | delete-stack 실행 시 | 스택 전체 | 비활성화 |
거버넌스 서비스 비교:
| 항목 | Service Catalog | AppConfig | AppRegistry |
|---|---|---|---|
| 목적 | IaC 자가 서비스 + 표준 강제 | 런타임 설정 동적 변경 | 애플리케이션 자산 그룹화 |
| 핵심 기능 | Launch Constraint (대리 실행) | 점진 배포 + 자동 롤백 | Application + Attribute Group |
| 트리거 | 사용자 클릭 (Provision) | 설정 변경 배포 시작 | 수동 연결 or 자동 태깅 |
| 검증 | Template Constraint | JSON Schema / Lambda Validator | - |
💡 관련 이론: CloudFormation의 전체 설계는 분산 시스템 이론의 "State Reconciliation" 패턴이다. Kubernetes 컨트롤러가 desired state와 current state를 지속적으로 비교해 수렴시키는 것처럼, CloudFormation은 템플릿(desired state)와 실제 AWS 리소스(current state)의 차이를 계산해 변경 작업을 수행한다. Drift Detection은 이 수렴 루프의 "역방향 검사"다. 운영자가 템플릿 밖에서 리소스를 변경했을 때, 현실이 desired state에서 벗어났음을 감지한다. Leslie Lamport의 "State Machine Replication"(1984) 이론이 이 패턴의 이론적 기반이다.
CloudFormation Template & 스택:
| 실수 | 증상 | 올바른 이해 |
|---|---|---|
ROLLBACK_COMPLETE에서 update-stack 시도 | Stack is not in a valid state 오류 | 삭제 후 재생성만 가능 |
UPDATE_ROLLBACK_FAILED에 delete-stack | 실패 가능 | continue-update-rollback --resources-to-skip |
| cfn-signal Timeout 너무 짧게 설정 | "Failed to receive signal" | yum update만 5~10분, PT15M 이상 권장 |
| RDS MultiAZ 변경이 Replacement인 줄 모름 | 데이터 손실 | Change Set으로 사전 확인 필수 |
| S3 BucketName 변경이 Replacement인 줄 모름 | 버킷과 데이터 삭제 | DeletionPolicy: Retain 설정 후 Change Set 확인 |
| Stack Policy 없으면 "모두 거부" 착각 | 의도치 않은 수정 | Stack Policy 없으면 모두 허용이 기본 |
Nested Stack & Cross-Stack:
| 실수 | 증상 | 올바른 이해 |
|---|---|---|
| 부모 스택 삭제 후 자식 스택도 삭제됨 | 예상치 못한 리소스 삭제 | Nested Stack은 cascade 삭제가 기본 |
| Import 중인 Export 값 변경 시도 | "Export is in use" 오류 | list-imports로 사용 스택 파악 후 먼저 분리 |
!ImportValue 안에 !Sub 중첩 시도 | 템플릿 검증 오류 | ImportValue는 단독 사용만 가능 |
| Nested Stack 자식 템플릿을 직접 접근 | 부모 우회 관리 어려움 | 가급적 부모 스택을 통해 관리 |
StackSets:
| 실수 | 증상 | 올바른 이해 |
|---|---|---|
| SCP 허용 범위 밖 리전에 배포 시도 | Stack Instance 생성 실패 | IAM Policy Simulator로 사전 확인 |
| Stack Instance 없이 StackSet 삭제 시도 | "StackSet is not empty" 오류 | Stack Instance 먼저 삭제 후 StackSet 삭제 |
| FailureTolerance 너무 낮게 설정 | 일부 계정 실패로 전체 중단 | 초기 배포 시 10~15% 설정 |
| Service-Managed에서 수동 IAM Role 생성 | 불필요 + 충돌 가능 | Service-Managed는 Organizations Trusted Access만 필요 |
AppConfig:
| 실수 | 증상 | 올바른 이해 |
|---|---|---|
Alarm treat-missing-data: breaching 설정 | 데이터 없음 = ALARM → 즉시 롤백 | notBreaching 설정 필수 |
| FinalBakeTime 없이 AllAtOnce 사용 | 즉시 100% + 감시 없음 | FinalBakeTime으로 배포 후 모니터링 추가 |
| Validator 없이 잘못된 JSON 배포 | 앱 파싱 에러 | JSON Schema Validator 반드시 추가 |
가상의 사례로, 2024년 물류 스타트업 L사에서 CloudFormation으로 관리하던 RDS 인스턴스의 MultiAZ를 false에서 true로 변경했다. 운영자는 "MultiAZ 활성화는 인플레이스 변경"이라고 알고 있었다. 그러나 해당 인스턴스의 엔진 버전이 함께 업그레이드되는 경우 Replacement가 트리거될 수 있었다. Change Set을 사용했다면 Replacement: Conditional을 보고 추가 확인을 했을 것이다. 결과적으로 RDS가 교체되어 새 엔드포인트가 생겼고, 애플리케이션 연결 설정을 변경하지 못한 서버들이 5분간 DB 접속 실패를 겪었다. 이후 모든 RDS 변경은 반드시 Change Set 확인 + UpdateReplacePolicy: Snapshot 표준이 됐다.
CloudFormation의 Replacement 판단 기준은 AWS 내부 리소스 핸들러(Resource Handler)가 결정한다. CloudFormation Registry에 등록된 각 리소스 타입의 스키마에 각 속성의 "createOnlyProperties", "readOnlyProperties" 등이 정의돼 있다. "createOnlyProperties"에 해당하는 속성을 변경하면 반드시 Replacement가 발생한다. AWS CLI로 aws cloudformation describe-type --type RESOURCE --type-name AWS::RDS::DBInstance를 실행하면 스키마를 확인할 수 있다. 이를 이해하면 "왜 이 속성 변경은 Replacement를 유발하는가"를 외우지 않고도 판단할 수 있다.
시나리오: "스택이 X 상태입니다. 어떻게 해야 하는가?"
Stack 상태별 대응:
ROLLBACK_COMPLETE
→ 삭제 후 재생성. update-stack, continue-update-rollback 불가
UPDATE_ROLLBACK_FAILED
→ continue-update-rollback [--resources-to-skip 문제 리소스]
→ 가장 먼저 이 명령 시도
DELETE_FAILED
→ delete-stack --retain-resources 문제리소스ID
→ 잔여 리소스 수동 정리 후 재삭제
CREATE_FAILED (--on-failure DO_NOTHING 설정 시)
→ 실패 리소스가 남아있어 직접 디버그 가능
→ 디버그 완료 후 반드시 수동 정리
시나리오: "어떤 CFn 패턴을 써야 하는가?"
Q: 하나의 앱을 여러 팀이 각자 배포하는 컴포넌트로 나누고 싶다
→ Nested Stack
Q: 팀 A의 VPC를 팀 B, C, D의 앱 Stack이 공유하고 싶다
→ Cross-Stack Reference (Export/ImportValue)
Q: 50개 계정 모두에 GuardDuty를 배포하고, 신규 계정도 자동 포함하고 싶다
→ StackSets + Service-Managed + AutoDeployment=true
Q: 개발자가 권한 없어도 표준 인프라를 만들 수 있게 하고 싶다
→ Service Catalog + Launch Constraint
시나리오: "데이터 손실 방지"
RDS/ElastiCache 삭제:
DeletionPolicy: Snapshot (Stack 삭제 시 스냅샷)
RDS 업데이트로 인한 교체:
UpdateReplacePolicy: Snapshot (업데이트 중 교체 시 스냅샷)
변경 전 안전 확인:
Change Set → Replacement 필드 확인
Replacement=True 이면 UpdateReplacePolicy 확인
Stack 실수 삭제 방지:
Termination Protection 활성화
특정 리소스 수정 방지:
Stack Policy + Deny Update:Replace/Delete
⚠️ 함정: DeletionPolicy와 UpdateReplacePolicy는 "스택 삭제"와 "업데이트 중 교체"라는 완전히 다른 상황에 적용된다. RDS를 보호하려면 두 가지를 모두 설정해야 한다.
DeletionPolicy: Snapshot만 있고UpdateReplacePolicy가 없으면, 스택 삭제 시에는 스냅샷이 생기지만 업데이트 중 교체가 발생할 때는 기존 RDS가 스냅샷 없이 삭제된다. 시험에서 "RDS 변경 시 데이터 손실을 방지하려면?" 문제의 완전한 답은UpdateReplacePolicy: Snapshot이다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
RDS DB 인스턴스 타입을 db.t3.medium에서 db.r5.large로 변경하려 한다. 데이터 손실 없이 안전한지 어떻게 확인하는가?
문제 2
Stack이 ROLLBACK_COMPLETE 상태다. 동일한 이름으로 Template를 수정해 재배포하려 한다. 올바른 절차는?
문제 3
회사가 Organizations로 50개 계정을 관리한다. 모든 계정에 보안 Baseline(CloudTrail, GuardDuty)을 일괄 배포하고, 앞으로 새로 추가되는 계정도 자동으로 포함되길 원한다. 가장 적합한 솔루션은?
문제 4
운영팀이 Production Stack을 실수로 삭제하는 것을 방지하려 한다. 어떤 방법이 가장 직접적인가?
문제 5
개발자가 IAM에서 RDS 생성 권한이 없는데, 표준 RDS 패키지를 자가 서비스로 프로비저닝하게 하려 한다. 어떻게 구성하는가?
문제 6
Lambda 함수의 Feature Flag를 코드 재배포 없이 점진적으로 토글하고 싶다. 배포 중 에러율이 급증하면 자동으로 이전 설정으로 돌아가야 한다. 가장 적합한 도구와 설정은?
문제 7
누군가 콘솔에서 CloudFormation으로 관리되는 보안 그룹에 0.0.0.0/0:22 규칙을 직접 추가했다. 이 변경을 자동으로 감지해 알림을 받으려면?
문제 8
Cross-Stack Reference에서 Stack A가 VPC ID를 Export하고, Stack B와 Stack C가 !ImportValue로 사용 중이다. Stack A의 VPC ID Export를 다른 VPC로 변경하려 한다. 어떻게 해야 하는가?
문제 9
Stack 업데이트 완료 후 10분 내에 HTTP 5xx 에러율이 급증하면 자동으로 이전 상태로 되돌아가도록 설정하려 한다. 어떤 구성이 필요한가?
문제 10
Template에서 항상 최신 Amazon Linux 2 AMI를 자동으로 사용하고 싶다. 하드코딩이나 Mapping 없이 구현하는 방법은?
문제 11
AppConfig Deployment Strategy에서 FinalBakeTimeInMinutes: 15를 설정했다. AllAtOnce 전략으로 배포했을 때 정확한 동작은?
문제 12
Service Catalog Launch Constraint Role에 Permission Boundary를 설정하는 이유는?
Week 7은 배포·프로비저닝 주간이다. Elastic Beanstalk의 배포 정책(All at Once/Rolling/Immutable/Traffic Splitting), CodeDeploy의 배포 훅과 AppSpec, EC2 Image Builder로 Golden AMI 파이프라인 구축, Launch Template과 Auto Scaling 심화를 다룬다.
SOA-C02에서 배포 정책의 속도/비용/다운타임 트레이드오프는 빈출 주제다. 예: "다운타임 없이 최소 비용으로 배포하려면?" → Rolling. "빠르게 배포하되 문제 시 즉시 롤백 가능하려면?" → Immutable.
💡 관련 이론: 배포 전략은 마틴 파울러(Martin Fowler)가 2010년 정의한 "Deployment Pipeline" 개념의 구체화다. Blue-Green, Canary, Rolling은 트레이드오프가 다른 세 가지 근본 전략이다. AWS 서비스마다 이 전략을 다른 이름으로 구현한다: Beanstalk(Immutable=Blue-Green 유사), CodeDeploy(Blue/Green), AppConfig(Canary), CloudFormation ASG(AutoScalingRollingUpdate). 이름보다 "어떤 메커니즘인가"를 이해하면 어떤 서비스의 문제도 풀 수 있다.