KT AIVLE School AI 트랙 미니프로젝트 6차
- 시나리오 정립 및 아키텍처 설계
- CI 환경 구축: CodePipeline & CodeBuild
- CD 환경 구축: CodeDeploy 연동 및 배포 자동화
- 운영 인프라 확장: ALB, Auto Scaling Group
- 모니터링: CloudWatch + SNS 기반 운영 확인
- 이메일 수동 승인
- 트러블슈팅
- 일자별 결과물 요약
| 구분 | 내용 |
|---|---|
| 대상 서비스 | 도서관리 시스템 Backend |
| 목표 | 코드 변경 후 자동 빌드 · 자동 배포 |
| 주요 AWS 서비스 | CodePipeline, CodeBuild, CodeDeploy, EC2, ASG(Auto Scaling Group), ALB, CloudWatch |
| 최종 흐름 | GitHub Push → Build → Deploy → 운영 확인 |
| 추가 기능 | SNS 구독, 수동 승인 이메일 검토 |
- 미니프로젝트 5차에서 구현했던 도서관리 시스템 Backend Repo를 기반으로, 해당 저장소에
buildspec.yml을 생성하여 CI/CD 파이프라인 구축을 시작함.
- 방식: 새로운 서버·인프라를 추가로 생성하지 않고, 현재 운영 중인 기존 서버에서 애플리케이션을 일시 중지한 뒤 새 버전으로 교체하는 배포 방식
- 적용 기술: CodeDeploy 기반 In-place 배포, 배포 구성은
CodeDeployDefault.AllAtOnce사용 - 동작: 대상 EC2 또는 Auto Scaling Group 인스턴스에 새
app.jar를 동시에 배포하고, 배포 후 Health Check로 정상 동작 확인
배포 파이프라인 흐름
flowchart LR
A[CodeBuild<br/>artifact 생성] --> B[CodeDeploy 실행]
B --> C[ASG/EC2 대상<br/>인스턴스 배포]
C --> D[.sh 스크립트 실행]
D --> E[Health Check 확인]
전략 선정 이유
- 실습 프로젝트 규모가 작고 배포 대상이 제한적이었음
- CI/CD 전체 흐름 검증이 핵심 목표였음
- 수동 승인과 Health Check로 최소한의 안정성 장치를 마련함
목표: GitHub에 코드가 올라오면 자동으로 빌드가 실행되도록 구성
flowchart LR
A[GitHub Repo 확인] --> B[CodePipeline]
B --> C[CodeBuild]
C --> D[빌드 성공 /<br/>Artifact 생성]
- 도서관리 시스템 Backend Repo 선정
- GitHub Repository 생성 및 코드 연결
- CodePipeline Source Stage 구성
- CodeBuild를 통한 테스트 및 빌드 자동화
| 빌드 단계 | 역할 |
|---|---|
| CodeBuild 1 | 단위 테스트 실행 — unit-test-buildspec.yml 기반 검증 |
| CodeBuild 2 | 배포용 .jar 파일 생성 — buildspec.yml 기반 artifact 생성 |
목표: CodeBuild에서 생성된 Artifact를 실제 EC2 서버에 배포
flowchart TD
A["CodeDeploy가 EC2로 전달<br/>(app.jar, appspec.yml, scripts)"] --> B["/home/ec2-user/app 경로에 복사"]
B --> C[".sh 스크립트 실행"]
C --> D["Spring Boot 서버 실행 확인"]
- 배포 방식 및 배포 전략 논의
- EC2 배포 환경 구성
- CodeDeploy Application / Deployment Group 생성
appspec.yml작성- 라이프사이클 훅 스크립트(
stop.sh,prepare.sh,start.sh,validate.sh) 작성 /home/ec2-user/app경로 배포 확인- Spring Boot 서버 실행 및 Health Check 확인
| 스크립트 | 역할 |
|---|---|
| stop.sh | 기존 app.jar 프로세스 종료 |
| prepare.sh | 배포 경로 정리 및 권한 설정 |
| start.sh | 새 app.jar 실행 및 로그 저장 |
| validate.sh | /health API로 서비스 정상 여부 확인 |
- 생성된 인스턴스 목록 및 인스턴스 내 CodeDeploy Agent 정상 동작 확인
- 인스턴스에서 실행 중인 웹 서비스 화면 확인
- 백엔드 / ALB 정상(OK) 확인
목표: Deploy 단계에 Auto Scaling을 적용하여 안정적인 파이프라인 구성
flowchart LR
User(["사용자"]) --> ALB["AWS Load Balancer"]
ALB --> ASG["Auto Scaling Group"]
ASG --> E1["EC2 Instance 1"]
ASG --> E2["EC2 Instance 2"]
ASG --> E3["EC2 Instance 3"]
ASG --> E4["EC2 Instance 4"]
ASG -.-> CW["CloudWatch 로그 수집<br/>+ 수동 승인"]
- ALB 구성 및 Target Group Health Check 설정
- Auto Scaling Group 배포 단계 추가
- Deploy 단계에서 Auto Scaling이 적용된 파이프라인 성공적으로 구성
- Auto Scaling 그룹 크기만큼 실행 중인 인스턴스 목록 확인
- CloudWatch Logs로 CodeBuild 로그 수집
- CloudWatch Agent 상태 확인 및 수집된 로그 그룹 확인
- SNS 이메일 구독 생성
flowchart LR
A[CodeBuild 완료] --> B[SNS 구독]
B --> C[이메일 알림 발송]
- CodePipeline에 수동 승인(Manual Approval) 단계 추가
- 파이프라인 진행 중 담당자가 이메일로 승인 요청을 수신하고, 검토 후 승인/거부를 결정하는 구조
- 이를 통해 자동 배포 중에도 최소한의 사람에 의한 검증 절차를 확보
장애 흐름
flowchart LR
A["H2 DB 권한(permission) 오류"] --> B["Spring Boot App 실행 실패"]
B --> C["ALB Health Check 실패"]
C --> D["502 Bad Gateway"]
style D fill:#f8d7da,stroke:#c0392b
원인 분석
prepare.sh가ec2-user권한으로 실행되면서 H2 DB 파일 생성 권한 문제가 발생appspec.yml의BeforeInstall단계에서 설정한runas: ec2-user옵션이 원인으로 확인됨- App을
ec2-user기준으로 통일하여 배포·실행되도록 맞추려던 설정이 오히려 권한 충돌을 일으킴
해결 방법
appspec.yml의BeforeInstall단계에서runas: ec2-user설정 제거- 배포 전 권한 정리 작업이 정상적으로 수행되도록 수정
- 이후 서버 실행 실패 및 502 Bad Gateway 문제 해결 확인
- 도서관리 시스템 Backend Repo 선정
- GitHub Repository 생성 및 코드 연결
- CodePipeline Source Stage 구성
- CodeBuild를 통한 테스트 및 빌드 자동화
unit-test-buildspec.yml로 단위 테스트 실행buildspec.yml로 배포용 artifact 생성
- 배포 방식 및 배포 전략 논의
- EC2 배포 환경 구성
- CodeDeploy Application / Deployment Group 생성
appspec.yml작성stop.sh,prepare.sh,start.sh,validate.sh작성/home/ec2-user/app경로 배포 확인- Spring Boot 서버 실행 및 Health Check 확인
- ALB 구성 및 Target Group Health Check 설정
- Auto Scaling Group 배포 단계 추가
- CloudWatch Logs로 CodeBuild 로그 수집 / SNS 이메일 구독 생성
- CodePipeline 수동 승인 단계 추가
- 트러블슈팅: H2 DB 권한 문제 → 서버 실행 실패 → 502 Bad Gateway 해결
flowchart TD
Push([GitHub Push]) --> Source["CodePipeline: Source Stage"]
Source --> Build["CodeBuild"]
subgraph Build_Stage["CodeBuild 단계"]
direction LR
T["단위 테스트<br/>(unit-test-buildspec.yml)"]
A["배포용 artifact 생성<br/>(buildspec.yml)"]
end
Build --> Build_Stage
Build_Stage --> Deploy["CodeDeploy"]
Deploy --> ALB["ALB"]
ALB --> ASG["Auto Scaling Group"]
ASG --> EC2["EC2 Instances"]
subgraph Lifecycle["배포 스크립트 실행"]
direction LR
S1["prepare.sh"] --> S2["stop.sh"] --> S3["start.sh"] --> S4["validate.sh<br/>(Health Check: /health)"]
end
EC2 --> Lifecycle
Lifecycle --> Ops["운영 확인"]
Ops --> CW["CloudWatch 로그 수집"]
Ops --> SNS["SNS 이메일 알림"]
Ops --> Manual["수동 승인 단계"]