확장성을 고려한 프로젝트에서 많이 쓰는 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개의 댓글

관련 채용 정보