자동화를 위한 CI/CD 워크플로우
1. GitHub Actions에서 ECR 리포지토리 자동 생성
GitHub Actions에서 AWS CLI 명령을 실행하여 ECR 리포지토리가 없는 경우 자동으로 생성하도록 설정합니다.
2. Docker 이미지 빌드, 태그, 푸시 자동화
GitHub Actions가 코드를 푸시할 때 Docker 이미지를 빌드하고 태그를 자동으로 생성한 뒤, AWS ECR에 푸시하도록 구성합니다.
3. ECS 배포 자동화
AWS CLI 명령어를 통해 ECS에 Task Definition을 자동으로 등록하고, 서비스 업데이트까지 진행되도록 설정합니다.
자동화된 GitHub Actions 워크플로우
프로젝트 디렉토리 경로
.github/workflows/deploy.yml
name: CI/CD Pipeline
# 1. 워크플로우 트리거 설정
# main 브랜치에 코드가 푸시될 때만 이 워크플로우가 실행됩니다.
on:
push:
branches:
- main # main 브랜치에 푸시될 때 실행
jobs:
deploy:
runs-on: ubuntu-latest # 이 작업은 Ubuntu 최신 버전에서 실행됩니다.
steps:
# 2. GitHub 리포지토리에서 코드 체크아웃
# 깃허브 리포지토리의 코드를 가져옵니다.
- name: Checkout code
uses: actions/checkout@v3
# 3. AWS CLI 구성
# AWS 리소스와 상호작용하기 위해 AWS CLI를 설정합니다.
- name: Configure AWS CLI
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }} # 깃허브 액션의 Secrets에 AWS Access Key를 저장해야 함.
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }} # 깃허브 액션의 Secrets에 AWS Secret Key를 저장해야 함.
aws-region: ap-northeast-2 # 사용할 AWS 리전 (예: 서울 리전)
# 4. ECR 리포지토리 확인 및 생성
# Docker 이미지를 저장할 ECR 리포지토리가 존재하지 않을 경우 생성합니다.
- name: Create ECR repository if not exists
run: |
REPO_NAME=my-app # 사용할 ECR 리포지토리 이름을 정의합니다.
# 리포지토리가 있는지 확인하고, 없으면 생성
aws ecr describe-repositories --repository-names $REPO_NAME || \
aws ecr create-repository --repository-name $REPO_NAME
# 5. Amazon ECR 로그인
# AWS ECR에 Docker CLI를 통해 로그인합니다.
- name: Log in to Amazon ECR
run: |
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin <account-id>.dkr.ecr.ap-northeast-2.amazonaws.com
# `<account-id>` 부분에 AWS 계정 ID를 작성해야 합니다.
# 6. Docker 이미지 빌드 및 ECR 푸시
# 로컬에서 Docker 이미지를 빌드하고 ECR에 푸시합니다.
- name: Build and push Docker image
run: |
IMAGE_URI=<account-id>.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest # 푸시할 이미지의 URI
docker build -t my-app . # Docker 이미지 빌드
docker tag my-app:latest $IMAGE_URI # Docker 이미지에 태그 추가
docker push $IMAGE_URI # ECR에 Docker 이미지 푸시
# `<account-id>` 부분에 AWS 계정 ID를 작성해야 합니다.
# 7. ECS 배포
# 새로운 Task Definition을 등록하고 ECS 서비스를 업데이트합니다.
- name: Deploy to ECS
run: |
CLUSTER_NAME=my-app-cluster # ECS 클러스터 이름
SERVICE_NAME=my-app-service # ECS 서비스 이름
TASK_FAMILY=my-app-task # ECS Task Definition 패밀리 이름
# 기존 Task Definition 가져오기
TASK_DEFINITION=$(aws ecs describe-task-definition --task-definition $TASK_FAMILY)
# Task Definition에 새로운 Docker 이미지 URI 반영
NEW_TASK_DEFINITION=$(echo $TASK_DEFINITION | jq --arg IMAGE_URI $IMAGE_URI \
'.taskDefinition | .containerDefinitions[0].image = $IMAGE_URI | del(.status,.taskDefinitionArn,.revision,.requiresAttributes,.compatibilities)')
# 새로운 Task Definition JSON 파일로 저장
echo $NEW_TASK_DEFINITION > new-task-definition.json
# 새 Task Definition 등록 및 ARN 저장
TASK_ARN=$(aws ecs register-task-definition --cli-input-json file://new-task-definition.json --query 'taskDefinition.taskDefinitionArn' --output text)
# ECS 서비스 업데이트
aws ecs update-service --cluster $CLUSTER_NAME --service $SERVICE_NAME --task-definition $TASK_ARN
# Task Definition의 ARN이 서비스에 반영되며 새로운 컨테이너를 실행합니다.
Secrets 설정
- AWS_ACCESS_KEY_ID와 AWS_SECRET_ACCESS_KEY를 GitHub Secrets에 추가:
- GitHub 리포지토리 > Settings > Secrets and variables > Actions로 이동.
- New repository secret 클릭 후 아래 키-값 쌍 추가:
- AWS_ACCESS_KEY_ID: AWS Access Key
- AWS_SECRET_ACCESS_KEY: AWS Secret Key
ECR 설정
- <account-id>: AWS 계정 ID를 ECR URI에 반영해야 합니다. 예를 들어:
123456789012.dkr.ecr.ap-northeast-2.amazonaws.com
- REPO_NAME: ECR 리포지토리 이름입니다. 위 예제에서는 my-app으로 지정.
ECS 설정
- CLUSTER_NAME: ECS 클러스터 이름입니다. (예: my-app-cluster)
- SERVICE_NAME: ECS 서비스 이름입니다. (예: my-app-service)
- TASK_FAMILY: ECS Task Definition 이름입니다. (예: my-app-task)
Docker 이미지 태그
- IMAGE_URI: AWS ECR에 푸시할 이미지의 URI입니다.
- 형식: <account-id>.dkr.ecr.<region>.amazonaws.com/<repository-name>:<tag>
- 예: 123456789012.dkr.ecr.ap-northeast-2.amazonaws.com/my-app:latest
'틱톡 웹 만들기 풀스택 프로젝트' 카테고리의 다른 글
Node.js 미들웨어 Multer를 사용해서 파일 전송하기 (1) | 2024.11.20 |
---|---|
3일차) 웹 영상편집 기능구현을 위한 FFmpeg 프레임워크 (0) | 2024.11.15 |
2일차) 프로젝트에 필요한 기술스텍과 라이브러리 정하기 (2) | 2024.11.15 |
1일차) 협업툴**노션**을 활용해서 프로젝트 계획하기 (2) | 2024.11.14 |