$ yh.log
[DOP-C02] Domain 1 - SDLC Automation (Part 1)

[DOP-C02] Domain 1 - SDLC Automation (Part 1)

AWSDOP-C02DevOpsCI/CDCodeCommitCodePipelineCodeBuild

작성자 : 오예환 | 작성일 : 2026-02-16 | 수정일 : 2026-02-16 | 조회수 :

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

항목CodeCommitGitHub
코드 리뷰 (PR)
CodeBuild 통합
인증IAM Users/RolesGitHub 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 비교

기능CodeCommitGitHub
승인 규칙 설정Approval Rule Templates (IAM)Branch Protection Rules (UI)
승인자 지정IAM Principal ARNCODEOWNERS 파일 + 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
SourceCodeCommit, GitHub, S3, ECR, Bitbucket
BuildCodeBuild, Jenkins
TestCodeBuild, Device Farm, Jenkins
DeployCodeDeploy, Elastic Beanstalk, CloudFormation, ECS, S3
InvokeLambda, Step Functions
ApprovalManual

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 CodeBuildbuildspec.yml프로젝트 루트
JenkinsJenkinsfile프로젝트 루트
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
단계 정의phasesstagesjobs + steps
환경 변수env.variablesenvironmentenv
보안 암호SSM / Secrets ManagerJenkins CredentialsGitHub Secrets
아티팩트artifacts 섹션archiveArtifactsupload-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에 "실패" 코멘트│

└─────────────────────────────────────────────────────────────────┘