Backend/DevOps

AWS CodeDeploy, Github Actions CI/CD 파이프라인 구축 삽질 회고록

mopil 2022. 9. 27. 11:00
반응형

2024-11-28 updated

# 서론

CI/CD 파이프라인을 구축할 필요가 있어서 Github Actions로 파이프라인을 구축하던 도중 맞이했던 오류들과 해결법, 사용법 미숙으로 인한 시행착오, 삽질을 기록하기 위함이다.

 

Github Actions 배포자동화 과정은 다음 블로그 글을 전적으로 참고했다.

https://bcp0109.tistory.com/363

 

Github Actions CD: AWS EC2 에 Spring Boot 배포하기

Overview 애플리케이션을 개발하면 외부에서도 접근 가능하도록 클라우드 환경에 배포합니다. 이전에 포스팅 했던 AWS 1편에서는 마지막에 scp 명령어로 로컬에 존재하는 빌드 파일을 EC2 인스턴스

bcp0109.tistory.com

 

# Codedeploy Agent 설치 오류 - Ubuntu 버전과 Ruby 버전 호환성 오류

EC2 인스턴스에 Ubuntu 22.04 LTS를 사용한다면 Ruby 버전과 호환성 충돌이 나서 Codedeploy Agent의 install이 실행되지 않는 문제가 있다.

원인은 22.04 버전에는 Ruby 3.x 버전이 깔리는데, 이상하게도 Codedeploy Agent는 Ruby 2.x 버전만 호환되는 것 같았다.

Ruby를 2.x버전으로 다운그레이드 하는 방법은 구글링 해보니까 좀 복잡해서 그냥 Ubuntu 20.04 LTS 버전으로 인스턴스를 바꾸면서 해결했다.

 

---

 

[2024-11-28] 기준 22.04 버전도 정상적으로 가능

EC2 프리티어가 20.04 버전이 사라져서 22.04 버전으로 해봤는데, 이제 CodeDeploy가 Ruby 3.x 버전을 지원하는 것 같다!

 

 

# build.gradle.kts 설정 - jar 초기 빌드 이름 변경하기

Kotlin DSL 설정이 Groovy 설정과 달라서 살짝 삽질했었는데, 다음과 같이 작성하면 된다.

 

# 파일 덮어쓰기 오류

 

빌드할 때 기존파일이 존재해서 CodeDeploy에서 오류가 난다면, appspec.yml의 files 부분을 아래처럼 수정하면 된다.

 

*여담으로 파일 확장자를 appspec.yaml로 하면 인식을 못 한다.

 

appspec.yml

version: 0.0
os: linux

files:
  - source:  /
    destination: /home/ubuntu/app
    file_exists_behavior: OVERWRITE

permissions:
  - object: /
    pattern: "**"
    owner: ubuntu
    group: ubuntu

hooks:
  AfterInstall:
    - location: stop.sh
      timeout: 60
      runas: ubuntu
  ApplicationStart:
    - location: start.sh
      timeout: 60
      runas: ubuntu

 

# DB설정 파일과 같이 Github에 올릴 수 없는 설정파일 동적으로 생성하기

보통 DB 설정파일은 로컬에서만 유지하고 Github에는 업로드 하지 않는다.

하지만 Github Actions를 사용하여 빌드를 하면, Github 레포에 있는 내용물을 빌드하게 되므로 DB설정파일 (application-db.yml)을 넣지 않고 빌드를 하게 되는데, 이를 해결하는 방법은 다음과 같다.

 

1. application-secret.yml 을 base64로 인코딩하기

2. 인코딩한 결과물을 Github -> settings -> secrets에 저장하기

3. Github Actions deploy.yml에 스크립트 추가하기

 

먼저 application-secret.yml을 base64로 인코딩한다.

https://www.base64encode.org/

그리고 Github settings로 들어가서 secrets에 이 결과물을 저장한다.

이제 Github Actions deploy.yml에 다음과 같은 스크립트를 추가한다.

 

 

이렇게 하면 Github Actions이 프로젝트를 빌드할 때, 저 인코딩 된 application-secrets.yml을 디코딩해서 동적으로 넣어주고, 빌드를 진행해 준다.

 

자세한 설명은 다음 블로그를 참조할 것

https://mumomu.tistory.com/132?category=1017703 

 

[Github Actions] Github Secrets에 secret파일 등록(secret.yml 등)

Github Secrets에 Secret파일 등록으로 CI/CD 깃허브에 올릴 때는 조심해야하는 파일들이 있는데 AWS, API 등에 접근할 수 있는 키를 가진 환경변수 등이 공유될 경우 큰 문제가 생길 수 있다. 그렇기 때문

mumomu.tistory.com

 

 

deploy.yml

name: Deploy to Amazon EC2

on:
  push:
    branches:
      - master

# 본인이 설정한 값을 여기서 채워넣습니다.
# 리전, 버킷 이름, CodeDeploy 앱 이름, CodeDeploy 배포 그룹 이름
env:
  AWS_REGION: ap-northeast-2
  S3_BUCKET_NAME: youth-moa-cicd
  CODE_DEPLOY_APPLICATION_NAME: youth-moa-code-deploy
  CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: youth-moa-deploy-group

permissions:
  contents: read

jobs:
  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    environment: production

    steps:
    # (1) 기본 체크아웃
    - name: Checkout
      uses: actions/checkout@v3

    # (2) JDK 17 세팅
    - name: Set up JDK 17
      uses: actions/setup-java@v3
      with:
        distribution: 'temurin'
        java-version: '17'
      
    - name: Gradle Caching
      uses: actions/cache@v3
      with:
        path: |
          ~/.gradle/caches
          ~/.gradle/wrapper
        key: ${{ runner.os }}-gradle-${{ hashFiles('**/*.gradle*', '**/gradle-wrapper.properties') }}
        restore-keys: |
          ${{ runner.os }}-gradle-

    - name: Copy application-secret.properties
      env:
          PROPERTIES_SECRET: ${{ secrets.APPLICATION_SECRET_PROPERTEIS }}
          PROPERTIES_DIR: src/main/resources
          PROPERTIES_FILE_NAME: application-secret.properties
      run: echo $PROPERTIES_SECRET | base64 --decode > $PROPERTIES_DIR/$PROPERTIES_FILE_NAME
        
    # (3) Gradle build (Test 제외)
    - name: Grant execute permission for gradlew
      run: chmod +x gradlew
    - name: Build with Gradle
      run: ./gradlew bootJar

    # (4) AWS 인증 (IAM 사용자 Access Key, Secret Key 활용)
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    # (5) 빌드 결과물을 S3 버킷에 업로드
    - name: Upload to AWS S3
      run: |
        aws deploy push \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --ignore-hidden-files \
          --s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
          --source .

    # (6) S3 버킷에 있는 파일을 대상으로 CodeDeploy 실행
    - name: Deploy to AWS EC2 from S3
      run: |
        aws deploy create-deployment \
          --application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
          --deployment-config-name CodeDeployDefault.AllAtOnce \
          --deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
          --s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
반응형