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 설정
GitHub Actions 세팅
먼저 여러분들이 배포하고자 하는 GitHub Repo에 접속해 주세요.
그리고 배포하고자 하는 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 파일이 없어서 발생한 문제입니다.
.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편
'AWS' 카테고리의 다른 글
AWS Free Tier(프리티어)를 활용해 AWS 배포하기 - 0. 목표 (1) | 2024.09.03 |
---|---|
AWS Free Tier(프리티어) 적용 가능 제품 (4) | 2024.09.03 |
[Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - CodeDeploy편 (0) | 2023.04.03 |
[Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - S3 버킷편 (0) | 2023.04.03 |
[Spring Boot] AWS CodeDeploy + GitHub Actios 자동 배포 및 HTTPS 통신 - IAM편 (0) | 2023.04.03 |