Amazon DOP-C02: CI/CD 파이프라인 및 배포 전략 — 학습 가이드
다음의 일부입니다: AWS DevOps Engineer Professional DOP-C02 — 학습 가이드. 검증된 답안으로 연습하기: Amazon 시험 허브, 또는 다음에서 시간 제한 모의고사 풀기: ExamRoll.io.
개요
AWS 상의 견고한 CI/CD 시스템은 여러 계정과 리전에 걸쳐 소스 제어, 빌드, 테스트, 아티팩트 거버넌스, 배포 오케스트레이션, 안전한 릴리스 전략을 통합합니다. 핵심 관리형 서비스인 CodeCommit, CodeArtifact, CodeBuild, CodePipeline, CodeDeploy는 서버 유지 관리를 제거하고, IAM 및 KMS와 긴밀하게 통합되며, EC2/Auto Scaling, ECS, Lambda에 대한 blue/green, canary, rolling, in-place 배포를 최고 수준으로 지원합니다. 효과적인 파이프라인은 또한 정밀한 트리거(웹훅, EventBridge, 스케줄), 규율 있는 아티팩트 관리, 속도를 위한 빌드 캐싱, 자동 롤백을 위한 상태 경보와 함께 정책 기반의 트래픽 전환에 의존합니다. 엔터프라이즈 환경에서는 교차 계정 및 교차 리전 패턴이 필수적이며, 역할 수임, 리전별 아티팩트 스토어, 일관된 암호화 정책이 필요합니다.
AWS 개발자 도구를 사용한 오케스트레이션
CodeCommit을 비공개 고가용성 Git 서비스로 사용하세요. 리포지토리 및 풀 리퀘스트 이벤트에 대해 EventBridge와 통합되고, 승인 규칙 템플릿을 지원하며, 세분화된 권한 부여를 위해 IAM을 사용합니다. 타사 Git(GitHub/Bitbucket)의 경우, 거의 실시간에 가까운 트리거를 위해 웹훅을 사용하여 CodePipeline 소스 작업을 구성하세요.
CodeArtifact는 여러 에코시스템(npm, Maven, PyPI, NuGet)의 패키지 관리를 중앙 집중화합니다. 캐싱을 통해 퍼블릭 레지스트리에 대한 업스트림 연결, 리포지토리별 KMS 암호화, 자동으로 만료되는 범위 지정 인증 토큰을 지원합니다. 수명이 긴 보안 암호를 포함하지 않고 패키지 관리자를 구성하려면, pre_build 단계에서 aws codeartifact login을 호출하여 CodeBuild에 통합하세요.
CodeBuild는 워커 관리 없이 임시 컨테이너화된 빌드를 제공합니다. 주요 기능은 다음과 같습니다:
- 환경 격리 및 프라이빗 종속성을 위한 VPC 지원. Docker 빌드를 위해 권한 모드를 활성화하고, 이미지 빌드 속도를 높이기 위해 로컬 Docker 계층 캐싱을 활성화하세요.
- 세 가지 소스에서 환경 변수 가져오기: 일반 텍스트, SSM Parameter Store, Secrets Manager (기본적으로 안전하며, 하드코딩된 보안 암호 없음). CodePipeline에서 변수를 전달할 수도 있습니다.
- 빌드 시간을 줄이기 위한 캐싱:
- 로컬 캐싱: 소스 캐시, Docker 계층 캐시, 빌드 호스트의 사용자 지정 디렉터리.
- S3 캐싱: 여러 빌드 간에 공유되는 재사용 가능한 종속성 세트.
- 아티팩트 관리:
primaryArtifacts및secondaryArtifacts를 지정하여 여러 출력(예: 앱 번들 및 CloudFormation 템플릿)을 게시합니다. KMS 키로 아티팩트를 암호화하고 퍼블릭 ACL을 피하세요. - 보고: CloudWatch Logs/S3로 로그를 전송합니다. 테스트 결과에는 보고서를 사용하고 PR 피드백에는 CodeBuild 배지를 사용하세요.
CodePipeline은 오케스트레이터입니다. 병렬 또는 순차적으로 실행할 수 있는 작업(action)으로 스테이지(소스, 빌드, 테스트, 배포, 승인)를 정의합니다. 모범 사례는 다음과 같습니다:
- 트리거:
- GitHub/Bitbucket 소스를 위한 웹훅.
- CodeCommit 브랜치 변경을 위한 EventBridge 규칙. 파이프라인 시작에 실패하면 규칙이 존재하는지 확인하세요.
StartPipelineExecution을 호출하는 EventBridge 스케줄 규칙을 통한 예약된 파이프라인.
- 아티팩트 스토어: 파이프라인에서 사용하는 리전당 하나의 S3 버킷. 고객 관리형 KMS 키를 사용하세요. 교차 리전 작업의 경우, 리전별 아티팩트 스토어를 추가하세요.
- 거의 실시간 알림을 위해 채팅/웹훅을 통합하는 SNS 또는 EventBridge를 사용한 수동 승인.
- 세분화된 IAM: 최소 권한의 파이프라인 서비스 역할. 교차 계정 작업에는 작업별 역할을 수임합니다.
CodeDeploy는 EC2/온프레미스, ECS, Lambda 대상을 지원하는 배포 엔진입니다. 수명 주기 훅, 트래픽 전환, 상태 확인, CloudWatch 경보를 통한 자동 롤백을 관리합니다. EC2 인스턴스에 CodeDeploy 에이전트가 실행되고, 인스턴스 프로파일이 있으며, CodeDeploy 엔드포인트로의 아웃바운드 연결(또는 NAT를 통한 이그레스)이 가능한지 확인하세요. 건너뛴 이벤트와 아무 작업도 하지 않는(no-op) 배포는 종종 에이전트/권한/연결 문제를 나타냅니다.
배포 전략 및 CodeDeploy 수명 주기
위험, 용량, 플랫폼에 따라 전략을 선택합니다:
- 인플레이스(In-place) (EC2/온프레미스): 기존 인스턴스에서 앱을 업데이트합니다. OneAtATime, HalfAtATime 또는 AllAtOnce 배포 구성과 결합합니다. ELB를 연결하여 인스턴스의 연결을 드레이닝하고 다시 등록합니다.
- 롤링(Rolling) (ECS): 동일한 서비스에서 태스크를 배치 단위로 교체합니다. 네이티브 ECS 롤링 또는 제어된 전환을 사용하는 블루/그린 방식으로 CodeDeploy를 통해 관리할 수 있습니다.
- 블루/그린(Blue/green):
- EC2/Auto Scaling: 그린(green) ASG를 프로비저닝하고 검증한 다음, 블루(blue)에서 그린으로 트래픽을 전환합니다. 선택적으로 블루 환경을 종료하거나 유지할 수 있습니다.
- ECS: 두 번째 대상 그룹 뒤에 교체 태스크 세트를 생성하고 검증한 다음, 리스너를 전환합니다.
- Lambda: 별칭(alias) 트래픽을 새 함수 버전으로 전환하고 모니터링합니다.
- 카나리(Canary): 먼저 적은 비율(예: 10%)의 트래픽을 전환하고, 일정 시간 동안 관찰한 후 완료합니다.
- 선형(Linear): 동일한 단계로 트래픽을 증분시킵니다(예: 5분마다 10%).
CodeDeploy의 appspec.yml은 무엇을 설치하고 언제 스크립트를 실행할지 정의합니다:
- EC2/온프레미스용 (YAML):
- files: 파일을 위치시킬 경로.
- permissions: 사용자 지정 스크립트 없이 파일 소유권/모드를 업데이트합니다.
- hooks (공통): ApplicationStop, BeforeInstall, Install, AfterInstall, ApplicationStart, ValidateService.
- 트래픽 제어 후크 (로드 밸런서 사용 시): BeforeBlockTraffic, AfterBlockTraffic, BeforeAllowTraffic, AfterAllowTraffic.
- 사전 정의된 환경 변수(예: DEPLOYMENT_GROUP_NAME, DEPLOYMENT_ID, LIFECYCLE_EVENT)를 사용하여 별도의 리비전 없이 동작을 동적으로 수정할 수 있습니다. 예를 들어 배포 그룹별로 Apache 로그 레벨을 토글할 수 있습니다.
- ECS용:
- resources: TaskDefinition 및 LoadBalancerInfo를 포함하는 TargetService.
- hooks: BeforeInstall, AfterInstall, AfterAllowTestTraffic, BeforeAllowTraffic, AfterAllowTraffic.
- AfterAllowTestTraffic는 테스트 리스너를 사용하여 그린 태스크 세트에 대한 스모크/통합 테스트를 수행하는 데 이상적입니다.
- Lambda용:
- resources는 전환할 함수, 버전, 별칭(alias)을 정의합니다.
- hooks: BeforeAllowTraffic 및 AfterAllowTraffic.
트래픽 전환 및 롤백:
- 배포 구성을 설정합니다:
- Lambda/ECS: Canary10Percent15Minutes, Canary10Percent5Minutes, Linear10PercentEvery1Minute, AllAtOnce 또는 사용자 지정 구성.
- EC2 블루/그린: 로드 밸런서 리스너/대상 그룹을 통해 한 번에(all-at-once), 카나리(canary) 또는 선형(linear) 방식으로 트래픽을 리디렉션합니다.
- 배포 그룹에 CloudWatch 경보를 추가하여 오류, 5xx 또는 사용자 지정 지표 발생 시 자동 롤백을 수행합니다. ECS의 경우 경보가 대상 그룹의 5xx 또는 서비스 지표를 감시할 수 있고, Lambda의 경우 별칭/버전 차원을 사용하여 함수 오류/조절(Errors/Throttles)을 감시할 수 있습니다.
- 수명 주기 후크(예: AfterAllowTestTraffic)를 사용하여 Lambda 또는 SSM을 통해 검증을 실행합니다. 0이 아닌 종료 코드가 반환되면 롤백이 발생합니다.
EC2, ECS, Lambda를 위한 블루/그린 및 트래픽 전환
EC2/Auto Scaling:
- CodeDeploy를 사용한 블루/그린 배포는 그린(green) 환경을 위해 새 Auto Scaling 그룹을 프로비저닝하고, 이를 별도의 대상 그룹에 연결한 다음, ALB 리스너를 전환합니다. 블루 환경을 자동으로 종료하거나 빠른 롤백을 위해 유지하도록 선택할 수 있습니다.
- EC2에서의 인플레이스(in-place) 배포의 경우, ELB와 결합하여 인스턴스를 정상적으로 등록 취소/재등록하고 가용성을 보호합니다. 배포 구성은 배치 크기와 진행 속도를 결정합니다.
ECS:
- CodeDeploy는 ALB 뒤에 있는 두 개의 대상 그룹을 사용하여 ECS 서비스와 통합됩니다. 새 태스크 정의로 교체용 태스크 세트(그린)가 생성됩니다.
- 테스트 트래픽은 전용 테스트 리스너를 통해 그린 대상 그룹으로 흐르며, 프로덕션 트래픽은 승격될 때까지 블루에 유지됩니다.
- 카나리 또는 선형 전환은 CloudWatch 경보를 모니터링하면서 트래픽을 그린으로 점진적으로 이동시킵니다. 프로덕션으로 전환하기 전에 AfterAllowTestTraffic 후크를 사용하여 검증(예: 가상 확인을 호출하는 Lambda 함수)을 실행합니다.
Lambda:
- CodeDeploy는 가중치 기반 라우팅을 사용하여 함수 별칭(alias)을 새 버전으로 업데이트합니다. 카나리 및 선형 패턴은 트래픽 비율을 점진적으로 이동시킵니다. 별칭에 대한 CloudWatch 경보는 자동 롤백을 트리거합니다.
- AWS SAM 또는 CDK를 사용하면 템플릿에서 AutoPublishAlias 및 DeploymentPreference를 설정하여 함수별 카나리/선형 정책 및 경보를 코드화할 수 있습니다.
CodeDeploy를 넘어서는 가중치 기반 라우팅:
- 다중 리전 또는 다중 스택 로드 밸런싱을 위해, Route 53의 상태 확인 기능이 있는 가중치 레코드는 리전 간 트래픽 분산(예: 보조 리전으로 1% 전송) 및 장애 조치를 제공합니다. 이는 CodeDeploy의 서비스별 트래픽 전환 기능을 대체하는 것이 아니라 보완합니다.
다중 계정 및 다중 리전 배포
엔터프라이즈 파이프라인은 일반적으로 중앙 집중식 “툴링(tooling)” 계정에 위치하며, 여러 리전에 걸쳐 개발/테스트/프로덕션 계정에 배포합니다.
- 계정 간(Cross-account):
- CodePipeline 작업에서 파이프라인 역할의 보안 주체(principal)를 신뢰하는 대상 계정의 RoleArn을 지정합니다. 각 작업(CloudFormation, CodeDeploy, ECS, Lambda)에 대해 최소 권한 원칙을 사용합니다.
- 대상 계정 리소스에 액세스해야 하는 CodeBuild의 경우, 빌드가 역할을 수임(assume a role) (STS)하거나 작업별 역할(per-account action role)을 사용하도록 하고, 광범위한 AdministratorAccess 권한은 사용하지 않습니다.
- EC2에 CodeDeploy를 사용하는 경우, 대상 계정은 애플리케이션/배포 그룹 및 서비스 역할을 관리하고, 파이프라인은 CreateDeployment를 호출하기 위한 역할을 수임합니다.
- 리전 간(Cross-Region):
- 파이프라인 구성에 리전별 아티팩트 스토어(리전 KMS 키가 있는 S3 버킷)를 추가합니다. 파이프라인 역할과 작업별 역할이 읽고 쓸 수 있도록 버킷 정책을 업데이트합니다.
- 필요한 경우 리전별 아티팩트를 빌드합니다(예: 리전 내 S3 버킷을 대상으로
aws cloudformation package를 사용하여 Lambda 코드 패키징). - 원격 리전의 CloudFormation 배포 작업은 해당 리전의 아티팩트 스토어를 참조해야 하며, 최소 권한 원칙을 위해 대상 계정의 스택 실행 역할을 지정할 수 있습니다.
보안, 아티팩트 및 거버넌스:
- 아티팩트 버킷을 프라이빗으로 유지하고,
authenticated-read와 같은 퍼블릭 ACL을 피합니다. 파이프라인 및 작업 역할로 범위가 지정된 버킷 정책과 KMS 암호화에 의존합니다. - buildspec을 표준화하여 예측 가능하게 아티팩트를 푸시합니다(예: EC2/CodeDeploy용 애플리케이션 번들, ECS용 taskdef.json 및 appspec, Lambda용 패키징된 템플릿).
- EC2에 대한 AMI 사전 빌드(pre-baking)로 불변성(immutability)을 높여 CodeDeploy 에이전트와 기본 런타임이 일관되도록 합니다. 이는 드리프트(drift)와 배포 시간을 줄입니다.
- EventBridge 규칙을 사용하여 파이프라인 이벤트를 알림, 챗옵스(chat ops) 또는 티켓팅 시스템으로 미러링하고, 수동 승인(manual gates)을 오케스트레이션합니다.
실용적인 문제 시나리오
Spotify는 혼합된 컴퓨팅 기반(ECS on Fargate, EC2 기반 서비스, Lambda)을 사용하는 수백 개의 마이크로서비스 전반에 걸쳐 더 안전한 릴리스가 필요합니다. 프로덕션 트래픽을 받기 전 자동화된 테스트를 포함한 카나리(canary) 및 블루/그린(blue/green) 배포, 아티팩트 거버넌스, 다중 리전 프로모션이 필요하며, 프로덕션 환경은 별도의 계정에 유지해야 합니다.
- 리포지토리 및 패키지 구축
- 프라이빗 리포지토리에는 CodeCommit을 사용하고, EventBridge 기반의 PR/테스트 자동화를 사용합니다. CodeArtifact는 업스트림 및 KMS 암호화를 통해 npm, Maven, PyPI 종속성을 호스팅하여 공급망(supply-chain) 제어를 표준화합니다. 이유: 중앙 집중식 IAM/KMS 통합이 가능하고, 중요한 리포지토리에 외부 웹훅이 필요 없습니다. CodeArtifact는 캐시되고 선별된 패키지를 제공합니다.
- 빌드 및 테스트
- 서비스별로 VPC 통합, 로컬 캐싱(Docker 레이어 및 소스), Secrets Manager/Parameter Store에서 가져온 환경 변수를 사용하는 CodeBuild 프로젝트를 생성합니다. 이미지를 빌드하여 ECR에 푸시하고, 보조 아티팩트(taskdef.json/appspec.yaml 또는 패키징된 CloudFormation 템플릿)를 생성합니다. 이유: 임시적이고(ephemeral) 격리된 빌드, 강력한 보안 암호 처리, 캐싱을 통한 빠른 주기, 컨테이너와 서버리스 패키징을 모두 지원하는 다중 출력이 가능합니다.
- 파이프라인 오케스트레이션
- 툴링 계정에 중앙 집중식 CodePipeline을 생성하고 소스, 빌드, 단위 테스트, 스테이징 배포, 자동화 테스트, 수동 승인, 프로덕션 배포 단계를 구성합니다. CodeCommit 업데이트 시 EventBridge에서 트리거가 발생하며, 야간 스케줄된 EventBridge 규칙이 통합 테스트를 시작합니다. 이유: 게이트(gate)가 있는 규격화되고(opinionated) 감사 가능한(auditable) 흐름을 제공하며, 이벤트 기반 및 스케줄 기반 실행이 모두 가능합니다.
- 블루/그린 및 카나리 배포
- ECS 서비스는 두 개의 대상 그룹과 카나리 트래픽 전환(shifting)을 사용하는 CodeDeploy 블루/그린 배포를 사용합니다. 검증은
AfterAllowTestTraffic단계에서 계약 테스트(contract test)와 신서틱(synthetic) 검사를 실행하는 Lambda를 통해 수행됩니다. EC2 서비스는OneAtATime을 사용한 인플레이스(in-place) 배포 또는 용량이 허용될 경우 블루/그린 ASG 교체를 사용합니다. Lambda 함수는Canary10Percent15Minutes와 API Gateway의 Errors 및 5xx에 대한 CloudWatch 경보를 사용하여 CodeDeploy로 배포됩니다. 이유: 런타임별 최고 수준의(First-class) 트래픽 제어와 경보 위반 시 자동 롤백으로 고객 영향을 최소화합니다.
- 계정 간 및 리전 간 프로모션
- 파이프라인은 개발/테스트/프로덕션 계정에서 환경별 역할을 수임합니다. us-east-1 및 eu-west-1의 경우, 리전별 아티팩트 스토어와 리전 KMS 키를 구성합니다. CodeBuild는 리전별로 패키징된 템플릿을 생성하고 리전 내 버킷에 아티팩트를 업로드합니다. 각 계정/리전의 CloudFormation 작업은 스택 실행 역할을 사용하고, CodeDeploy 작업은 환경별 애플리케이션/배포 그룹을 대상으로 합니다. 이유: 역할 수임을 통한 최소 권한 원칙과 프로덕션 환경의 강력한 격리, 낮은 운영 오버헤드로 규정을 준수하는 암호화를 구현합니다.
- 아티팩트 거버넌스 및 보안
- 제한적인 정책으로 S3 아티팩트 버킷을 프라이빗으로 강제하고 모든 퍼블릭 ACL을 제거합니다. 컨테이너 이미지와 템플릿에 서명하고, SBOM을 빌드 아티팩트로 저장합니다. IAM 조건 키를 사용하여 프로덕션 작업을 툴링 계정의 파이프라인으로 제한합니다. 이유: 데이터 유출을 방지하고, 출처(provenance)를 개선하며, 공급망(supply-chain) 모범 사례에 부합합니다.
- 관찰 가능성 및 알림
- 모든 배포 그룹에 CloudWatch 경보를 연결합니다. EventBridge 규칙은 CodePipeline 실행 및 승인 이벤트를 SNS 주제와 Slack에 게시하는 Lambda로 전달합니다. 이유: 더 빠른 피드백, 자동화된 롤백, 그리고 필요한 경우 사람이 개입하는(human-in-the-loop) 승인이 가능합니다.
이 설계는 이기종 런타임을 단일 관리형 툴체인으로 통합하고, 자동화된 검증을 통해 안전한 롤아웃 전략을 제공하며, 자체 호스팅 CI/CD 인프라를 제거하여 유지 관리를 줄이고, 명확한 직무 분리를 통해 전 세계적으로 확장됩니다.
이 문제 연습하기 → · ExamRoll.io에서 시간 제한 연습 →
Pass the whole exam — not just this question
You found this answer. Get every verified question and explanation in one place, and save hours of prep. Free to start.
시험 합격하기 →