목차
- 개요
- 사전 준비사항
- 아키텍처
- Step 1: IAM 역할 생성
- Step 2: ECR 리포지토리 생성
- Step 3: VPC 및 보안 그룹 설정
- Step 4: Application Load Balancer 생성
- Step 5: ECS 클러스터 생성
- Step 6: Task Definition 생성
- Step 7: ECS 서비스 생성
- Step 8: CodeCommit 리포지토리 생성
- Step 9: CodeBuild 프로젝트 생성
- Step 10: CodePipeline 생성
- Step 11: 배포 테스트
개요
이 가이드는 AWS에서 CodeCommit, CodeBuild, CodePipeline을 사용하여 ECS Fargate에 Rolling Update 배포를 구성하는 방법을 단계별로 설명합니다.
사용할 AWS 서비스
- CodeCommit: Git 기반 소스 코드 저장소
- CodeBuild: 도커 이미지 빌드 및 ECR 푸시
- CodePipeline: CI/CD 파이프라인 오케스트레이션
- ECR: 도커 이미지 저장소
- ECS Fargate: 서버리스 컨테이너 실행 환경
- Application Load Balancer: 트래픽 분산
사전 준비사항
필수 요구사항
- AWS 계정
- AWS CLI 설치 및 구성
- Git 설치
- Docker 설치 (로컬 테스트용, 선택사항)
아키텍처
전체 워크플로우
개발자 → CodeCommit (Push)
↓
CodePipeline (자동 트리거)
↓
CodeBuild (Docker 이미지 빌드)
↓
ECR (이미지 저장)
↓
ECS Fargate (Rolling Update 배포)
↓
ALB (트래픽 라우팅)
Step 1: IAM 역할 생성
ECS와 CodeBuild가 AWS 리소스에 접근하기 위한 IAM 역할을 생성합니다.
1.1 ECS Task Execution Role 생성
ECS 작업이 ECR 이미지를 가져오고 로그를 CloudWatch에 전송하기 위한 역할입니다.
- AWS 콘솔에서 IAM 서비스로 이동
- 왼쪽 메뉴에서 역할(Roles) 클릭
- 역할 생성 버튼 클릭
- 신뢰할 수 있는 엔터티 선택:
- AWS 서비스 선택
- 사용 사례: Elastic Container Service 선택
- 하위 옵션: Elastic Container Service Task 선택
- 다음 클릭
- 권한 정책 연결:
- 검색창에
AmazonECSTaskExecutionRolePolicy입력 - 해당 정책 체크박스 선택
- 다음 클릭
- 검색창에
-
역할 세부 정보:
- 역할 이름:
test-ecsTaskExecutionRole - 설명:
ECS Task Execution Role for pulling images and logging - 역할 만들기 클릭
- 역할 이름:
1.2 ECS Task Role 생성 (선택사항)
작업 내 애플리케이션이 AWS 서비스에 접근해야 하는 경우에만 필요합니다 (예: S3, DynamoDB 등).
ECS에서 실행되는 컨테이너에 역할을 부여해서 사용할 수 있습니다. (이 가이드에서는 없이 생성을 진행합니다.)
Step 2: ECR 리포지토리 생성
도커 이미지를 저장할 ECR(Elastic Container Registry) 리포지토리를 생성합니다.
- AWS 콘솔에서 Amazon ECR 서비스로 이동
- 왼쪽 메뉴에서 리포지토리 클릭
-
리포지토리 생성 버튼 클릭
- 리포지토리 설정:
- 가시성 설정: 프라이빗 선택
-
리포지토리 이름:
nginx-app - 태그 변경 가능성: 활성화 (권장)
-
이미지 스캔 설정:
- 푸시 시 스캔 활성화 (선택사항)
- KMS 암호화: 기본 암호화 사용 (선택사항)
- 리포지토리 생성 클릭
- 생성된 리포지토리의 URI를 복사하여 메모해둡니다.
- 형식:
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/nginx-app - 이 URI는 나중에 buildspec.yml에서 사용됩니다.
- 형식:
Step 3: VPC 및 보안 그룹 설정
3.1 VPC 확인
기본 VPC를 사용하거나 기존 VPC를 사용합니다.
- VPC 서비스로 이동
- 왼쪽 메뉴에서 VPC 선택
- 기본 VPC 확인 또는 사용할 VPC 선택
요구사항:
- 최소 2개의 가용 영역(AZ)에 퍼블릭 서브넷 필요 (ALB용)
- 최소 2개의 가용 영역에 프라이빗 서브넷 권장 (ECS 작업용)
참고: 프라이빗 서브넷에서 ECS 작업 실행 시 ECR 접근을 위해 NAT Gateway 또는 VPC 엔드포인트가 필요합니다. 테스트 목적으로는 퍼블릭 서브넷 사용 가능합니다.
3.2 보안 그룹 생성
3.2.1 ALB 보안 그룹
인터넷에서 ALB로의 HTTP/HTTPS 트래픽을 허용하는 보안 그룹입니다.
- VPC → 보안 그룹 메뉴 선택
- 보안 그룹 생성 버튼 클릭
- 기본 세부 정보:
-
보안 그룹 이름:
alb-security-group -
설명:
Security group for Application Load Balancer - VPC: 사용할 VPC 선택
-
보안 그룹 이름:
-
인바운드 규칙 추가:
- 규칙 추가 클릭
- 유형: HTTP
- 프로토콜: TCP
- 포트 범위: 80
- 소스: 0.0.0.0/0 (어디서나)
- 설명: Allow HTTP from internet
(HTTPS 사용 시 추가):
- 규칙 추가 클릭
- 유형: HTTPS
- 프로토콜: TCP
- 포트 범위: 443
- 소스: 0.0.0.0/0
- 설명: Allow HTTPS from internet
- 아웃바운드 규칙:
- 기본값 유지 (모든 트래픽 허용)
-
보안 그룹 생성 클릭
3.2.2 ECS Task 보안 그룹
ALB에서 ECS 작업으로의 트래픽을 허용하는 보안 그룹입니다.
- 보안 그룹 생성 클릭
- 기본 세부 정보:
-
보안 그룹 이름:
ecs-task-security-group -
설명:
Security group for ECS tasks - VPC: 동일한 VPC 선택
-
보안 그룹 이름:
- 인바운드 규칙:
- 규칙 추가 클릭
- 유형: 사용자 지정 TCP
- 프로토콜: TCP
- 포트 범위: 80
-
소스: 사용자 지정
- 검색창에 위에서 생성한
alb-security-group의 보안 그룹 ID 입력 - 또는
alb-security-group이름 검색하여 선택
- 검색창에 위에서 생성한
- 설명: Allow traffic from ALB
- 아웃바운드 규칙:
- 기본값 유지 (모든 트래픽 허용)
- 보안 그룹 생성 클릭
Step 4: Application Load Balancer 생성
트래픽을 ECS 작업으로 분산하는 ALB를 생성합니다.
4.1 Target Group 생성
먼저 ECS 작업을 등록할 대상 그룹(Target Group)을 생성합니다.
- EC2 서비스로 이동
- 왼쪽 메뉴에서 대상 그룹(Target Groups) 선택
- 대상 그룹 생성 버튼 클릭
-
기본 구성:
-
대상 유형 선택: IP 주소 선택 중요
- Fargate는 IP 기반 타겟 그룹을 사용합니다.
-
대상 그룹 이름:
nginx-target-group - 프로토콜: HTTP
- 포트: 80
- VPC: 사용할 VPC 선택
- 프로토콜 버전: HTTP1
-
대상 유형 선택: IP 주소 선택 중요
-
상태 검사(Health Check) 설정:
이 설정은 컨테이너 내부에서 돌아가는 애플리케이션 실행 확인을 위한 경로입니다. 따라서 실행되는 애플리케이션마다 다르게 설정됩니다.
- 상태 검사 프로토콜: HTTP
-
상태 검사 경로:
/ -
고급 상태 검사 설정 펼치기:
- 정상 임계 값: 2 (연속 성공 횟수)
- 비정상 임계 값: 2 (연속 실패 횟수)
- 제한 시간: 5초
- 간격: 30초
- 성공 코드: 200
- 다음 클릭
- 대상 등록 페이지:
-
대상 등록하지 않음 (ECS가 등록하기 때문에 제거를 누른뒤 진행합니다.)
- 대상 그룹 생성 클릭
-
대상 등록하지 않음 (ECS가 등록하기 때문에 제거를 누른뒤 진행합니다.)
4.2 Application Load Balancer 생성
- EC2 → 로드 밸런서 메뉴 선택
- 로드 밸런서 생성 버튼 클릭
-
Application Load Balancer 선택 → 생성 클릭
- 기본 구성:
-
로드 밸런서 이름:
nginx-alb - 체계: 인터넷 경계(Internet-facing) 선택
- IP 주소 유형: IPv4
-
로드 밸런서 이름:
- 네트워크 매핑:
- VPC: 사용할 VPC 선택
-
매핑: 최소 2개의 가용 영역 선택
- 각 AZ에서 퍼블릭 서브넷 선택
- 예: ap-northeast-2a, ap-northeast-2c
- 보안 그룹:
- 기본 보안 그룹 제거
-
보안 그룹 선택:
alb-security-group선택
- 리스너 및 라우팅:
-
리스너 섹션 확인:
- 프로토콜: HTTP
- 포트: 80
- 기본 작업: 대상 그룹에 전달
-
기본 작업:
nginx-target-group선택
-
리스너 섹션 확인:
- 요약 확인 후 로드 밸런서 생성 클릭
- 생성 완료 후:
- ALB의 DNS 이름을 복사하여 메모
- 형식:
nginx-alb-1234567890.ap-northeast-2.elb.amazonaws.com - 이 DNS로 애플리케이션에 접근합니다 (route 53을 사용해서 도메인 연결시 도메인으로 접근가능하고 SSL/TLS 설정 가능합니다.)
참고: ALB가 활성화되기까지 2-3분 정도 걸립니다.
Step 5: ECS 클러스터 생성
ECS 작업을 실행할 클러스터를 생성합니다.
- AWS 콘솔에서 Amazon ECS 서비스로 이동
- 왼쪽 메뉴에서 클러스터 선택
-
클러스터 생성 버튼 클릭
- 클러스터 구성:
-
클러스터 이름:
nginx-cluster -
인프라:
- AWS Fargate (서버리스) 선택
- EC2 인스턴스는 선택하지 않음
-
클러스터 이름:
- 모니터링 (선택사항):
-
Container Insights:
- 상세 모니터링이 필요한 경우 활성화
- 비용이 발생하므로 테스트용은 비활성화 권장
-
Container Insights:
- 태그 (선택사항):
- 필요시 태그 추가 (예: Environment=Production)
- 생성 클릭
Step 6: Task Definition 생성
컨테이너 실행 구성을 정의하는 Task Definition을 생성합니다.
- ECS → 작업 정의(Task Definitions) 메뉴 선택
- 새 작업 정의 생성 버튼 클릭
6.1 작업 정의 구성
-
작업 정의 패밀리 구성:
-
작업 정의 패밀리:
nginx-task -
컨테이너 이름:
nginx-container - 리소스 할당:
- 앱 환경: AWS Fargate (서버리스)
- 운영 체제/아키텍처: Linux/X86_64
-
작업 크기:
- CPU: 0.25 vCPU (256)
- 메모리: 0.5 GB (512 MB)
- 작은 nginx 애플리케이션에 충분
- 작업 역할:
- 작업 역할: 없음 (애플리케이션이 AWS 서비스 접근 불필요)
-
작업 실행 역할:
ecsTaskExecutionRole선택- ECR 이미지 가져오기 및 로그 전송에 필요
-
이미지 URI: ECR 리포지토리 URI 입력
- 예:
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/nginx-app:latest - 초기에는 이미지가 없어도 입력 가능 (나중에 CodeBuild가 푸시)
- 예:
-
작업 정의 패밀리:
- 필수 컨테이너 설정:
-
포트 매핑:
- 컨테이너 포트: 80
- 프로토콜: TCP
- 포트 이름: nginx-80-tcp (자동 생성)
- 앱 프로토콜: HTTP
-
포트 매핑:
- 환경 변수 (선택사항):
- 필요시 환경 변수 추가
- 기본 nginx는 불필요
- 로그 수집 (컨테이너 섹션):
- 컨테이너 정의로 돌아가서 로그 수집 섹션 찾기
- 로그 수집 사용 활성화
-
awslogs-group:
/ecs/nginx-task(자동 생성)
- awslogs-region: ap-northeast-2 (현재 리전)
- awslogs-stream-prefix: nginx
- 모든 설정 확인 후 생성 클릭
Step 7: ECS 서비스 생성
Task Definition을 기반으로 ECS 서비스를 생성합니다.
참고: 초기 이미지가 ECR에 없으면 작업이 실패할 수 있습니다. 다음 단계에서 이미지를 푸시한 후 서비스를 업데이트하거나 재생성합니다. 태스크를 0으로 실행시 정상적으로 생성됩니다.
-
ECS → 클러스터 →
nginx-cluster선택 - 서비스 탭에서 생성 버튼 클릭
작업 정의:
-
패밀리:
nginx-task - 리비전: LATEST (최신)
서비스 이름:
-
서비스 이름:
nginx-service
7.1 환경 설정
- 컴퓨팅 구성:
- 컴퓨팅 옵션: 시작 유형
- 시작 유형: FARGATE
- 플랫폼 버전: LATEST
7.2 배포 구성
- 서비스 유형:
- 복제본 선택
- 원하는 작업:
- 원하는 작업: 0
- 현재 이미지가 없으므로 0으로 설정합니다 추후 원하는 개수로 변경 가능합니다.
7.3 배포 옵션
- 배포 유형:
- 롤링 업데이트 선택 (기본값)
- 배포 구성 (고급):
-
최소 정상 백분율: 100
- 배포 중에도 100% 용량 유지
-
최대 백분율: 200
- 배포 시 일시적으로 2배까지 작업 실행 가능
- 이 설정으로 무중단 배포 가능
-
최소 정상 백분율: 100
7.4 네트워킹
- VPC:
- 사용할 VPC 선택
- 서브넷:
- 최소 2개의 서브넷 선택 (다른 AZ)
- 프라이빗 서브넷 권장 (NAT Gateway 필요)
- 테스트용은 퍼블릭 서브넷 사용 가능
- 보안 그룹:
- 기존 보안 그룹 사용 선택
-
ecs-task-security-group선택
- 퍼블릭 IP:
- 프라이빗 서브넷 사용 시: 비활성화
- 퍼블릭 서브넷 사용 시: 활성화
7.5 로드 밸런싱
- 로드 밸런서 유형:
- Application Load Balancer 선택
- 컨테이너:
- 컨테이너: nginx-container 80:80 선택
- 로드 밸런서 사용 선택
- 로드 밸런서:
- 기존 로드 밸런서 사용 선택
-
nginx-alb선택
- 리스너:
- 기존 리스너 사용 선택
- 80:HTTP 선택
- 대상 그룹:
- 기존 대상 그룹 사용 선택
-
nginx-target-group선택
7.6 서비스 자동 크기 조정 (선택사항)
- 서비스 자동 크기 조정:
- 서비스 자동 크기 조정 사용 안 함 선택
- 프로덕션 환경에서는 활성화 권장
7.7 생성
- 모든 설정 검토 후 생성 클릭
- 서비스 생성 후 작업 탭에서 작업 상태 확인:
- PROVISIONING → PENDING → RUNNING
참고: 초기 이미지가 ECR에 없으면 작업이 실패할 수 있습니다. 다음 단계에서 이미지를 푸시한 후 서비스를 업데이트하거나 재생성합니다.
Step 8: CodeCommit 리포지토리 생성
소스 코드를 관리할 CodeCommit 리포지토리를 생성합니다.
8.1 리포지토리 생성
- AWS 콘솔에서 CodeCommit 서비스로 이동
-
리포지토리 생성 버튼 클릭
- 리포지토리 설정:
-
리포지토리 이름:
nginx-app-repo -
설명:
Nginx application repository for ECS deployment - 태그 (선택사항): 필요시 추가
-
리포지토리 이름:
- 생성 클릭
8.2 Git 자격 증명 설정
HTTPS Git 자격 증명 방법 (권장)
- IAM 콘솔로 이동
- 왼쪽 메뉴에서 사용자 선택
- 본인의 IAM 사용자 선택
- 보안 자격 증명 탭 클릭
- AWS CodeCommit에 대한 HTTPS Git 자격 증명 섹션 찾기
- 자격 증명 생성 버튼 클릭
- 생성된 사용자 이름과 암호를 다운로드 또는 복사하여 안전하게 보관
- 이 정보는 다시 확인할 수 없으므로 주의
8.3 로컬에서 리포지토리 클론
# 리포지토리 클론 (리전과 리포지토리 이름 확인)
git clone https://git-codecommit.ap-northeast-2.amazonaws.com/v1/repos/nginx-app-repo
# 디렉토리 이동
cd nginx-app-repo
# Git 사용자 정보 설정 (선택사항)
git config user.name "Your Name"
git config user.email "your.email@example.com"인증 프롬프트: Git 자격 증명 입력 요청 시 위에서 생성한 사용자 이름과 암호를 입력합니다.
8.4 애플리케이션 파일 생성
Dockerfile
컨테이너 이미지를 빌드하기 위한 Dockerfile을 생성합니다.
FROM nginx:alpine
# 커스텀 HTML 페이지 복사
COPY index.html /usr/share/nginx/html/index.html
# 포트 80 노출
EXPOSE 80
# Nginx 실행 (alpine 이미지의 기본 명령 사용)
CMD ["nginx", "-g", "daemon off;"]index.html
웹 페이지 파일을 생성합니다.
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Nginx on AWS ECS</title>
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
body {
font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
display: flex;
justify-content: center;
align-items: center;
min-height: 100vh;
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
color: white;
}
.container {
text-align: center;
padding: 3rem;
background: rgba(255, 255, 255, 0.1);
border-radius: 20px;
backdrop-filter: blur(10px);
box-shadow: 0 8px 32px 0 rgba(31, 38, 135, 0.37);
max-width: 600px;
}
h1 {
font-size: 3rem;
margin-bottom: 1rem;
text-shadow: 2px 2px 4px rgba(0, 0, 0, 0.3);
}
@keyframes bounce {
0%, 100% { transform: translateY(0); }
50% { transform: translateY(-20px); }
}
p {
font-size: 1.3rem;
margin-bottom: 2rem;
line-height: 1.6;
}
.info {
background: rgba(255, 255, 255, 0.2);
padding: 1.5rem;
border-radius: 10px;
margin-top: 2rem;
}
.info-item {
display: flex;
justify-content: space-between;
margin: 0.5rem 0;
font-size: 1rem;
}
.label {
font-weight: bold;
opacity: 0.9;
}
.value {
font-family: 'Courier New', monospace;
background: rgba(0, 0, 0, 0.2);
padding: 0.2rem 0.5rem;
border-radius: 5px;
}
.version {
margin-top: 2rem;
font-size: 1.2rem;
opacity: 0.8;
font-weight: bold;
}
</style>
</head>
<body>
<div class="container">
<h1>ECS 배포 성공!</h1>
<p>Nginx가 AWS ECS Fargate에서 성공적으로 실행 중입니다</p>
<div class="info">
<div class="info-item">
<span class="label">플랫폼:</span>
<span class="value">AWS ECS Fargate</span>
</div>
<div class="info-item">
<span class="label">웹 서버:</span>
<span class="value">Nginx (Alpine)</span>
</div>
<div class="info-item">
<span class="label">CI/CD:</span>
<span class="value">CodePipeline</span>
</div>
</div>
<div class="version">Version: 1.0.0</div>
</div>
</body>
</html>buildspec.yml
CodeBuild가 사용할 빌드 명세 파일입니다.
version: 0.2
phases:
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws --version
# ECR 리포지토리 URI 설정 (실제 값으로 변경 필요)
- REPOSITORY_URI=123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/nginx-app
- AWS_ACCOUNT_ID=$(echo $REPOSITORY_URI | cut -d'.' -f1)
- AWS_REGION=ap-northeast-2
# ECR 로그인
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REPOSITORY_URI
# 이미지 태그 생성 (커밋 해시 사용)
- COMMIT_HASH=$(echo $CODEBUILD_RESOLVED_SOURCE_VERSION | cut -c 1-7)
- IMAGE_TAG=${COMMIT_HASH:=latest}
- echo Building image with tag $IMAGE_TAG
build:
commands:
- echo Build started on `date`
- echo Building the Docker image...
- docker build -t $REPOSITORY_URI:latest .
- docker tag $REPOSITORY_URI:latest $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Build completed on `date`
- echo Pushing the Docker images...
- docker push $REPOSITORY_URI:latest
- docker push $REPOSITORY_URI:$IMAGE_TAG
- echo Writing image definitions file...
# ECS 배포를 위한 이미지 정의 파일 생성
- printf '[{"name":"nginx-container","imageUri":"%s"}]' $REPOSITORY_URI:$IMAGE_TAG > imagedefinitions.json
- echo Image definitions file created
- cat imagedefinitions.json
artifacts:
files:
- imagedefinitions.json중요:
REPOSITORY_URI값을 실제 ECR 리포지토리 URI로 변경하세요
.gitignore (선택사항)
# IDE
.vscode/
.idea/
# OS
.DS_Store
Thumbs.db
# Docker
.dockerignore
8.5 코드 커밋 및 푸시
모든 파일을 생성한 후 Git에 커밋하고 CodeCommit에 푸시합니다.
# 모든 파일 추가
git add .
# 커밋
git commit -m "Initial commit: Add nginx application with ECS deployment config"
# main 브랜치로 푸시
git push origin main리포지토리에 다음 파일들이 있어야 합니다:
- Dockerfile
- index.html
- buildspec.yml
- .gitignore (선택사항)
Step 9: CodeBuild 프로젝트 생성
Docker 이미지를 빌드하고 ECR에 푸시할 CodeBuild 프로젝트를 생성합니다.
- AWS 콘솔에서 CodeBuild 서비스로 이동
- 빌드 프로젝트 생성 버튼 클릭
9.1 프로젝트 구성
- 프로젝트 정보:
-
프로젝트 이름:
nginx-app-build -
설명:
Build Docker image for nginx application - 빌드 배지: 선택사항 (공개 리포지토리에 유용)
-
프로젝트 이름:
9.2 소스
- 소스 공급자:
- 소스 공급자: AWS CodeCommit 선택
-
리포지토리:
nginx-app-repo선택 - 참조 유형: 브랜치
-
브랜치:
main
- 추가 구성 (선택사항):
- Git 복제 깊이: 1 (단일 커밋만 가져오기, 빌드 속도 향상)
9.3 환경
- 환경 이미지:
- 관리형 이미지 선택
- 운영 체제:
- Amazon Linux 선택
- 런타임:
- Standard 선택
- 이미지:
- aws/codebuild/amazonlinux2-x86_64-standard:5.0 선택 (최신 버전)
- 또는 이 런타임 버전에 항상 최신 이미지 사용 선택
- 이미지 버전:
- 이 런타임 버전에 항상 최신 이미지 사용 권장
- 서비스 역할:
- 새 서비스 역할 선택
-
역할 이름:
codebuild-nginx-app-service-role(자동 생성)
-
권한 있는 모드 활성화 체크 (Docker 빌드 필수!)
- 이 옵션 없이는 Docker 이미지를 빌드할 수 없습니다
9.4 추가 구성
- 제한 시간:
- 시간: 0, 분: 60 (1시간, 일반적으로 충분)
- 컴퓨팅:
- 3 GB 메모리, 2 vCPU (작은 프로젝트에 적합)
- 대규모 프로젝트는 더 높은 사양 선택
- 환경 변수 (선택사항):
- buildspec.yml에서 하드코딩하지 않고 환경 변수로 관리 가능
- 예:
- 이름:
AWS_DEFAULT_REGION, 값:ap-northeast-2 - 이름:
AWS_ACCOUNT_ID, 값:123456789012 - 이름:
IMAGE_REPO_NAME, 값:nginx-app
- 이름:
9.5 Buildspec
- 빌드 사양:
- buildspec 파일 사용 선택
-
Buildspec 이름:
buildspec.yml(기본값)
9.6 아티팩트
- 아티팩트:
- 유형: 아티팩트 없음
- 나중에 CodePipeline이 자동으로 관리하므로 여기서는 설정하지 않음
9.7 로그
- CloudWatch 로그:
- CloudWatch 로그 활성화
-
그룹 이름:
/aws/codebuild/nginx-app-build(자동 생성) - 스트림 이름: 비워두기 (자동 생성)
- 빌드 프로젝트 생성 클릭
9.8 IAM 권한 추가
CodeBuild 서비스 역할에 ECR 접근 권한을 추가해야 합니다.
- IAM 콘솔로 이동
-
역할 →
codebuild-nginx-app-service-role선택 - 권한 추가 → 정책 연결 클릭
- 검색창에
AmazonEC2ContainerRegistryPowerUser입력 - 해당 정책 체크박스 선택
- 권한 추가 클릭
또는 인라인 정책으로 추가 (더 세밀한 권한 제어):
- 권한 추가 → 인라인 정책 생성 클릭
- JSON 탭 선택
- 다음 정책 입력:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ecr:GetAuthorizationToken"
],
"Resource": "*"
},
{
"Effect": "Allow",
"Action": [
"ecr:BatchCheckLayerAvailability",
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload"
],
"Resource": "arn:aws:ecr:ap-northeast-2:123456789012:repository/nginx-app"
}
]
}중요: ARN의 리전과 계정 ID, 리포지토리 이름을 실제 값으로 변경하세요!
- 정책 검토 클릭
-
이름:
ECRAccessPolicy - 정책 생성 클릭
9.9 첫 빌드 실행 (테스트)
권한 설정 후 빌드를 테스트합니다.
- CodeBuild 프로젝트 페이지에서 빌드 시작 버튼 클릭
-
빌드 시작 확인
- 빌드 로그 확인:
- Phase details에서 각 단계 진행 상황 확인
- pre_build: ECR 로그인
- build: Docker 이미지 빌드
- post_build: ECR에 이미지 푸시
- 빌드 성공 확인:
- 상태: 성공 (초록색)
- 소요 시간 확인
- ECR 리포지토리에서 이미지 확인:
-
ECR 콘솔 →
nginx-app리포지토리 - 푸시된 이미지 태그 확인 (latest, 커밋 해시)
-
ECR 콘솔 →
Step 10: CodePipeline 생성
전체 CI/CD 파이프라인을 구성하여 CodeCommit → CodeBuild → ECS 배포를 자동화합니다.
- AWS 콘솔에서 CodePipeline 서비스로 이동
-
파이프라인 생성 버튼 클릭
카테고리 사용자 지정 파이프라인 빌드 선택
10.1 파이프라인 설정
- 파이프라인 설정:
-
파이프라인 이름:
nginx-app-pipeline -
서비스 역할: 새 서비스 역할 선택
- 역할 이름:
AWSCodePipelineServiceRole-ap-northeast-2-nginx-app(자동)
- 역할 이름:
-
파이프라인 이름:
-
고급 설정:
- 아티팩트 스토어: 기본 위치 (S3 버킷 자동 생성)
- 암호화 키: 기본 AWS 관리형 키 선택
- 다음 클릭
10.2 소스 단계 추가
- 소스 공급자:
- 소스 공급자: AWS CodeCommit 선택
-
리포지토리 이름:
nginx-app-repo선택 -
브랜치 이름:
main
- 변경 감지 옵션:
- Amazon EventBridge Events 선택 ( 옵션 )
- 코드 푸시 시 자동으로 파이프라인 트리거
-
출력 아티팩트 형식:
- CodePipeline 기본값 선택
- 다음 클릭
10.3 빌드 단계 추가
- 빌드 공급자:
- 기타 빌드 공급자 선택
- 빌드 공급자: AWS CodeBuild 선택
- 리전: 현재 리전 (ap-northeast-2)
-
프로젝트 이름:
nginx-app-build선택
-
빌드 유형:
- 단일 빌드 선택
- 다음 클릭
10.4 배포 단계 추가
- 배포 공급자:
- 배포 공급자: Amazon ECS 선택
- 리전: 현재 리전
- 입력 아티팩트:
- BuildArtifact 자동 선택 (CodeBuild 출력)
- 클러스터 이름:
-
클러스터 이름:
nginx-cluster선택
-
클러스터 이름:
- 서비스 이름:
-
서비스 이름:
nginx-service선택
-
서비스 이름:
-
이미지 정의 파일:
-
이미지 정의 파일:
imagedefinitions.json - CodeBuild가 생성한 파일 이름
-
이미지 정의 파일:
- 다음 클릭
10.5 검토 및 생성
-
모든 단계 검토:
- 소스: CodeCommit (
nginx-app-repo,main) - 빌드: CodeBuild (
nginx-app-build) - 배포: ECS (
nginx-cluster,nginx-service)
- 소스: CodeCommit (
- 파이프라인 생성 클릭
- 파이프라인이 자동으로 첫 실행을 시작합니다.
10.6 파이프라인 실행 확인
- 각 단계 진행 상황 확인:
- Source: CodeCommit에서 코드 가져오기
- Build: CodeBuild에서 이미지 빌드 및 ECR 푸시
- Deploy: ECS 서비스 업데이트 (Rolling Update)
- 각 단계 클릭하여 세부 정보 확인 가능
-
모든 단계가 성공하면 성공 상태 확인
오류 메시지: The provided role does not have sufficient permissions to access ECS
원인: CodePipeline 생성 시 자동으로 생성된 ECS 배포 정책의 Resource ARN이 잘못되었습니다.
해결방법: IAM 콘솔에서 CodePipeline 서비스 역할(AWSCodePipelineServiceRole-ap-northeast-2-nginx-app-pipeline)의 ECS 배포 정책을 편집하여 33번째 줄의 Resource ARN을
arn:aws:ecs:*:{사용자 계정번호}:task-definition/arn:aws:ecs:ap-northeast-2:286387522454:task-definition/nginx-task:2:*에서arn:aws:ecs:ap-northeast-2:{사용자 계정번호}:task-definition/nginx-task:*로 수정합니다.
배포 성공 후 ECS의 서비스에 들어가서 서비스 태스크 개수를 원하는 개수로 업데이트 합니다.
새 배포 강제 적용 체크 후 태스크 개수를 변경합니다.
Step 11: 배포 테스트
11.1 파이프라인 실행 확인
- CodePipeline 콘솔에서
nginx-app-pipeline선택 - 각 단계의 실행 상태 확인:
- Source: 성공
- Build: 성공
- Deploy: 성공
11.2 ECS 서비스 확인
-
ECS 콘솔 → 클러스터 →
nginx-cluster선택 -
서비스 탭 →
nginx-service선택
-
작업 탭에서 실행 중인 작업 확인:
- 상태: RUNNING
- 작업 개수: 2개
-
배포 탭에서 최근 배포 확인:
- 배포 상태: PRIMARY
- 배포 유형: ECS (Rolling Update)
11.3 로드 밸런서 확인
-
EC2 → 로드 밸런서 →
nginx-alb선택 - DNS 이름 복사
-
대상 그룹 탭에서
nginx-target-group선택 -
대상 탭에서 등록된 대상 확인:
- 등록된 대상: 2개 (ECS 작업의 IP)
- 상태: healthy
11.4 애플리케이션 접근 테스트
-
브라우저에서 ALB DNS 이름으로 접속:
http://nginx-alb-1234567890.ap-northeast-2.elb.amazonaws.com - "ECS 배포 성공!" 페이지가 표시되는지 확인
- 페이지 내용 확인:
- 배포 방식: Rolling Update
- 플랫폼: AWS ECS Fargate
- Version: 1.0.0
댓글
댓글 0개
댓글을 남기려면 로그인하세요.