09 CHAPTER 09 · 운영·자동화

CI/CD 자동화

git push 한 번으로 배포까지 — 파이프라인 구축

운영·자동화 Spring Boot 기준

CodePipeline · CodeBuild · CodeDeploy · buildspec.yml · appspec.yml · Systems Manager

CHAPTER INFO
🚀배포 자동화 완성
💰CodeBuild 빌드 시간당 과금
🔗이전: CH08 CloudWatch
🔗다음: CH10 종합 실습

CI/CD가 왜 필요한가

배포를 수동으로 하면 어떤 일이 생길까요? 개발자가 서버에 SSH 접속 → jar 파일 업로드 → 서비스 재시작. 이 과정에서 실수가 생기고, 서비스가 중단되는 시간이 생깁니다. 팀원이 여러 명이면 "어떤 버전이 배포돼 있지?"를 모릅니다.

CI/CD는 코드를 push하면 자동으로 테스트·빌드·배포까지 이어지는 파이프라인입니다.

🚀 CI/CD 파이프라인 흐름
👨‍💻
git push
📦
CodePipeline
트리거
🔨
CodeBuild
테스트·빌드
🚀
CodeDeploy
EC2 배포
배포 완료

CodeBuild — 빌드 환경

CodeBuild는 소스 코드를 빌드하고 테스트하는 서비스입니다. 빌드 환경(Docker 이미지)을 선택하고, buildspec.yml 파일에 빌드 명령을 씁니다.

📄 buildspec.yml — Spring Boot 빌드
version: 0.2

phases:
  install:
    runtime-versions:
      java: corretto17

  pre_build:
    commands:
      - echo "테스트 시작"
      - ./gradlew test

  build:
    commands:
      - echo "빌드 시작"
      - ./gradlew bootJar

  post_build:
    commands:
      - echo "빌드 완료"

artifacts:
  files:
    - build/libs/*.jar
    - appspec.yml
    - scripts/**/*
  discard-paths: no

CodeDeploy — EC2에 무중단 배포

CodeDeploy는 빌드된 결과물을 EC2에 배포합니다. 배포 전략에 따라 중단 없이 롤링 배포하거나, Blue/Green 배포도 할 수 있습니다.

📄 appspec.yml — 배포 명세
version: 0.0
os: linux

files:
  - source: /build/libs/myapp.jar
    destination: /home/ec2-user/

hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      timeout: 30

  AfterInstall:
    - location: scripts/start.sh
      timeout: 60
      runas: ec2-user

  ValidateService:
    - location: scripts/validate.sh
      timeout: 30

배포 전략

전략방식다운타임
In-Place기존 인스턴스에 순차적으로 배포있을 수 있음
Rolling일부씩 교체 (ALB에서 잠시 제외 후 배포)없음
Blue/Green새 인스턴스 그룹에 배포 후 트래픽 전환없음 (롤백 쉬움)
⚠️
CodeDeploy 배포 실패 시 로그 확인
/opt/codedeploy-agent/deployment-root/ 경로에 배포 로그가 있습니다.
또는 sudo tail -f /var/log/aws/codedeploy-agent/codedeploy-agent.log

Systems Manager — 운영 자동화

Parameter Store — 설정값 중앙 관리

DB 비밀번호, API 키 같은 설정을 Parameter Store에 저장하고 애플리케이션에서 가져옵니다. 코드에 하드코딩하거나 환경변수 파일에 담을 필요가 없습니다.

🔐 Parameter Store 활용
# AWS CLI로 파라미터 저장
aws ssm put-parameter \
  --name "/myapp/prod/db-password" \
  --value "secure-password-here" \
  --type "SecureString"

# Spring Boot에서 가져오기 (의존성 추가 필요)
@Value("${spring.datasource.password}")
private String dbPassword;
# application.yml에서 SSM 참조
# spring.datasource.password: ${ssm:/myapp/prod/db-password}

Session Manager — SSH 없이 EC2 접속

CH02에서 배운 내용입니다. SSH 포트(22)를 열지 않아도 브라우저나 AWS CLI로 EC2에 접속할 수 있습니다. 모든 접속이 CloudTrail에 기록되고, ISMS-P 감사에 유리합니다.

📌 CH09 핵심 개념 요약
CI/CD 파이프라인CodePipeline(오케스트레이터) → CodeBuild(빌드) → CodeDeploy(배포)
buildspec.ymlCodeBuild의 빌드 명령 정의. 프로젝트 루트에 위치
appspec.ymlCodeDeploy의 배포 명세. 파일 복사 위치 + 훅 스크립트 정의
배포 전략Blue/Green = 무중단 + 롤백 쉬움. 프로덕션 권장
Parameter Store설정값 중앙 관리. DB 비밀번호·API 키를 코드 밖에서 관리