[BONBON] CI/CD 파이프라인 설계, 구축, 시연 (Flask)

나무나무·2025년 8월 8일

프로젝트 BonBon

목록 보기
9/10

AWS 사양

  • Front End : Route53, ACM, S3, CloudFront
  • Back End : S3, EC2, AutoScaling Group, CodeDeploy(Blue-Green)
  • Machin Learning : S3, EC2, CodeDeploy

시스템 아키텍처

  • 백엔드랑 프론트엔드 끝났으니까 이제 머신러닝 서버 배포도 빼놓을 수 없겠지? 얘는 좀 단순하게 구현했다.
  • 이거 하고 나면 다음엔 데이터베이스 이원화 과정도 간단히 포스팅할 예정이다
  • 후론트라라 후론트라라 후론트루루라라라~~

ML CI/CD

배포 프로세스

1️⃣ GitHub에 코드 commit & push(main 브랜치) → GitHub Actions CI 실행
2️⃣ Flask 프로젝트 zip 압축 후 S3 버킷에 업로드
3️⃣ CodeDeploy를 통해 EC2에 배포
4️⃣ appspec.ymlscripts로 Flask 애플리케이션 실행



GitHub Actions CI/CD 구축

.github/workflows/deploy.yml 파일 생성

🗂️ 디렉토리 구조
├─.github
│ ├─ workflows/
│ │ └─ deploy.yml/

  • 프론트엔드에서 만든 ci-cd.yaml과 동일한 구조로 deploy.yml 파일을 만들어준다.
  • 원리도 프론트엔드와 유사하다

스크립트 흐름

  • python 환경 설정
  • 가상환경(venv) 생성, requirements.txt에 정의된 Python 패키지를 설치
  • Flask 애플리케이션 파일을 zip 파일로 압축
  • AWS 자격증명 구성 및 AWS CLI 설치
  • S3에 zip 파일 업로드
  • CodeDeploy를 이용해 EC2 인스턴스에 배포 -> S3에 업로드된 파일을 가져와서 실행시킴
name: BonBon Flask to AWS EC2

# main 브랜치에 push 발생 시
on:
  push:
    branches: [ main ]

# 환경변수 지정
env:
  PROJECT_NAME: bonbon-ml
  BUCKET_NAME: bonbon-ml-bucket
  CODE_DEPLOY_APP_NAME: bonbon-dev
  DEPLOYMENT_GROUP_NAME: bonbon-ml-dev
  AWS_REGION: ap-northeast-2

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      # 1. 기본 체크아웃
      - name: Checkout
        uses: actions/checkout@v2

      # python 환경 설정
      - name: Set up Python
        uses: actions/setup-python@v2
        with:
          python-version: 3.8

      # 가상환경(venv) 생성, requirements.txt에 정의된 Python 패키지를 설치
      - name: Install dependencies
        run: |
          python -m venv venv
          . venv/bin/activate
          pip install -r venus/requirements.txt

      # Flask 애플리케이션 파일을 zip 파일로 압축
      - name: Make Zip File
        run: |
          cd venus
          zip -qq -r $GITHUB_SHA.zip . -x "*.git*" -x "venv/*"
        shell: bash

      # AWS 자격증명 구성 및 AWS CLI 설치
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v1
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{secrets.AWS_SECRET_KEY_ID}}
          aws-region: ${{env.AWS_REGION}}

      # S3에 업로드
      - name: Upload to S3
        run: |
          aws s3 cp --region ap-northeast-2 venus/$GITHUB_SHA.zip s3://$BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip

      # CodeDeploy를 이용해 EC2 인스턴스에 배포 -> S3에 업로드된 파일을 가져와서 실행시킴
      - name: Code Deploy To EC2 instance
        run: |
          aws deploy create-deployment \
            --application-name ${{ env.CODE_DEPLOY_APP_NAME }} \
            --deployment-config-name CodeDeployDefault.AllAtOnce \
            --deployment-group-name ${{ env.DEPLOYMENT_GROUP_NAME }} \
            --s3-location bucket=$BUCKET_NAME,key=$PROJECT_NAME/$GITHUB_SHA.zip,bundleType=zip


ML CI/CD 파이프라인 시연

1. 변경 내용 작업 후 Github에 Commit & push → main branch로 PR & Merge


2. main 브랜치 업데이트 시 webhook 발생 → git action workflows 실행


3. Git Action에서 Build & Deploy 완료, S3에 zip 파일 업로드 → 이후 CodeDeploy에서 배포 시작


4. CodeDeploy 배포 완료


5. 배포 확인

  • curl 명령어를 이용해 데이터 예측을 위한 요청 전송 → 정상 응답 확인
  • CodeDeploy 로그에서 Succeeded 확인


끝!

profile
백엔드 개발자 나무입니다

0개의 댓글