최근 프로젝트에서 Gitea, AWS ECR, Jenkins, Docker-Compose, 그리고 AWS Elastic Beanstalk(EB)를 활용하여 CI/CD 파이프라인을 구성하는 작업을 진행했습니다. 이 포스팅에서는 CI/CD 환경 구축 과정과 함께 발생했던 문제 및 이를 해결한 과정을 기록하고자 합니다.
1. 프로젝트 개요
목표
Django 기반의 웹 애플리케이션과 이를 지원하는 서비스(Nginx, Redis, TensorFlow)를 Docker-Compose로 구성하고, AWS Elastic Beanstalk를 통해 배포 및 관리하며, CI/CD를 통해 코드 변경 사항이 자동으로 배포되도록 하는 환경 구축.
사용 기술 스택
Gitea: 코드 저장소 관리
AWS ECR: Docker 이미지를 저장
Jenkins: CI/CD 자동화
Docker-Compose: 컨테이너 오케스트레이션
AWS Elastic Beanstalk: 배포 및 운영 환경
Redis: 캐시 및 세션 관리
TensorFlow Serving: 모델 서빙
Nginx: Reverse Proxy와 정적 파일 제공
2. CI/CD 파이프라인 구축
2.1 Gitea 설정
Gitea를 프로젝트의 소스 코드 저장소로 사용했습니다. Gitea의 Webhook 기능을 통해 Jenkins와 통합하여 코드 변경 시 자동으로 빌드가 트리거되도록 설정했습니다.
Webhook 설정:
Gitea에서 프로젝트 Repository 설정으로 이동
Webhook 추가 → Jenkins URL 및 토큰 입력
2.2 AWS ECR 설정
AWS ECR을 Docker 이미지를 저장하는 레지스트리로 사용했습니다.
ECR 설정 과정:
AWS 콘솔에서 ECR 리포지토리를 생성
Jenkins의 빌드 스크립트에서 aws ecr get-login-password를 통해 ECR에 로그인
프로젝트 이름을 설정합니다. 예를 들어, my-php-app-build와 같이 명명할 수 있습니다.
5.2 환경 설정
소스 공급자에서 AWS CodeCommit을 선택하고, 앞서 만든 리포지토리(2번 항목 Git 생성)와 브랜치(master)를 선택합니다.
빌드 환경에서 환경 이미지를 설정합니다.
운영체제: Amazon Linux를 선택합니다.
런타임: Standard를 선택합니다.
이미지: aws/codebuild/amazonlinux2-x86_64-standard:5.0 등 최신 버전의 이미지를 선택합니다.
빌드 사양: 빌드 명령 삽입을 선택합니다. 아래 buildspec.yml 내용을 입력합니다.
version: 0.2
env:
variables:
REPOSITORY_URI: <생성된 ECR의 URI주소로 변경>
IMAGE_TAG: latest
AWS_REGION: ap-northeast-2
IMAGE_NAME: my-php-app
phases:
install:
commands:
- echo Installing dependencies...
# Docker는 기본적으로 설치되어 있어야 하므로, 필요 시 추가 작업을 여기에 명시할 수 있습니다.
# 예: sudo yum install -y docker
pre_build:
commands:
- echo Logging in to Amazon ECR...
- aws ecr get-login-password --region $AWS_REGION | docker login --username AWS --password-stdin $REPOSITORY_URI
build:
commands:
- echo Building the Docker image...
- docker build -t $IMAGE_NAME .
- docker tag $IMAGE_NAME:$IMAGE_TAG $REPOSITORY_URI:$IMAGE_TAG
post_build:
commands:
- echo Pushing the Docker image to ECR...
- docker push $REPOSITORY_URI:$IMAGE_TAG
artifacts:
files:
- '**/*'
5.3 artifact 설정
유형으로 S3를 선택합니다.
사용할 서비스명으로 S3를 생성합니다.
아티팩트 패키징에서 Zip 설정합니다.
5.3 build 실행
빌드 시작으로 오류가 없는지 Test합니다.
이상이 없다면 빌드 상태가 성공함으로 표시됩니다.
6. Elastic Beanstalk(EB)에 애플리케이션 배포하기
AWS Elastic Beanstalk는 애플리케이션을 쉽고 빠르게 배포할 수 있는 관리형 서비스로, 인프라 프로비저닝, 로드 밸런싱, 오토스케일링 등의 기능을 자동으로 제공합니다. 이 과정에서는 ECR에 저장된 Docker 이미지를 사용해 Elastic Beanstalk 환경에 애플리케이션을 배포하는 방법을 설명하겠습니다.