확장성을 고려한 프로젝트에서 많이 쓰는 CI/CD 구축 방법 (Code Deploy)

콜 파머가 될 남자·2025년 1월 10일
0

CI/CD

목록 보기
4/5
post-thumbnail

언제 사용?

  • 서버를 여러 대 이상 구동하거나 무중단 배포가 중요한 서비스에 사용
  • 인프라 구조가 복잡해진만큼 관리 비용, 유지보수 비용 등 복잡도가 증가

작업 흐름

1️⃣ Code Deploy 및 AWS S3 접근에 대한 역할과 정책 설정
[실습] CodeDeploy 셋팅 / IAM 설정
스크린샷이 많은 이유로 박재성 강사님의 노션링크로 대체

강의 내용과 다르게 bucket을 생성할때 instagram-server 를 사용하면 중복된 이름이라며 생성되지 않는 오류가 발생하였다

따라서 bucket name을 instagram-server-bucket-1 과 같이 변경하였더니 생성이 되었다


2️⃣ appspec.yml, 스크립트 파일 작성하기

Code Deploy를 사용하기 위한 필수 코드 작성

appspec.yml

version: 0.0
os: linux

files:
  # S3에 저장한 파일들 중 destination(AWS EC2)으로 이동시킬 대상을 지정한다.
  # / 이라고 지정하면 S3에 저장한 전체 파일을 뜻한다.
  - source: /
    # EC2의 어떤 경로에 저장할 지 지정한다. 
    destination: /home/ubuntu/instagram-server

permissions:
  - object: /
    owner: ubuntu
    group: ubuntu

hooks:
  ApplicationStart:
    - location: scripts/start-server.sh
      timeout: 60
      runas: ubuntu

scripts/start-server.sh

#!/bin/bash

echo "--------------- 서버 배포 시작 -----------------"
cd /home/ubuntu/instagram-server
sudo fuser -k -n tcp 8080 || true
nohup java -jar project.jar > ./output.log 2>&1 &
echo "--------------- 서버 배포 끝 -----------------"

3️⃣ Github Actions 코드 작성
.github/workflows/deploy.yml

name: Deploy To EC2

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository 파일 불러오기
        uses: actions/checkout@v4

      - name: JDK 17버전 설치
        uses: actions/setup-java@v4
        with:
          distribution: temurin
          java-version: 17

      - name: application.yml 파일 만들기
        run: echo "${{ secrets.APPLICATION_PROPERTIES }}" > ./src/main/resources/application.yml

      - name: 테스트 및 빌드하기
        run: ./gradlew clean build

      - name: 빌드된 파일 이름 변경하기
        run: mv ./build/libs/*SNAPSHOT.jar ./project.jar

      - name: 압축하기
        run: tar -czvf $GITHUB_SHA.tar.gz project.jar appspec.yml scripts

      - name: AWS Resource에 접근할 수 있게 AWS credentials 설정
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-2
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: S3에 프로젝트 폴더 업로드하기
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.tar.gz s3://instagram-server-bucket-1/$GITHUB_SHA.tar.gz

      - name: Code Deploy를 활용해 EC2에 프로젝트 코드 배포
        run: aws deploy create-deployment
          --application-name instagram-server
          --deployment-config-name CodeDeployDefault.AllAtOnce
          --deployment-group-name Production
          --s3-location bucket=instagram-server,bundleType=tgz,key=$GITHUB_SHA.tar.gz

코드 설명
빌드 파일 이름 변경까지는 이전에 했던 과정과 동일하므로 생략

압축하기

  • tar -czvf
    • 파일과 디렉토리를 .tar.gz로 압축하는 명령어
  • $GITHUB_SHA
    • Github Actions에서 제공하는 환경 변수, 현재 커밋의 SHA 해시값
    • 고유한 파일명을 생성하여 배포시 충돌을 방지하기 위함

AWS Resource에 접근할 수 있게 AWS credentials 설정

  • AWS S3 및 CodeDeploy와 같은 AWS 리소스에 접근하기 위해 인증 정보를 설정
  • aws-region
    • ap-northeast-2(서울 리전)
  • aws-access-key-id, aws-secret-access-key
    • Github Secrets에 저장된 AWS 자 증명 키

S3에 프로젝트 폴더 업로드하기

  • 위에서 압축된 프로젝트 파일 (GITHUB_SHA.tar.gz )을 S3 버킷에 업로드
  • aws s3 cp
    • AWS CLI를 사용하여 파일을 S3에 복사하는 명령어
  • --region ap-northeast-2
    • 리전 설정
  • se://instagram-server-bucket-1/$GITHUB_SHA.tar.gz
    • 업로드할 대상 S3 버킷 경로

Code Deploy를 활용해 EC2에 프로젝트 코드 배포

  • AWS CodeDeploy를 사용하여 S3에서 EC2로 압축 파일을 다운로드하고, appspec.ymlscripts에 정의된 작업을 수행하여 프로젝트를 배포
  • application-name instagram-server
    • CodeDeploy에 정의된 애플리케이션 이름
  • deployment-config-name CodeDeployDefault.AllAtOnce
    • 배포 설정을 지정합니다. AllAtOnce는 모든 인스턴스에 동시에 배포하는 설정
  • deployment-group-name Production
    • CodeDeploy에서 배포 대상 EC2 인스턴스를 그룹화한 이름
  • s3-location
    • CodeDeploy가 다운로드할 파일의 S3 경로를 지정합니다.
    • bucket=instagram-server-bucket-1: S3 버킷 이름.
    • bundleType=tgz: 압축 파일 형식.
    • key=$GITHUB_SHA.tar.gz: S3에서 다운로드할 파일 이름.

배포 흐름

EC2를 배운지 얼마 안되었는데, S3와 Code Deploy까지 사용해보니 생각보다 흐름잡기가 어려워서 따로 정리를 해야할 것 같다

  1. Github Actions에서 빌드 결과를 포함하여 파일을 압축
  2. AWS S3에 업로드하여 Code Deploy가 접근이 가능하도록 설정
  3. Code Deploy가 S3에서 파일을 가져와 EC2에 배포
profile
콜 파머가 개발자라면 사회적 인지도는 어느 정도일까

0개의 댓글