🙈

⃝ 동글동글 ⃝

🪐ᐩ˖ 🍎

AWS

[Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - GitHub Actions편

JONG_UK 2023. 4. 3. 21:17
728x90
반응형
SMALL

AWS EC2(Instance, Elastic IP, Security Group, Load Balancer, Target Group), IAM, S3 Bucket, CodeDeploy, Route53, ACM + GitHub Actions를 이용하여 Spring Boot 프로젝트를 AWS에 자동 배포 및 HTTPS 통신을 하려고 합니다.

 

제가 했던 자동 배포 과정을 담고 있는 글이니 처음 글부터 하나하나 차근차근 봐주시면 감사하겠습니다.

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - EC2편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - IAM편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - S3 버킷편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - CodeDeploy편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - GitHub Actions편

 

구현 과정을 담기 이전에 각 파트별 개념을 먼저 짚고 시작해 보도록 하겠습니다.

5. [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 Https 통신 - GitHub Actions 편

 

💡 GitHub Actions의 개념

GitHub Actions 간단한 설명

GitHub Actions는 CI/CD 구축을 위해 사용되는 서비스입니다!

- CI : Continuous Integration - 지속 통합

- CD : Continuous Deployment - 지속 배포

 

GitHub Actions에서 가장 상위 개념인 워크플로우(Workflow, 작업 흐름)는 쉽게 말해 자동화해 놓은 작업 과정이라고 볼 수 있습니다. 워크플로우는 코드 저장소 내에서 .github/workflows 폴더 아래에 위치한 YAML 파일로 설정하며, 하나의 코드 저장소에는 여러 개의 워크플로우, 즉 여러 개의 YAML 파일을 생성할 수 있습니다.

 

.github/workflows에서 어떤 event가 발생했을 때 특정 작업이 일어나게 하거나 반복해서 실행시키도록 할 수 있습니다.

 

저는 이번 GitHub Actions를 CD를 위해 사용하며, GitHub Repo에서 main 브랜치에서 Push가 일어났을 때 AWS에 배포하도록 하는 방식을 사용합니다.

 

자세한 내용은 아래 포스트를 참고해 주세요. (저보다는 훨씬 잘 설명하시니까..!)

 

GitHub Actions의 소개와 핵심 개념

Engineering Blog by Dale Seo

www.daleseo.com

 

⭐️ GitHub Actions 설정

GitHub Actions 세팅

먼저 여러분들이 배포하고자 하는 GitHub Repo에 접속해 주세요.

 

 

JongukYang - Overview

(ง •̀_•́)ง. JongukYang has 18 repositories available. Follow their code on GitHub.

github.com

 

그리고 배포하고자 하는 Repo에서 Actions를 들어가 줍시다!

 

 

set up a workflow yourself를 클릭해서 스스로 만들어 보도록 합시다!

먼저 저는 Spring Boot Gradle, Java 11 파일을 배포한다는 것을 미리 공지하도록 하겠습니다!

 

이름은 각자 설정하도록 하고, 저는 deploy.yml을 입력하고 아래 코드를 작성하도록 하겠습니다.

on:
  push:
    branches:
      - main

name: Deploy String boot to Amazon EC2
env:
  PROJECT_NAME: Spring-Study

jobs:
  deploy:
    name: DEPLOY
    runs-on: ubuntu-22.04

    steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash

      - 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_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://test-bucket-anything/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: Code Deploy
        run: aws deploy create-deployment --application-name Test-Anything-CD-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=test-bucket-anything,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

 

코드 내용 설명
on:
  push:
    branches:
      - main

- main 브랜치에 push가 됐을 때 github workflows 수행

 

name: Deploy String boot to Amazon EC2
env:
  PROJECT_NAME: Spring-Study

- 위 사진은 deploy.yml 파일을 Start Commit 후에 나오는 화면인데, Deploy Spring boot to Amazon EC2라는 workflows 이름을 생성해 주는 것. 

 

jobs:
  deploy:
    name: DEPLOY
    runs-on: ubuntu-22.04

- ubuntu-22.04에서 해당 소스를 실행하겠다는 뜻

- EC2가 ubuntu-22.04이기 때문에 설정

 

steps:
      - name: Checkout
        uses: actions/checkout@v2

      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11

      - name: Grant execute permission for gradlew
        run: chmod +x gradlew
        shell: bash

      - name: Build with Gradle
        run: ./gradlew build
        shell: bash

      - name: Make zip file
        run: zip -qq -r ./$GITHUB_SHA.zip .
        shell: bash

- main 브랜치에 push가 되면 ubuntu-22.04에서 해당 소스를 내려받고, setps를 진행하게 됨.

- java 11 환경에서 gradle 빌드를 하는 과정

- 4번째 run에서 ./gradlew build를 하여 프로젝트를 빌드합니다.

- 5번째 run에서 zip파일을 생성하는데 이름 형식을 지정해서 생성합니다. S3에 파일을 올릴 때 압축된 파일로 옮겨야 하기 때문에 작성합니다. $GITHUB_SHA 는 GitHub Actions에서 제공하는 기본 환경변수인데 매번 배포될 때 zip파일 이름을 다르게 하기 위해서 사용하였습니다. (추가적인 GitHub Actions에서 제공하는 기본 환경변수를 보고 싶으시다면 링크를 눌러주세요.)

 

 

      - 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_ACCESS_KEY }}
          aws-region: ${{ secrets.AWS_REGION }}

      - name: Upload to S3
        run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://test-bucket-anything/$PROJECT_NAME/$GITHUB_SHA.zip

      - name: Code Deploy
        run: aws deploy create-deployment --application-name Test-Anything-CD-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=test-bucket-anything,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

- Configure AWS credentials : AWS 자격 증명

    - 즉 AWS에 접근 권한이 있는지를 인증하기 위한 코드입니다. 이전에 GitHub Repo Settings에 만들었던 항목들을

       추가해 주시면 됩니다. (EC2 IAM 사용자 Access Key 생성 부분 참고)

 

 

 

- Upload to S3 : 이전에 만들었던 AWS S3 버킷에 파일 올리기

run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://test-bucket-anything/$PROJECT_NAME/$GITHUB_SHA.zip

- s3:// 뒤에 들어가는 내용은 이전에 만들었던 버킷의 이름입니다. aws s3 cp 명령어를 통해 지정한 s3:버킷이름/파일path에 저장하는 내용입니다.

 

 

 

 

- Code Deploy : AWS CodeDeploy에 배포하기

run: aws deploy create-deployment --application-name Test-Anything-CD-App --deployment-config-name CodeDeployDefault.OneAtATime --deployment-group-name dev --s3-location bucket=test-bucket-anything,bundleType=zip,key=$PROJECT_NAME/$GITHUB_SHA.zip

- 위 코드를 보시면 '--application-name' 뒤에 나오는 Test-Anything-CD-APP은 AWS CodeDeploy에 만들어 두었던 애플리케이션 이름입니다.

- 추가적으로 '--deployment-group-name' 뒤에 dev는 저희가 만들었던 dev 배포 그룹입니다.

 

 

- 마지막으로 '--s3-location bucket=test-bucket-anything' 부분은 저희가 만들었던 S3 버킷 이름을 넣어주시면 됩니다.

 

 

GitHub Actions를 들어가 보면 에러가 뜨거나 성공했다는 메세지가 나타날 것입니다. 지금 현재 상태에서는 에러가 뜨는게 정상입니다. 왜냐하면 파일을 아직 2개를 덜 만들었거든요.. ㅎㅎ

 

에러를 확인해 보고 싶다면 눌러서 들어간 다음 아래 DEPLOY를 누르면 상세하게 볼 수 있습니다.

 

 

저의 에러는 gradlew 파일을 찾을 수 없다는 에러입니다. 이건 Root 디렉토리에 gradlew 파일이 없기 때문입니다.

Root 디렉토리에 gradlew 파일이 존재해야 한다는 것은 아래 사진과 같은 의미입니다.

 

 

현재 제가 지금 블로그 작성을 위해 사용하는 프로젝트는 배포를 위한 프로젝트가 아니라 Root 디렉토리 경로가 조금 다릅니다.

 

그래서 이 글을 읽으시는 분들은 아래와 같은 에러가 발생하실 수 있습니다.

 

 

위 사진의 에러는 gradle 폴더에 gradle-warpper.jar 파일이 없어서 발생한 문제입니다.

 

.jar 파일이 없는 모습

.gitignore 파일을 들어가 보시면 .jar 파일을 전부 등록해 두셨거나, 특정 파일을 지정해 두셨다면 삭제하고 gradle-warpper.jar 파일을 업로드하시고 다시 main 브랜치에 push를 하시면 다시 build가 될 것입니다. 

 

 

또다시 빌드가 안된다면 .github/workflows/deploy.yml 파일의 경로가 올바른지 확인을 해야 합니다. 

deploy.yml 파일의 경로는 Root 디렉토리 바로 아래의 .github/workflows 경로로 존재해야 합니다.

 

그래서 Root 경로에 올바르게 파일이 생성되어 있다면 Build with Gradle 과정과 Make zip file 과정이 수행되고 에러가 발생할 것입니다. 

 

 

현재 에러는 인증 자격을 알 수 없다는 에러인데 이 부분은 AWS IAM 사용자 인증 Access Key 에러이며, 블로그를 잘 따라오셨다면 나오지 않을 에러입니다. 저는 예시를 위해 넣어두었습니다.

 

이제 Upload to S3 과정을 진행할 예정인데 appscape.yml 파일과 deploy.sh 파일을 프로젝트 Root 경로에 생성해줄 예정입니다.

 

appspec.yml
version: 0.0
os: linux

files:
  - source: /
    destination: /opt/Test-Anything-CD-App

permissions:
  - object: /opt/Test-Anything-CD-App/
    owner: ubuntu
    group: ubuntu
    mode: 755
hooks:
  AfterInstall:
    # location은 프로젝트의 root경로를 기준
    - location: deploy.sh
      timeout: 60
      runas: root

destination과 object의 경로를 잘 보면 AWS의 CodeDeploy의 애플리케이션 이름과 같다는 것을 알 수 있습니다.

꼭 참고하시고 작성해주세요!

 

deploy.sh
#!/usr/bin/env bash

REPOSITORY=/opt/Test-Anything-CD-App
cd $REPOSITORY

APP_NAME=SpringStudy
JAR_NAME=$(ls $REPOSITORY/build/libs/ | grep '.jar' | tail -n 1)
JAR_PATH=$REPOSITORY/build/libs/$JAR_NAME

CURRENT_PID=$(pgrep -f $APP_NAME)

if [ -z $CURRENT_PID ]
then
  echo "> 종료할것 없음."
else
  echo "> kill -9 $CURRENT_PID"
  kill -15 $CURRENT_PID
  sleep 5
fi

echo "> $JAR_PATH 배포"
nohup java -jar $JAR_PATH > /dev/null 2> /dev/null < /dev/null &

 

두 파일을 생성하고 Build를 하시면 제대로 빌드가 된 것을 확인하실 수 있을 것입니다.

 

 

AWS의 CodeDeploy와 S3 Bucket에 들어가 보시면 배포가 되어 있는 것을 볼 수 있습니다.

 

이제 main 브랜치에 Push 하기만 하면 AWS로 자동 배포가 가능해진 것을 확인할 수 있을 것입니다.

 

여기까지가 이제 GitHub Actions와 AWS EC2와 S3, CodeDeploy를 이용한 배포였습니다.

 

이제 HTTPS 통신을 위한 작업을 추가해 보도록 하겠습니다.

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - EC2편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - IAM편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - S3 버킷편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - CodeDeploy편

2023.04.03 - [AWS] - [Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - GitHub Actions편

 

728x90
반응형
LIST