본문 바로가기
AWS

[AWS] AWS CodeDeploy와 Github Actions를 이용하여 EC2 배포 자동화 CI/CD 파이프라인 구축

by spareone 2026. 3. 10.

[그림 1] 배포 자동화 구성도

 

[그림 1] 구성도처럼 개발자가 Github에 커밋할 경우 코드가 자동으로 배포되는 파이프라인을 구축해보려고 합니다.


1. S3 버킷 생성

[그림 2] AWS S3 버킷

 

빌드된 파일을 저장하기 위해 S3 저장소를 생성해야 합니다.

 

 

2. IAM Role 설정

EC2와 CodeDeploy가 S3에 접근하기 위해 권한이 필요합니다.

 

EC2에 적용될 정책과 CodeDeploy에 적용될 정책을 위해 역할을 2개 생성해야 합니다.

 

[그림 3] IAM Roles

 

AWS IAM Roles 페이지 접속 후 우측 상단의 'Create role' 버튼을 클릭합니다.

 

 

[그림 4] Role이 적용될 엔티티 선택

 

먼저 CodeDeploy쪽 권한을 생성하기 위해

Use Case를 CodeDeploy로 선택합니다.

 

이후 다음을 클릭합니다.

 

 

[그림 5] 권한 추가

 

AWSCodeDeployRole 권한이 자동으로 추가될 것입니다.

다음을 클릭합니다.

 

 

[그림 6] 이름 설정

 

역할 이름을 적은 뒤 아래로 내려줍니다. 여기서는 CodeDeploy로 이름지었습니다.

 

[그림 7] 권한 확인 및 태그 추가

 

추가된 권한 확인 후, tag 추가할 분들은 하시고

Create role을 누르면 역할이 생성됩니다.

 

[그림 8] IAM Roles

 

하나 더 만들어야 합니다.

이번엔 EC2에 적용될 역할을 생성할 것입니다.

 

[그림 9] Role이 적용될 엔티티 선택

 

EC2를 선택 후 다음을 클릭합니다.

 

[그림 10] 권한 추가

 

'AmazonS3ReadOnlyAccess' 권한을 추가합니다.

 

[그림 11] 권한 확인 및 태그 추가

 

추가된 권한 확인 후, 태그 지정하시고 싶으면 하시고

Create Role을 클릭합니다.

 

3. IAM User 설정

IAM 계정 사용 시 확인해야 하는 설정입니다.

 

사용할 Access Key의 주인 계정의 권한을 확인해야 합니다.

[그림 12] IAM Users 권한 확인

AdministratorAccess 권한 또는 AWSCodeDeployFullAccess + AmazonS3FullAccess 권한이 존재히면 됩니다.

만약 없는 경우, Add permissions를 통해 위 권한(AWSCodeDeployFullAccess + AmazonS3FullAccess)을 추가해 주면 됩니다.

 

4. CodeDeploy Application 생성

[그림 13] AWS CodeDeploy 생성

 

AWS에서 CodeDeploy 페이지 접속 후 애플리케이션을 하나 생성합니다.

 

[그림 14] 생성된 CodeDeploy Application 상세 페이지

 

생성된 애플리케이션의 상세 페이지에 접속하면 Deployment groups가 비어 있을 것입니다.

우측의 'Create deployment group' 버튼을 클릭합니다.

 

[그림 15] CodeDeploy Group 생성

 

Service role에는 아까 2번 과정에서 만든 Role을 선택합니다.

Environment configuration에는 배포될 EC2 대상을 선택합니다.

 

그냥 EC2에만 배포 - Amazon EC2 instances

Auto-Scaling EC2에도 배포 - Amazon EC2 Auto Scaling groups

온프레미스 인스턴스에 배포 - On-premises instances

 

[그림 16] CodeDeploy Group 생성

 

로드밸런서를 사용하는 경우 Enable load balancing 체크 후 해당하는 로드밸런서를 선택하면 됩니다.

 

설정이 완료되면 Create deployment group 버튼을 클릭합니다.

 

 

5. Github 프로젝트에 파일 작성

 

version: 0.0
os: linux
files:
  - source: / 
    destination: /home/ubuntu/app  # EC2 내의 코드가 복사될 위치
    overwrite: yes

permissions:
  - object: /home/ubuntu/app
    pattern: "**"
    owner: ubuntu
    group: ubuntu
    
hooks:
  AfterInstall: 
    - location: scripts/deploy.sh  # 코드 복사 후 실행될 스크립트
      timeout: 300
      runas: ubuntu

 

프로젝트 루트 디렉터리에 appspec.yml 파일 생성 후 위 내용을 입력합니다.

 

name: CI/CD Pipeline

on:
  push:
    branches:
      - main

env:
  S3_BUCKET_NAME: [생성한 S3 버킷 이름 작성]

jobs:
  build:
    runs-on: ubuntu-latest

    steps: 
    - name: Checkout Code 
      uses: actions/checkout@v3

    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        java-version: '17'
        distribution: 'adopt'

    - name: Build With Gradle
      run: ./gradlew clean build -x test # 테스트 제외(속도 향상)
    # 0. deploy.sh 내의 변수를 GitHub Secrets 값으로 치환
    - name: Inject Secrets into deploy.sh
      run: |
        sed -i "s|\$SPRING_DATASOURCE_URL|${{ secrets.DB_URL }}|g" scripts/deploy.sh
        sed -i "s|\$SPRING_DATASOURCE_USERNAME|${{ secrets.DB_USERNAME }}|g" scripts/deploy.sh
        sed -i "s|\$SPRING_DATASOURCE_PASSWORD|${{ secrets.DB_PASSWORD }}|g" scripts/deploy.sh
        sed -i "s|\$AWS_S3_BUCKET|${{ secrets.AWS_S3_BUCKET }}|g" scripts/deploy.sh
        sed -i "s|\$AWS_ACCESS_KEY_ID|${{ secrets.AWS_ACCESS_KEY_ID }}|g" scripts/deploy.sh
        sed -i "s|\$AWS_SECRET_ACCESS_KEY|${{ secrets.AWS_SECRET_ACCESS_KEY }}|g" scripts/deploy.sh
        
    # 1. 배포용 디렉토리 구성 및 파일 복사
    - name: Prepare Deployment Files
      run: |
        mkdir -p deploy
        cp build/libs/*.jar deploy/
        cp appspec.yml deploy/
        cp -r scripts deploy/

    # 2. 압축 실행 (cd와 zip을 한 줄에 써서 경로 오류 방지)
    - name: Make zip file
      run: |
        cd deploy && zip -r ../api.zip .
      shell: bash

    # 3. AWS 인증 설정
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v2
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ap-northeast-2

    # 4. S3로 업로드
    - name: Upload to S3
      run: aws s3 cp ./api.zip s3://$S3_BUCKET_NAME/code/api.zip

    # 5. CodeDeploy 실행
    - name: CodeDeploy
      run: |
        aws deploy create-deployment \
          --application-name CodeDeploy \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name [CodeDeploy Application 내 생성한 그룹 이름 작성] \
          --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=code/api.zip

 

.github/workflows/main.yml 파일 생성 후 프로젝트 기술 스택에 맞게 배포 시나리오를 작성합니다.

위 코드는 DB를 사용하는 Spring Boot 배포 시나리오의 예시입니다.

다른 기술(react 등)을 배포하려는 경우 해당 목적에 맞게 AI에게 코드 달라고 하면 잘 만들어 줍니다.

 

[그림 17] Github Repo의 Secrets 키 입력 페이지

 

배포하려는 Github Repository에서 Setting에 들어간 뒤 Secrets amd variables -> Actions 접근 시

'Repository secrets'에 secrets 관련 변수의 값을 입력할 수 있습니다.

 

배포를 위한 필수 값은 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY이며, AWS 계정 설정에서 발급받을 수 있습니다.

DB가 필요한 경우 DB 정보도 추가하면 됩니다.

 

#!/usr/bin/env bash

REPOSITORY=/home/ubuntu/app

echo "> 현재 구동 중인 애플리케이션 pid 확인"

CURRENT_PID=$(sudo lsof -t -i:8080)

echo "현재 구동 중인 애플리케이션 pid: $CURRENT_PID"

if [ -z $CURRENT_PID ]; then
  echo "현재 구동 중인 애플리케이션이 없으므로 종료하지 않습니다."
else
  echo "> kill -9 $CURRENT_PID"
  sudo kill -9 $CURRENT_PID
  sleep 7
fi

echo "> 새 애플리케이션 배포"

JAR_NAME=$(ls -tr $REPOSITORY/api-server.jar | tail -n 1)

echo "> JAR NAME: $JAR_NAME"

echo "> $JAR_NAME 에 실행권한 추가"

chmod +x $JAR_NAME

echo "> $JAR_NAME 실행"

nohup java -jar $JAR_NAME \
  --spring.datasource.url=$SPRING_DATASOURCE_URL \
  --spring.datasource.username=$SPRING_DATASOURCE_USERNAME \
  --spring.datasource.password=$SPRING_DATASOURCE_PASSWORD \
  --cloud.aws.s3.bucket=$AWS_S3_BUCKET \
  --cloud.aws.credentials.access-key=$AWS_ACCESS_KEY_ID \
  --cloud.aws.credentials.secret-key=$AWS_SECRET_ACCESS_KEY \
  --app.upload.base-dir=/home/ubuntu/app/uploads \
  >> $REPOSITORY/nohup.out 2>&1 &

 

scripts/deploy.sh 파일 생성 후 프로젝트 기술 스택에 맞는 배포 코드를 입력합니다.

해당 파일은 EC2 파일에 코드 복사가 완료된 후 실행하는 쉘 스크립트입니다.

 

위 코드는 Spring Boot의 배포 코드의 예시입니다.

사용되는 기술에 맞게 AI에게 만들어 달라고 하면 잘 해줍니다.

 

6. EC2에 CodeDeploy-agent 설치

# 1. 패키지 업데이트 및 의존성(Ruby, wget) 설치
sudo apt update -y
sudo apt install ruby-full wget -y

# 2. 설치 파일 다운로드 (서울 리전 기준)
cd /home/ubuntu
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install

# 3. 실행 권한 부여 및 설치 진행
chmod +x ./install
sudo ./install auto

# 4. 서비스 자동 실행 설정 및 상태 확인
sudo systemctl enable codedeploy-agent
sudo systemctl start codedeploy-agent
sudo systemctl status codedeploy-agent

 

EC2 접속 후 위 명령어를 통해 CodeDeploy Agent를 설치합니다.

 

7. Deploy 확인

[그림 18] Github Actions 배포 확인

 

이제 Github에서 Commit을 하면 Actions 페이지에서 빌드 현황을 파악할 수 있습니다.

해당 항목 클릭하면 로그를 자세히 확인할 수 있으며, 빌드 성공 시 초록 체크 아이콘이 표시됩니다.

 

 

[그림 19] AWS CodeDeploy 배포 현황 확인

 

AWS CodeDeploy에 접속 후 Deployments 현황 페이지에 들어가 보면

배포가 되는 것을 확인할 수 있습니다.

 

[그림 20] 배포 상세 페이지

 

배포 상세 페이지에 접근 시

현재 베포되는 EC2 인스턴스 등의 내용을 확인할 수 있습니다.

 

 

[그림 21] 배포 과정

 

Deployment lifecycle events의 View events 클릭 시 배포 과정을 확인할 수 있습니다.

 

배포 후 EC2에 접속하면 성공적으로 코드가 실행된 것을 확인할 수 있습니다.

 

 

 

이후 Github에서 Commit이 이루어질 경우 최신 코드가 자동으로 배포됩니다.

'AWS' 카테고리의 다른 글

[AWS] Terraform 설치 및 사용  (1) 2026.03.06
[AWS] CloudShell 사용  (0) 2026.03.06
[AWS] AWS CLI 설치 및 사용  (0) 2026.03.06

댓글