CI/CD: CodeCommit, CodePipeline, CodeBuild
1. CI/CD 개요
🤔 CI/CD가 뭔가요?
비유로 이해하기: CI/CD는 자동 생산 라인입니다.
- 수동: 코드 작성 → 수동 빌드 → 수동 테스트 → 수동 배포 😰
- CI/CD: 코드 푸시만 하면 → 자동으로 빌드/테스트/배포! 🎉
CI vs CD
┌─────────────────────────────────────────────────────────────────┐
│ CI/CD 개념 │
│ │
│ CI (Continuous Integration) - 지속적 통합 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Developer ──push──→ Repository ──trigger──→ Build/Test │ │
│ │ ↑ │ │ │
│ │ └────────────── feedback ────────────────────┘ │ │
│ │ │ │
│ │ • 자주 코드 푸시 (하루 여러 번) │ │
│ │ • 자동 빌드/테스트 │ │
│ │ • 빠른 피드백 → 버그 조기 발견 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ CD (Continuous Delivery/Deployment) - 지속적 배포 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ │ │
│ │ Build/Test ──pass──→ Deploy ──→ Production │ │
│ │ │ │
│ │ • 테스트 통과 시 자동 배포 │ │
│ │ • "3개월에 1번" → "하루 5번" 배포 │ │
│ │ • 빠른 릴리스 사이클 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘AWS CI/CD 서비스 맵
┌─────────────────────────────────────────────────────────────────┐
│ AWS CI/CD 기술 스택 │
│ │
│ Code Build Test Deploy Provision │
│ ┌──────┐ ┌──────┐ ┌──────┐ ┌──────────┐ ┌─────────┐│
│ │Code │ │Code │ │Code │ │CodeDeploy│ │Elastic ││
│ │Commit│──→│Build │───→│Build │────→│ │─→│Beanstalk││
│ │ │ │ │ │ │ │CloudForm │ │ECS/EKS ││
│ │GitHub│ │Jenkins│ │Device│ │ation │ │Lambda ││
│ └──────┘ └──────┘ │Farm │ └──────────┘ └─────────┘│
│ └──────┘ │
│ │
│ ─────────────────── CodePipeline (오케스트레이션) ────────────│
│ │
└─────────────────────────────────────────────────────────────────┘서비스 역할 요약
| 서비스 | 역할 | 비유 |
|---|---|---|
| CodeCommit | 소스 코드 저장 | GitHub |
| CodeBuild | 빌드/테스트 | Jenkins |
| CodeDeploy | 배포 자동화 | 배포 로봇 |
| CodePipeline | 전체 오케스트레이션 | 공장장 |
| CodeArtifact | 패키지 저장소 | npm/Maven 저장소 |
| CodeGuru | 코드 리뷰 자동화 | AI 코드 리뷰어 |
2. AWS CodeCommit
🤔 CodeCommit이 뭔가요?
비유로 이해하기: CodeCommit은 AWS에서 운영하는 GitHub입니다.
- 프라이빗 Git 저장소
- AWS 계정 안에서 코드 보관 (보안 강화)
⚠️ 중요: CodeCommit 서비스 중단 (2024년 7월 25일)
- 신규 고객은 CodeCommit 서비스를 이용할 수 없음
- AWS는 GitHub, GitLab 등 외부 Git 솔루션으로 마이그레이션 권장
- 단, 시험에는 여전히 출제될 수 있음 (서비스 개념 이해 필요)
- CodePipeline 등 다른 서비스와의 통합은 GitHub으로 대체 가능
CodeCommit 특징
┌─────────────────────────────────────────────────────────────────┐
│ AWS CodeCommit │
│ │
│ ✅ 완전 관리형 Git 저장소 │
│ ✅ 무제한 저장소 크기 (자동 확장) │
│ ✅ 고가용성 │
│ ✅ AWS 계정 내 코드 보관 → 보안/컴플라이언스 │
│ ✅ KMS 암호화 (저장 시/전송 시) │
│ ✅ CodeBuild, CodePipeline, Jenkins 통합 │
│ │
└─────────────────────────────────────────────────────────────────┘CodeCommit 보안
┌─────────────────────────────────────────────────────────────────┐
│ CodeCommit 보안 요약 │
│ │
│ 왜 안전한가? │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ • AWS VPC 내에 실제로 상주 │ │
│ │ • 코드는 오직 AWS 클라우드 상에만 존재 │ │
│ │ • 보안 및 규정 준수 수준 향상 │ │
│ │ • 무제한 저장소 크기 (기가바이트 단위 확장 가능) │ │
│ │ • 완전 관리형 + 고가용성 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ 보안 3요소: 인증/권한/암호화 │
│ │
│ 1️⃣ 인증 (Authentication): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ SSH Keys: │ │
│ │ • IAM Console에서 SSH 공개 키 등록 │ │
│ │ • git clone git@git-codecommit... │ │
│ │ │ │
│ │ HTTPS (Git Credentials): │ │
│ │ • IAM에서 Git 자격 증명 생성 │ │
│ │ • 또는 AWS CLI Credential Helper 사용 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 2️⃣ 권한 부여 (Authorization): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ • IAM Policy로 저장소별 권한 관리 │ │
│ │ • AWS에서 보안 관리 방법이 통일됨 (IAM 하나로!) │ │
│ │ • 사용자/역할 단위로 세밀한 권한 제어 가능 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 3️⃣ 암호화 (Encryption): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 저장 시 (At Rest): │ │
│ │ • KMS로 자동 암호화 │ │
│ │ • 권한 없는 사람은 코드 접근 불가 │ │
│ │ │ │
│ │ 전송 시 (In Transit): │ │
│ │ • HTTPS 또는 SSH 프로토콜만 사용 가능 │ │
│ │ • 둘 다 보안 프로토콜 (TLS) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 4️⃣ Cross-Account Access: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ❌ SSH 키나 자격 증명을 다른 사람과 공유 금지! │ │
│ │ ✅ IAM Role 생성 → STS AssumeRole API로 접근 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘CodeCommit vs GitHub
| 항목 | CodeCommit | GitHub |
|---|---|---|
| 코드 리뷰 (PR) | ✅ | ✅ |
| CodeBuild 통합 | ✅ | ✅ |
| 인증 | IAM Users/Roles | GitHub Users, SSO (기업용) |
| 호스팅 | AWS 관리 (AWS 내에서만) | GitHub 관리 또는 자체 서버 |
| UI | 기본적 (최소한) | 풍부함 |
| 보안 관리 | IAM으로 통합 관리 | GitHub 자체 권한 시스템 |
| 규정 준수 | AWS 컴플라이언스 적용 | 별도 설정 필요 |
이벤트 모니터링
┌─────────────────────────────────────────────────────────────────┐
│ CodeCommit: EventBridge 연동 │
│ │
│ CodeCommit ──event──→ EventBridge ──trigger──→ 타겟 │
│ │
│ 이벤트 종류: │
│ • pullRequestCreated (PR 생성) │
│ • pullRequestStatusChanged (PR 상태 변경) │
│ • referenceCreated (브랜치/태그 생성) │
│ • referenceUpdated (브랜치/태그 업데이트) │
│ • commentOnCommitCreated (커밋에 코멘트) │
│ │
│ 타겟 예시: │
│ • SNS → 알림 │
│ • Lambda → 자동화 │
│ • CodePipeline → 파이프라인 시작 │
│ │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ GitHub: Webhooks + Actions │
│ │
│ GitHub ──webhook──→ 외부 서비스 / GitHub Actions │
│ │
│ Webhook 이벤트 (Settings → Webhooks): │
│ • pull_request (PR 생성/수정/병합) │
│ • push (코드 푸시) │
│ • create (브랜치/태그 생성) │
│ • issue_comment (이슈/PR 코멘트) │
│ • workflow_run (Actions 워크플로우 완료) │
│ │
│ AWS 연동 방법: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 1. GitHub → Webhook → API Gateway → Lambda │ │
│ │ 2. GitHub → GitHub Actions → aws-actions/* 사용 │ │
│ │ 3. GitHub → CodePipeline (GitHub 연결 소스) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ GitHub Actions 예시 (.github/workflows/deploy.yml): │
│ on: │
│ push: │
│ branches: [main] │
│ pull_request: │
│ types: [opened, synchronize] │
│ │
└─────────────────────────────────────────────────────────────────┘Branch Security
┌─────────────────────────────────────────────────────────────────┐
│ CodeCommit: IAM Policy 기반 │
│ │
│ 시나리오: Production 브랜치는 시니어만 푸시 가능 │
│ │
│ CodeCommit Repository │
│ ├── main (production) ← 시니어만 push/merge │
│ ├── staging │
│ └── develop ← 모든 개발자 push 가능 │
│ │
│ IAM Policy 예시: │
│ { │
│ "Effect": "Deny", │
│ "Action": [ │
│ "codecommit:GitPush", │
│ "codecommit:MergeBranchesByFastForward" │
│ ], │
│ "Resource": "arn:aws:codecommit:*:*:MyRepo", │
│ "Condition": { │
│ "StringEqualsIfExists": { │
│ "codecommit:References": ["refs/heads/main"] │
│ } │
│ } │
│ } │
│ │
│ ⚠️ Resource Policy는 아직 미지원 │
│ │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ GitHub: Branch Protection Rules │
│ │
│ Settings → Branches → Branch protection rules │
│ │
│ 보호 옵션: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ ✅ Require a pull request before merging │ │
│ │ • PR 없이 직접 푸시 금지 │ │
│ │ │ │
│ │ ✅ Require approvals (N명) │ │
│ │ • 병합 전 승인 필요 │ │
│ │ │ │
│ │ ✅ Require status checks to pass │ │
│ │ • CI 테스트 통과 필수 │ │
│ │ │ │
│ │ ✅ Require signed commits │ │
│ │ • GPG 서명된 커밋만 허용 │ │
│ │ │ │
│ │ ✅ Include administrators │ │
│ │ • 관리자도 규칙 적용 │ │
│ │ │ │
│ │ ✅ Restrict who can push │ │
│ │ • 특정 사용자/팀만 푸시 허용 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 💡 GitHub이 더 직관적! UI에서 쉽게 설정 가능 │
│ │
└─────────────────────────────────────────────────────────────────┘Pull Request Approval Rules
┌─────────────────────────────────────────────────────────────────┐
│ CodeCommit: Approval Rule Templates │
│ │
│ • 병합 전 N명의 승인 필요 │
│ • 승인자 풀 지정 가능 (IAM Principal ARN) │
│ - IAM 사용자, 연합된 사용자, IAM 역할, IAM 그룹 │
│ • Approval Rule Templates로 자동 적용 │
│ 예: dev 브랜치 → 1명 승인 │
│ prod 브랜치 → 2명 승인 │
│ │
│ 예시: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ PR 생성 → 승인자 풀: 5명 │ │
│ │ 필요 승인: 2명 │ │
│ │ │ │
│ │ 사용자1 ✅ 승인 │ │
│ │ 사용자3 ✅ 승인 │ │
│ │ ↓ │ │
│ │ PR 승인 완료 → 병합 가능! │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘┌─────────────────────────────────────────────────────────────────┐
│ GitHub: Branch Protection + CODEOWNERS │
│ │
│ 1️⃣ Branch Protection Rules (기본): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Settings → Branches → Require approvals │ │
│ │ • 필요 승인 수 설정 (1~6명) │ │
│ │ • Dismiss stale approvals (코드 변경 시 승인 취소) │ │
│ │ • Require review from Code Owners │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 2️⃣ CODEOWNERS 파일 (세밀한 제어): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ # .github/CODEOWNERS │ │
│ │ │ │
│ │ # 전체 저장소 기본 소유자 │ │
│ │ * @team-lead @senior-dev │ │
│ │ │ │
│ │ # 특정 디렉토리별 소유자 │ │
│ │ /src/api/ @backend-team │ │
│ │ /src/frontend/ @frontend-team │ │
│ │ /infra/ @devops-team │ │
│ │ │ │
│ │ # 특정 파일 소유자 │ │
│ │ *.tf @terraform-reviewers │ │
│ │ Dockerfile @docker-experts │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 3️⃣ Ruleset (GitHub Enterprise - 고급): │
│ • 조직 전체에 규칙 일괄 적용 │
│ • 더 세밀한 조건 설정 가능 │
│ │
└─────────────────────────────────────────────────────────────────┘CodeCommit vs GitHub 비교
| 기능 | CodeCommit | GitHub |
|---|---|---|
| 승인 규칙 설정 | Approval Rule Templates (IAM) | Branch Protection Rules (UI) |
| 승인자 지정 | IAM Principal ARN | CODEOWNERS 파일 + Teams |
| 파일별 소유자 | ❌ 미지원 | ✅ CODEOWNERS |
| CI 통과 필수 | CodeBuild + EventBridge 연동 | Status Checks (GitHub Actions) |
| 설정 난이도 | IAM 정책 작성 필요 (복잡) | UI에서 클릭 (쉬움) |
Cross-Region Replication (교차 리전 복제)
┌─────────────────────────────────────────────────────────────────┐
│ 교차 리전 복제 │
│ │
│ 사용 사례: │
│ • 글로벌 개발자를 위한 지연 시간 감소 │
│ • 저장소 백업/DR (재해 복구) │
│ │
│ 구현 방법 (EventBridge + ECS/CodeBuild): │
│ │
│ us-east-1 eu-west-2 │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ CodeCommit │ │ CodeCommit │ │
│ │ (Primary) │ │ (Replica) │ │
│ └──────┬───────┘ └──────▲───────┘ │
│ │ │ │
│ │ push │ push │
│ ↓ │ │
│ ┌──────────────┐ trigger ┌──────┴───────┐ │
│ │ EventBridge │────────────────→│ ECS Task / │ │
│ │ │ │ CodeBuild │ │
│ └──────────────┘ │ (git clone │ │
│ │ + git push) │ │
│ 이벤트: └──────────────┘ │
│ • referenceCreated │
│ • referenceUpdated │
│ │
└─────────────────────────────────────────────────────────────────┘3. AWS CodePipeline
🤔 CodePipeline이 뭔가요?
비유로 이해하기: CodePipeline은 CI/CD 공장장입니다.
- 코드 가져오기 → 빌드 → 테스트 → 배포 순서 지휘
- 각 단계별 다른 서비스 연결
CodePipeline 구성
┌─────────────────────────────────────────────────────────────────┐
│ CodePipeline 구조 │
│ │
│ ┌──────────┐ ┌──────────┐ ┌──────────┐ ┌──────────┐ │
│ │ Source │──→│ Build │──→│ Test │──→│ Deploy │ │
│ │ (Stage) │ │ (Stage) │ │ (Stage) │ │ (Stage) │ │
│ └──────────┘ └──────────┘ └──────────┘ └──────────┘ │
│ │ │ │ │ │
│ CodeCommit CodeBuild CodeBuild CodeDeploy │
│ GitHub Device Farm Elastic Beanstalk│
│ S3 CloudFormation │
│ ECR ECS, Lambda │
│ │
│ 각 Stage는: │
│ • 순차적(Sequential) 또는 병렬(Parallel) Action 가능 │
│ • Manual Approval 추가 가능 │
│ │
└─────────────────────────────────────────────────────────────────┘Stage별 Provider
| Stage 유형 | Provider |
|---|---|
| Source | CodeCommit, GitHub, S3, ECR, Bitbucket |
| Build | CodeBuild, Jenkins |
| Test | CodeBuild, Device Farm, Jenkins |
| Deploy | CodeDeploy, Elastic Beanstalk, CloudFormation, ECS, S3 |
| Invoke | Lambda, Step Functions |
| Approval | Manual |
Artifacts (아티팩트)
┌─────────────────────────────────────────────────────────────────┐
│ Pipeline Artifacts │
│ │
│ 각 Stage는 Artifact를 S3에 저장하고 다음 Stage로 전달 │
│ │
│ Developer │
│ │ push │
│ ↓ │
│ ┌──────────┐ output ┌──────────────────────┐ │
│ │CodeCommit│────────────→│ S3 Bucket │ │
│ │ (Source) │ │ (Artifact Store) │ │
│ └──────────┘ └──────────┬───────────┘ │
│ │ input │
│ ↓ │
│ ┌──────────────────────┐ │
│ │ CodeBuild │ │
│ │ (Build) │ │
│ └──────────┬───────────┘ │
│ │ output (빌드 결과물) │
│ ↓ │
│ ┌──────────────────────┐ │
│ │ S3 Bucket │ │
│ └──────────┬───────────┘ │
│ │ input │
│ ↓ │
│ ┌──────────────────────┐ │
│ │ CodeDeploy │ │
│ │ (Deploy) │ │
│ └──────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘Manual Approval
┌─────────────────────────────────────────────────────────────────┐
│ Manual Approval Stage │
│ │
│ CodeCommit → CodeBuild → Manual Approval → CodeDeploy │
│ │ │
│ │ SNS 알림 │
│ ↓ │
│ [담당자] │
│ │ │
│ 승인 / 거부 │
│ │ │
│ ↓ │
│ 승인 시 → Deploy 진행 │
│ 거부 시 → Pipeline 중단 │
│ │
│ 필요한 IAM 권한: │
│ • codepipeline:GetPipeline │
│ • codepipeline:GetPipelineState │
│ • codepipeline:PutApprovalResult │
│ │
└─────────────────────────────────────────────────────────────────┘트리거 방식
┌─────────────────────────────────────────────────────────────────┐
│ Pipeline 트리거 방식 │
│ │
│ 1. Events (권장 ✅) │
│ CodeCommit → EventBridge → CodePipeline │
│ • 즉시 반응 │
│ • 기본 설정 │
│ │
│ 2. Webhooks │
│ GitHub → HTTP Webhook → CodePipeline │
│ • GitHub 등 외부 소스용 │
│ │
│ 3. Polling (비권장 ❌) │
│ CodePipeline → 주기적으로 소스 확인 │
│ • 지연 발생 │
│ • API 호출 비용 │
│ │
└─────────────────────────────────────────────────────────────────┘CloudFormation 연동
┌─────────────────────────────────────────────────────────────────┐
│ CodePipeline + CloudFormation │
│ │
│ CloudFormation으로 모든 AWS 리소스 배포 가능! │
│ • 순수 CloudFormation 템플릿 │
│ • AWS CDK (Cloud Development Kit) │
│ • AWS SAM (Serverless Application Model) │
│ │
│ 기본 패턴 (변경 세트 + 수동 승인): │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodeCommit → CodeBuild → CloudFormation → Manual │ │
│ │ │ │ (Create Change Approval │ │
│ │ │ │ Set) │ │ │
│ │ │ │ ↓ │ │ │
│ │ │ │ CloudFormation ←───┘ │ │
│ │ │ │ (Execute Change Set) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 💡 수동 승인 없이 바로 배포도 가능 (CREATE_UPDATE 사용) │
│ │
└─────────────────────────────────────────────────────────────────┘Action Modes (작업 모드)
| 모드 | 설명 |
|---|---|
| CREATE_UPDATE | 스택 생성 또는 기존 스택 업데이트 |
| DELETE_ONLY | 스택 삭제 |
| REPLACE_ON_FAILURE | 실패한 스택 교체 |
| Create Change Set | 변경 세트 생성 (미리보기) |
| Execute Change Set | 변경 세트 실행 (적용) |
┌─────────────────────────────────────────────────────────────────┐
│ 실전 아키텍처 예시 │
│ │
│ 테스트 환경 배포 → 검증 → 삭제 → 운영 환경 배포 │
│ │
│ Step 1: 빌드 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodePipeline → CodeBuild │ │
│ │ │ │ │
│ │ ↓ │ │
│ │ template.yaml 생성 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Step 2: 테스트 인프라 배포 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CloudFormation (CREATE_UPDATE) │ │
│ │ │ │ │
│ │ ↓ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Test Stack: ALB + ASG + EC2 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Step 3: 애플리케이션 테스트 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodeBuild → ALB 호출 (HTTP) │ │
│ │ → 기능 테스트, 로드 테스트 등 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Step 4: 테스트 인프라 삭제 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CloudFormation (DELETE_ONLY) │ │
│ │ │ │ │
│ │ ↓ │ │
│ │ Test Stack 삭제 ✅ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ Step 5: 운영 인프라 배포 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CloudFormation (CREATE_UPDATE) │ │
│ │ │ │ │
│ │ ↓ │ │
│ │ ┌─────────────────────────────────────────────────┐ │ │
│ │ │ Prod Stack: ALB + ASG + EC2 │ │ │
│ │ └─────────────────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘템플릿 매개변수 오버라이드
┌─────────────────────────────────────────────────────────────────┐
│ 매개변수 오버라이드 │
│ │
│ 런타임에 CloudFormation 템플릿 매개변수를 동적으로 변경! │
│ │
│ 방법 1: 정적 오버라이드 (템플릿 구성 파일) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ # template-config.json │ │
│ │ { │ │
│ │ "Parameters": { │ │
│ │ "Environment": "production", │ │
│ │ "InstanceType": "t3.large" │ │
│ │ } │ │
│ │ } │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 방법 2: 동적 오버라이드 (파이프라인 입력 아티팩트) │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodeBuild에서 JSON 파일 생성 │ │
│ │ │ │ │
│ │ ↓ │ │
│ │ CloudFormation Action의 ParameterOverrides로 전달 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ ⚠️ 모든 매개변수가 템플릿에 정의되어 있어야 함! │
│ │
└─────────────────────────────────────────────────────────────────┘Multi-Region / Multi-Account 배포
┌─────────────────────────────────────────────────────────────────┐
│ StackSets을 활용한 배포 │
│ │
│ CloudFormation StackSets: │
│ • 여러 AWS 계정에 동시 배포 │
│ • 여러 AWS 리전에 동시 배포 │
│ │
│ 일반 Multi-Region 배포: │
│ • 각 리전에 Artifact Store(S3) 필요 │
│ • CodePipeline이 Artifact 복사 처리 │
│ │
│ 설정 가능한 항목: │
│ • 스택 이름, 변경 세트 이름 │
│ • 입력 템플릿 │
│ • 매개변수 오버라이드 │
│ • IAM 역할 │
│ • 작업 모드 │
│ │
└─────────────────────────────────────────────────────────────────┘Invoke Action
Pipeline 내에서 Lambda/Step Functions 호출 가능!
사용 예:
• Lambda: REST API 호출, 데이터 검증
• Step Functions: 복잡한 워크플로우 실행
예: 로드 테스트 → DynamoDB 기록 → ECS 태스크 실행트러블슈팅
┌─────────────────────────────────────────────────────────────────┐
│ CodePipeline 트러블슈팅 │
│ │
│ 문제: Pipeline이 실패함 │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ 1. Console에서 실패 Stage/Action 확인 │ │
│ │ 2. CloudWatch Events로 실패 알림 설정 │ │
│ │ 3. IAM Service Role 권한 확인 │ │
│ │ 4. CloudTrail로 API 호출 감사 │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ EventBridge로 실패 감지: │
│ CodePipeline failure → EventBridge → SNS/Lambda │
│ │
└─────────────────────────────────────────────────────────────────┘4. AWS CodeBuild
🤔 CodeBuild가 뭔가요?
비유로 이해하기: CodeBuild는 클라우드 빌드 머신입니다.
- 서버 관리 불필요 (Serverless)
- Docker 기반으로 빌드 환경 구성
- 사용한 시간만큼만 과금
CodeBuild 특징
┌─────────────────────────────────────────────────────────────────┐
│ AWS CodeBuild │
│ │
│ ✅ 완전 관리형 CI 서비스 │
│ ✅ 자동 확장 (대기열 없음) │
│ ✅ 분당 과금 │
│ ✅ Docker 기반 (재현 가능한 빌드) │
│ ✅ 사전 빌드된 이미지 또는 커스텀 이미지 사용 │
│ │
│ 지원 언어/환경: │
│ Java, Ruby, Python, Go, Node.js, Android, │
│ .NET Core, PHP, Docker (커스텀 환경) │
│ │
│ 💡 다른 언어가 필요하면? 커스텀 Docker 이미지 사용! │
│ │
│ 보안: │
│ • KMS로 빌드 아티팩트 암호화 │
│ • IAM으로 권한 관리 │
│ • VPC 내에서 실행 가능 │
│ • CloudTrail로 API 감사 │
│ │
└─────────────────────────────────────────────────────────────────┘로그 및 모니터링
┌─────────────────────────────────────────────────────────────────┐
│ CodeBuild 모니터링 │
│ │
│ 빌드 로그: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodeBuild → S3 Bucket (로그 저장) │ │
│ │ → CloudWatch Logs (실시간 분석) │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 빌드 지표 (CloudWatch Metrics): │
│ • 빌드 성공/실패 횟수 │
│ • 빌드 소요 시간 │
│ • 대기열 길이 │
│ │
│ 빌드 실패 알림: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ CodeBuild failure → EventBridge → SNS/Lambda │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ CloudWatch Alarms: │
│ • 실패 횟수가 임계값 초과 시 알림 │
│ • 예: 5분간 3회 이상 실패 → 알림 │
│ │
└─────────────────────────────────────────────────────────────────┘빌드 프로젝트 정의 위치
빌드 프로젝트는 어디서 정의?
1. CodeBuild에서 직접 정의
• CodeBuild 콘솔에서 프로젝트 생성
• 독립적으로 실행 가능
2. CodePipeline에서 정의
• Pipeline 내에서 인라인으로 정의
• Pipeline에서만 실행
3. CodePipeline에서 기존 프로젝트 호출
• CodeBuild에서 미리 생성한 프로젝트 참조
• 재사용성 높음
💡 권장: 재사용할 빌드는 CodeBuild에서 정의 후 Pipeline에서 호출CodeBuild 동작 방식
┌─────────────────────────────────────────────────────────────────┐
│ CodeBuild 동작 │
│ │
│ ┌──────────────────┐ │
│ │ CodeCommit │ │
│ │ (Source Code) │ │
│ │ + buildspec.yml │ │
│ └────────┬─────────┘ │
│ │ │
│ ↓ │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ CodeBuild │ │
│ │ ┌────────────────────────────────────────────────┐ │ │
│ │ │ Build Container │ │ │
│ │ │ │ │ │
│ │ │ Docker Image (Prepackaged or Custom) │ │ │
│ │ │ │ │ │ │
│ │ │ ↓ buildspec.yml 실행 │ │ │
│ │ │ 1. install: 의존성 설치 │ │ │
│ │ │ 2. pre_build: 빌드 전 준비 │ │ │
│ │ │ 3. build: 실제 빌드 │ │ │
│ │ │ 4. post_build: 빌드 후 처리 │ │ │
│ │ │ │ │ │
│ │ └────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────┘ │
│ │ │
│ ↓ │
│ ┌──────────────┐ ┌──────────────┐ │
│ │ S3 Bucket │ │ CloudWatch │ │
│ │ (Artifacts) │ │ Logs │ │
│ └──────────────┘ └──────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘buildspec.yml
CI 도구별 설정 파일 비교
| CI 도구 | 설정 파일 | 위치 |
|---|---|---|
| AWS CodeBuild | buildspec.yml | 프로젝트 루트 |
| Jenkins | Jenkinsfile | 프로젝트 루트 |
| GitHub Actions | .github/workflows/*.yml | .github/workflows/ |
| GitLab CI | .gitlab-ci.yml | 프로젝트 루트 |
| CircleCI | .circleci/config.yml | .circleci/ |
# buildspec.yml - 프로젝트 루트에 위치
version: 0.2
env:
variables:
NODE_ENV: "production" # 평문 변수
parameter-store:
DB_PASSWORD: "/my-app/db-password" # SSM Parameter Store
secrets-manager:
API_KEY: "my-secret:api_key" # Secrets Manager
phases:
install:
runtime-versions:
nodejs: 18
commands:
- npm install
pre_build:
commands:
- echo "Running tests..."
- npm test
build:
commands:
- echo "Building..."
- npm run build
post_build:
commands:
- echo "Build completed!"
artifacts:
files:
- "**/*"
base-directory: dist # 아티팩트로 업로드할 폴더
cache:
paths:
- node_modules/**/* # 다음 빌드에서 재사용 (S3에 캐시)
reports:
jest-reports:
files:
- "junit.xml"
file-format: JUNITXML참고: Jenkins의 Jenkinsfile 예시
// Jenkinsfile - 프로젝트 루트에 위치
pipeline {
agent any
environment {
NODE_ENV = 'production'
// Jenkins Credentials에서 가져옴
DB_PASSWORD = credentials('db-password')
}
stages {
stage('Install') {
steps {
sh 'npm install'
}
}
stage('Test') {
steps {
sh 'npm test'
}
}
stage('Build') {
steps {
sh 'npm run build'
}
}
stage('Deploy') {
steps {
sh 'aws s3 sync dist/ s3://my-bucket/'
}
}
}
post {
always {
junit 'junit.xml' // 테스트 리포트
archiveArtifacts artifacts: 'dist/**/*'
}
}
}참고: GitHub Actions workflow 예시
# .github/workflows/ci.yml
name: CI/CD Pipeline
on:
push:
branches: [main]
pull_request:
branches: [main]
env:
NODE_ENV: production
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v4
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: "18"
cache: "npm"
- name: Install dependencies
run: npm install
- name: Run tests
run: npm test
- name: Build
run: npm run build
- name: Upload artifacts
uses: actions/upload-artifact@v4
with:
name: dist
path: dist/
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
with:
name: dist
- name: Deploy to S3
uses: aws-actions/configure-aws-credentials@v4
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- run: aws s3 sync dist/ s3://my-bucket/buildspec.yml vs Jenkinsfile vs GitHub Actions 비교
| 항목 | CodeBuild (buildspec.yml) | Jenkins (Jenkinsfile) | GitHub Actions |
|---|---|---|---|
| 단계 정의 | phases | stages | jobs + steps |
| 환경 변수 | env.variables | environment | env |
| 보안 암호 | SSM / Secrets Manager | Jenkins Credentials | GitHub Secrets |
| 아티팩트 | artifacts 섹션 | archiveArtifacts | upload-artifact action |
| 캐시 | cache 섹션 (S3) | 플러그인 필요 | cache action |
| 실행 환경 | AWS 관리형 컨테이너 | Jenkins 서버/에이전트 | GitHub 호스팅 러너 |
| AWS 통합 | 네이티브 (IAM Role) | 플러그인 + 자격증명 | aws-actions 사용 |
buildspec.yml 핵심 포인트
┌─────────────────────────────────────────────────────────────────┐
│ buildspec.yml 필수 사항 │
│ │
│ 📍 위치: 소스 코드 루트 디렉토리 (최상단) │
│ 📝 파일명: buildspec.yml (정확히!) │
│ │
│ 섹션별 역할: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ env │ 환경 변수 정의 │ │
│ │ │ • variables: 평문 변수 │ │
│ │ │ • parameter-store: SSM에서 가져옴 │ │
│ │ │ • secrets-manager: 보안 암호 가져옴 │ │
│ ├─────────────┼────────────────────────────────────────────┤ │
│ │ phases │ 빌드 단계별 명령어 │ │
│ │ │ • install: 의존성 설치 │ │
│ │ │ • pre_build: 빌드 전 준비 │ │
│ │ │ • build: 실제 빌드 (핵심!) │ │
│ │ │ • post_build: 마무리 (압축 등) │ │
│ ├─────────────┼────────────────────────────────────────────┤ │
│ │ artifacts │ S3로 업로드할 빌드 결과물 │ │
│ │ │ → KMS 암호화 적용 │ │
│ ├─────────────┼────────────────────────────────────────────┤ │
│ │ cache │ S3에 캐시할 파일 (빌드 속도 향상) │ │
│ │ │ 예: node_modules, .m2 │ │
│ └─────────────┴────────────────────────────────────────────┘ │
│ │
│ ⚠️ 암호는 buildspec.yml에 평문으로 저장 금지! │
│ → SSM Parameter Store 또는 Secrets Manager 사용 │
│ │
└─────────────────────────────────────────────────────────────────┘CodeBuild 환경 변수
┌─────────────────────────────────────────────────────────────────┐
│ 환경 변수 종류 │
│ │
│ 1. Default (AWS 제공) │
│ • AWS_DEFAULT_REGION │
│ • CODEBUILD_BUILD_ID │
│ • CODEBUILD_BUILD_ARN │
│ • CODEBUILD_SOURCE_REPO_URL │
│ │
│ 2. Custom Static (빌드 시 정의) │
│ • buildspec.yml의 env.variables │
│ • CodeBuild 프로젝트 설정 │
│ • start-build API로 오버라이드 가능 │
│ │
│ 3. Custom Dynamic (런타임에 가져옴) │
│ • SSM Parameter Store │
│ • Secrets Manager │
│ │
└─────────────────────────────────────────────────────────────────┘VPC 내에서 CodeBuild 실행
┌─────────────────────────────────────────────────────────────────┐
│ CodeBuild in VPC │
│ │
│ 기본: CodeBuild는 VPC 외부에서 실행 │
│ → VPC 내부 리소스 접근 불가! │
│ │
│ VPC 설정 방법: │
│ CodeBuild 프로젝트 → VPC 구성 메뉴에서 설정 │
│ • VPC ID │
│ • Subnet ID (Private Subnet 권장) │
│ • Security Group ID │
│ │
│ VPC 설정 시 아키텍처: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ Your VPC │ │
│ │ │ │
│ │ ┌─────────────────┐ ┌─────────────────┐ │ │
│ │ │ Private Subnet │ │ Private Subnet │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌───────────┐ │ │ ┌───────────┐ │ │ │
│ │ │ │ CodeBuild │ │ │ │ RDS │ │ │ │
│ │ │ │ Container │←──────→│ Instance │ │ │ │
│ │ │ └───────────┘ │ │ └───────────┘ │ │ │
│ │ │ │ │ │ │ │
│ │ │ ┌─────┴────┴─────┐ │ │ │
│ │ │ │ ElastiCache │ │ │ │
│ │ │ │ ALB │ │ │ │
│ │ │ └────────────────┘ │ │ │
│ │ └─────────────────────────────────────────┘ │ │
│ │ │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 사용 사례: │
│ • Integration Tests (RDS, ElastiCache 접근) │
│ • 내부 로드밸런서 호출 │
│ • 프라이빗 리소스 접근 │
│ • 데이터 쿼리 │
│ │
└─────────────────────────────────────────────────────────────────┘로컬에서 CodeBuild 실행
┌─────────────────────────────────────────────────────────────────┐
│ Local Build (로컬 빌드) │
│ │
│ 문제 해결에 로그 이상의 것이 필요할 때! │
│ → 로컬 데스크톱에서 CodeBuild를 실행하여 디버깅 │
│ │
│ 필요 조건: │
│ 1. Docker 설치 │
│ 2. CodeBuild Agent 다운로드 │
│ │
│ 실행 방법: │
│ ┌─────────────────────────────────────────────────────────┐ │
│ │ # CodeBuild Agent 가이드 참조 │ │
│ │ $ ./codebuild_build.sh -i aws/codebuild/standard:5.0 \ │ │
│ │ -a ./artifacts │ │
│ └─────────────────────────────────────────────────────────┘ │
│ │
│ 장점: │
│ • 빌드 실패 원인 로컬에서 재현 가능 │
│ • 빠른 디버깅 (AWS 비용 없음) │
│ • buildspec.yml 테스트 │
│ │
└─────────────────────────────────────────────────────────────────┘Test Reports
테스트 결과를 시각화:
지원 포맷:
• JUnit XML
• NUnit XML
• Cucumber JSON
• TestNG XML
• Visual Studio TRX
buildspec.yml에 reports 섹션 추가 →
CodeBuild 콘솔에서 테스트 결과 확인 가능!PR 검증 자동화
┌─────────────────────────────────────────────────────────────────┐
│ PR 검증 워크플로우 │
│ │
│ Developer │
│ │ PR 생성/업데이트 │
│ ↓ │
│ CodeCommit ──event──→ EventBridge ──→ Lambda │
│ │ │
│ │ PR에 "빌드 시작" 코멘트│
│ ↓ │
│ CodeBuild │
│ │ │
│ ┌─────────────┴─────────────┐ │
│ ↓ ↓ │
│ Success Failure │
│ │ │ │
│ ↓ ↓ │
│ EventBridge EventBridge │
│ │ │ │
│ ↓ ↓ │
│ Lambda Lambda │
│ │ │ │
│ PR에 "성공" 코멘트 PR에 "실패" 코멘트│
│ │
└─────────────────────────────────────────────────────────────────┘