기준: DOP-C02 시험 가이드오류 제보
Week 5는 CodePipeline의 구조적 설계(Stage/Action/Artifact)에서 출발해, Cross-Account IAM 체인, Lambda/Step Functions/Manual Approval 확장, V2의 동적 기능까지를 다뤘다. 오늘은 이 내용을 시험 시나리오 형식으로 통합한다. 각 문제는 단일 개념이 아니라 여러 개념의 교차점에서 출제된다—실제 DOP-C02가 묻는 방식이다.
💡 관련 이론: DOP-C02 시험의 CodePipeline 문제는 "어떤 기능이 있는가"보다 "어떤 상황에서 무엇을 선택하는가"를 묻는다. 선택 기준의 키워드를 외워두는 것이 효과적이다. "15분 초과" → Step Functions. "Slack 승인" → Manual Approval + Chatbot. "외부 시스템 자동 연동" → EventBridge. "모노레포 경로 필터" → V2 filePaths. "모든 commit 이력 보존" → QUEUED. "마지막 commit만 배포" → SUPERSEDED. "KMS Access Denied" → KMS Key Policy 누락. 이 키워드-답 쌍을 인식하는 훈련이 시험 시간을 줄인다.
CodePipeline의 모든 개념은 "어떤 문제를 어떻게 해결하는가"로 연결된다.
[파이프라인 구조]
Pipeline > Stage > Action > Artifact
- DAG 기반 의존성 표현
- runOrder로 병렬/직렬 제어 (동일 runOrder = 병렬)
- Transition으로 Stage 간 게이트 (비활성화 가능)
- Artifact: S3 + KMS CMK (암호화 필수)
- V1 → V2: 파이프라인 타입, 변수 시스템, 트리거 필터, Execution Mode
[Cross-Account 4종 권한 체인]
1. Pipeline Service Role (Identity Policy: sts:AssumeRole → Spoke Role ARN)
↓
2. Spoke Trust Policy (Resource Policy: Tooling Pipeline Role 허용)
↓
3. Artifact S3 Bucket Policy (Spoke Role에 GetObject/PutObject 허용)
↓
4. KMS Key Policy (Spoke Role에 kms:Decrypt, kms:DescribeKey 허용)
└── 가장 자주 빠지는 것. S3 접근 성공 후 암호화 해제 단계에서 실패
[Action Provider 선택]
Lambda (< 15분, 단순) → put_job_result 필수 → 비동기 패턴
Step Functions (15분+, 복잡) → Saga 패턴, WaitForTaskToken, Parallel
Manual Approval → SNS → Chatbot → Slack → PutApprovalResult
Custom Provider → Poll 기반 → 내부망 시스템 연동
EventBridge → 외부 시스템 (PagerDuty, Jira, Datadog)
[V2 동적 기능]
입력 변수 (Pipeline Variables) → 환경별 재사용, allowedPattern으로 검증
Action Output Variables → #{ActionNamespace.VAR_NAME} 형식
트리거 필터 (filePaths, branches, tags) → 모노레포 서비스 분리
Execution Mode:
- SUPERSEDED: 새 실행이 이전 실행 취소 (기본)
- QUEUED: 순차 실행, 모든 이력 보존
- PARALLEL: 동시 실행, 독립 대상 필요
Stage 조건: beforeEntry (진입 전 게이트), onSuccess (완료 후 게이트)
CDK Pipelines → self-mutating, crossAccountKeys 자동화, Wave 병렬 배포
| 비교 A | 비교 B | 결정 기준 |
|---|---|---|
| runOrder 동일 | runOrder 다름 | Stage 내 병렬 vs 직렬 |
| Action roleArn | Configuration.RoleArn | Action 실행 주체 vs CFN 리소스 생성 주체 |
| SUPERSEDED | QUEUED | 최신만 배포 vs 모든 commit 이력 |
| QUEUED | PARALLEL | 순차 보존 vs 동시 독립 |
| Lambda Invoke | Step Functions Invoke | 15분 이하 단순 vs 복잡/장기 |
| Manual Approval | beforeEntry 조건 | 사람 판단 vs 자동화 게이트 |
| Branch Protection (GitHub) | Manual Approval | 코드 머지 게이트 vs 배포 게이트 |
| CodeStar Notifications | EventBridge | Slack/SNS 알림 vs 범용 이벤트 라우팅 |
| S3 Bucket Policy | KMS Key Policy | 객체 접근 허용 vs 암호화 해제 허용 |
| CAPABILITY_IAM | CAPABILITY_NAMED_IAM | 자동 명명 IAM 리소스 vs 명시적 명명 IAM 리소스 |
| SERVICE_MANAGED StackSet | SELF_MANAGED StackSet | Organizations 연동 자동화 vs 수동 Role 설정 |
⚠️ 함정: 시험에서 쓰이는 "트랩" 선택지 패턴. (1) Cross-Account 배포 KMS 오류 → S3 버킷 정책을 수정하는 선택지가 있어도 KMS Key Policy가 정답인 경우. (2) "15분 초과 작업" → Lambda timeout 연장(불가능, 최대 15분)이 선택지로 등장. (3) "Slack 승인을 시니어 엔지니어만" → Chatbot IAM Role 수정이 선택지로 등장하지만 Chatbot은 사용자별 IAM 매핑 불가. (4) "모든 commit 빌드 + 마지막만 배포" → SUPERSEDED가 선택지로 등장하지만 SUPERSEDED는 이전 commit 빌드를 취소함. 이 트랩을 인식하는 훈련이 필요하다.
4종 권한 체인 트러블슈팅 방법론. 순서대로 확인한다. (1) AssumeRole 성공 여부 → CloudTrail에서 "AssumeRole" 이벤트, errorCode 필드 확인. (2) S3 접근 성공 여부 → CloudTrail에서 "GetObject" 이벤트, accessDenied 여부. (3) KMS 복호화 성공 여부 → CloudTrail에서 "Decrypt" 이벤트, 에러 여부. (4) CloudFormation API 호출 성공 여부 → CloudTrail에서 "CreateStack/UpdateStack" 이벤트. 에러가 발생한 단계의 이전 단계까지는 권한이 있다. 이 방법론으로 KMS 문제를 3번에서 정확히 찾을 수 있다. CloudTrail의
errorCode: AccessDenied와errorMessage: User: ... is not authorized to perform: kms:Decrypt가 명확한 증거다.
주요 AWS 고객들의 CodePipeline 적용 패턴 요약. Netflix: StackSets + Organizations로 1,500개 계정에 Security Baseline 자동 배포. Goldman Sachs: Account Factory 파이프라인, 신규 계정 온보딩 30분 이내. Stripe: Stage 조건(beforeEntry + onSuccess) 4단계 자동 게이트로 배포 사고 70% 감소. Shopify: 서비스 유형별 Execution Mode 차별화(결제 QUEUED, 프론트엔드 SUPERSEDED, 테스트 환경 PARALLEL). Airbnb: Step Functions WaitForTaskToken으로 Slack 승인 시간 2시간 → 15분 단축. 이 사례들이 DOP-C02 시나리오의 실제 배경 맥락이다.
선택지를 클릭하면 정답·해설이 펼쳐집니다.
문제 1
Tooling 계정의 CodePipeline이 Prod 계정에 ECS 서비스를 배포한다. "배포 Action이 IAM Policy 에러 없이 시작됐는데, Artifact 다운로드 단계에서 다음 오류가 발생한다: Client error: KMS key access denied when decrypting artifact". 원인과 해결책은?
문제 2
한 회사가 100개의 마이크로서비스를 단일 Git 저장소(모노레포)에서 관리한다. 각 서비스는 독립적인 CodePipeline을 가지고 있다. shared/auth/의 변경이 모든 100개 파이프라인을 트리거해야 하고, services/checkout/의 변경은 checkout 파이프라인만 트리거해야 한다. 가장 적절한 V2 트리거 구성은?
문제 3
금융 서비스 회사가 "모든 prod 배포는 두 단계의 자동 게이트를 통과해야 한다: (1) 배포 전 error rate 알람이 OK 상태여야 함, (2) 배포 후 5분 동안 error rate 알람이 OK 상태를 유지해야 함. 어느 게이트라도 실패하면 자동 롤백"이라는 요구사항이 있다. 가장 적절한 구현은?
문제 4
한 팀이 "prod 배포를 승인할 수 있는 권한을 시니어 엔지니어에게만 부여하고, 승인은 Slack에서 진행"하는 패턴을 구현하려 한다. AWS Chatbot을 사용할 때 승인 권한을 사용자 수준에서 세밀하게 제어하는 방법은?
문제 5
CodePipeline에서 Step Functions Action을 사용하는 State Machine이 실행 중 "외부 변경 관리 시스템(ServiceNow)의 Change Request가 승인될 때까지 배포를 일시 중단"해야 한다. State Machine이 이 대기를 구현하는 가장 적절한 방법은?
문제 6
CDK Pipelines로 파이프라인을 관리하는 팀이 "프로덕션 배포 전 반드시 Manual Approval이 필요하다"는 요구사항과 "스테이징 배포는 완전 자동"이라는 요구사항을 동시에 만족시키려 한다. CDK Pipelines 코드에서 어떻게 구현하는가?
문제 7
현재 Pipeline이 SUPERSEDED 모드로 동작 중이다. 10개의 commit이 빠르게 push되면 어떤 현상이 발생하는가?
문제 8
한 팀이 멀티 리전 파이프라인을 구성했다. ap-northeast-2에서 빌드하고 us-east-1과 eu-west-1에 동시에 배포한다. 두 리전 배포 Action이 실패하는 경우 확인해야 할 사항은?
문제 9
한 파이프라인에서 Build Action이 여러 마이크로서비스 Docker 이미지를 빌드하고 각 이미지의 태그를 후속 Deploy Action에서 사용해야 한다. V2 Pipeline에서 가장 적절한 방법은?
문제 10
"GitHub Actions로 PR 빌드와 테스트를 실행하고, main 브랜치 머지 시에만 CodePipeline으로 prod 배포"하는 하이브리드 패턴에서 GitHub Actions에서 CodePipeline으로의 핸드오프를 구현하는 가장 보안적이고 단순한 방법은?
문제 11
StackSets의 SERVICE_MANAGED 모드로 50개 계정에 배포 중 다음 에러가 발생한다: "You must be an administrator of an Organization to use this operation." 원인은?
문제 12
한 팀이 "Lambda Invoke Action에서 외부 배포 시스템을 호출하고 완료까지 45분이 걸린다"는 문제에 직면했다. Lambda의 15분 한도를 우회하면서 파이프라인이 45분 완료를 기다리게 하는 방법으로 잘못된 것은?
컨테이너 CI/CD로 넘어간다. ECR의 이미지 스캔과 수명 주기 관리, ECS의 Rolling/Blue-Green 배포 자동화, EKS의 GitOps(ArgoCD/Flux) 패턴, App Runner의 추상화된 컨테이너 서비스—이 네 가지가 Week 6의 축이다. Week 5에서 배운 CodePipeline이 이 모든 것의 오케스트레이터로 계속 등장한다.