AWS Certified Developer - Associate (DVA-C02) #9 Domain 3-1 배포: CI/CD
#8 암호화와 시크릿으로 보안을 마쳤습니다. 이제 24%를 차지하는 배포 도메인입니다. DVA는 “코드를 어떻게 빌드하고, 어디에 배포하고, 무중단으로 갱신하는가"를 묻습니다. 첫 글은 AWS 개발자 도구(Code 시리즈)의 역할 분담입니다. 이름이 비슷해 헷갈리지만, 각자의 역할은 분명합니다.
Code 시리즈 역할 분담 #
| 도구 | 역할 | 한 줄 |
|---|---|---|
| CodeCommit | 소스 저장소 | 관리형 Git(GitHub 대체) |
| CodeBuild | 빌드,테스트 | 소스를 컴파일,테스트해 아티팩트 생성 |
| CodeDeploy | 배포 | 아티팩트를 EC2/Lambda/ECS에 배포 |
| CodePipeline | 오케스트레이션 | 위 단계들을 잇는 파이프라인 |
| CodeArtifact | 패키지 저장소 | npm,pip,Maven 의존성 저장,공유 |
핵심 구분: CodePipeline은 흐름을 조정하고, CodeBuild는 빌드하고, CodeDeploy는 배포합니다. “빌드는 누가?“는 CodeBuild, “배포는 누가?“는 CodeDeploy, “전체를 잇는 건?“은 CodePipeline입니다.
CodeBuild와 buildspec.yml #
CodeBuild는 빌드 환경(컨테이너)에서 소스를 가져와 명령을 실행하고 아티팩트를 만듭니다. 빌드 정의는 소스 루트의 **buildspec.yml**에 둡니다.
version: 0.2
phases:
install:
commands:
- echo 의존성 설치
pre_build:
commands:
- echo 로그인,준비
build:
commands:
- echo 빌드,테스트 실행
post_build:
commands:
- echo 패키징
artifacts:
files:
- '**/*'- 단계는
install→pre_build→build→post_build순서입니다. - 환경변수로 설정을 주입하며, 민감 값은 Parameter Store,Secrets Manager에서 참조합니다(빌드 로그에 평문 노출 금지).
- 빌드 의존성을 캐시해 빌드 시간을 줄일 수 있습니다.
시험 함정:
buildspec.yml은 기본적으로 소스 루트에 위치합니다. 단계 이름과 순서를 묻는 문항이 나옵니다.
CodeDeploy와 appspec #
CodeDeploy는 아티팩트를 대상에 배포하고, 배포 과정을 **수명 주기 훅(lifecycle hook)**으로 제어합니다. 배포 정의는 appspec.yml(EC2/온프레미스) 또는 appspec.yaml(ECS/Lambda)입니다.
| 배포 대상 | appspec 핵심 | 대표 훅 |
|---|---|---|
| EC2/온프레미스 | 파일 복사 위치 + 훅 스크립트 | BeforeInstall, AfterInstall, ApplicationStart, ValidateService |
| Lambda | 새 버전으로 트래픽 전환 | BeforeAllowTraffic, AfterAllowTraffic |
| ECS | 새 태스크 세트로 전환 | BeforeInstall, AfterAllowTestTraffic 등 |
수명 주기 훅에서 검증 스크립트를 돌려 배포 성공/실패를 판단하고, 실패하면 롤백합니다. 배포 방식(in-place vs blue/green, 카나리/선형)은 #11에서 다룹니다.
CodePipeline #
여러 단계를 연결하는 오케스트레이터입니다. 전형적인 파이프라인은 이렇습니다.
Source(CodeCommit/GitHub) → Build(CodeBuild) → (Test) → Deploy(CodeDeploy/CFN/ECS)- 각 스테이지는 하나 이상의 액션으로 구성되고, 스테이지 사이로 아티팩트가 S3를 통해 전달됩니다.
- 스테이지 사이에 수동 승인(Manual Approval) 액션을 넣어 사람이 검토 후 진행하게 할 수 있습니다.
- 소스 변경을 감지하면(EventBridge/웹훅) 파이프라인이 자동 실행됩니다.
“프로덕션 배포 전에 사람이 승인하게 하라"의 답은 CodePipeline의 수동 승인 액션입니다.
CodeArtifact #
npm,pip,Maven,NuGet 같은 패키지의 관리형 저장소입니다. 외부 공개 저장소(npmjs 등)를 프록시,캐시하고, 조직 내부 패키지를 안전하게 공유합니다. “사내 의존성 패키지를 안전하게 호스팅,공유"의 답입니다.
컨테이너 배포: ECR과 ECS/Fargate #
DVA는 컨테이너 기초도 묻습니다.
- ECR(Elastic Container Registry). Docker 이미지 저장소. CodeBuild가 이미지를 빌드해 ECR에 푸시합니다.
- ECS/Fargate. 컨테이너 실행. Fargate는 서버 관리가 없는 서버리스 컨테이너입니다.
- 배포는 새 태스크 정의를 등록하고 서비스를 갱신하는 방식이며, CodeDeploy로 blue/green 전환도 가능합니다.
시험 출제 패턴 #
- “소스를 컴파일,테스트해 아티팩트를 만드는 단계는?” → CodeBuild.
- “아티팩트를 EC2/Lambda/ECS에 배포하는 단계는?” → CodeDeploy.
- “전체 흐름을 자동으로 잇는 도구는?” → CodePipeline.
- “프로덕션 배포 전 사람이 검토.” → CodePipeline 수동 승인 액션.
- “빌드 단계 정의 파일은?” →
buildspec.yml(소스 루트). - “배포 훅 정의 파일은?” →
appspec. - “사내 npm 패키지를 호스팅,공유.” → CodeArtifact.
- “빌드에서 비밀값을 안전하게 사용.” → Parameter Store/Secrets Manager 참조(로그 노출 금지).
자주 만나는 함정 #
1) CodeBuild와 CodeDeploy 역할 혼동 #
빌드는 CodeBuild, 배포는 CodeDeploy입니다. CodePipeline은 둘을 잇는 상위 흐름입니다.
2) buildspec와 appspec 혼동 #
buildspec.yml은 CodeBuild의 빌드 정의, appspec은 CodeDeploy의 배포 정의입니다.
3) 비밀을 buildspec에 평문으로 #
빌드 환경변수의 민감 값은 시크릿 저장소에서 참조합니다.
정리 #
이번 글에서 잡은 것:
- CodeCommit(소스),CodeBuild(빌드),CodeDeploy(배포),CodePipeline(오케스트레이션),CodeArtifact(패키지)
buildspec.yml(빌드, 소스 루트, install→pre_build→build→post_build)appspec(배포, 수명 주기 훅)- CodePipeline은 스테이지,액션,아티팩트, 수동 승인으로 게이트
- 컨테이너는 ECR + ECS/Fargate
다음: Domain 3-2 IaC와 서버리스 배포 #
배포를 자동화하려면 인프라를 코드로 정의해야 합니다. #10 IaC와 서버리스 배포에서는 CloudFormation 템플릿과 스택, 서버리스 배포를 단순화하는 SAM, 그리고 Elastic Beanstalk의 배포 정책을 정리하겠습니다.