이번에 Spring 백엔드 프로젝트를 하는데 단순히 MVC Pattern을 적용해서 API를 만드는 것 이상으로 무엇인가를 하고 싶었다. 그것은 바로 Github Action과 AWS를 이용해 자동 통합 및 배포할 수 있는 CI/CD를 구축하는 것이다. Docker까지 같이 적용하고자 했으나 안써본 것들로 한번 해보면서 또 배움의 기회를 얻으려 하였다.
name: cafein
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
name: cafein
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
env:
S3_BUCKET_NAME: cafein-deploy
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'temurin'
- name: Grant execute permission for gradlew
run: chmod +x gradlew
- name: Build with Gradle
run: ./gradlew clean build
- name: Make zip file
run: zip -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://$S3_BUCKET_NAME/$GITHUB_SHA.zip
앞서 본 것은 CI 과정으로 서버로 배포하는 것은 아니다. 이제 서버로 배포를 하는 CD과정을 거치려면 CodeDeploy를 사용해야 한다.
ec2 역할을 설정해줘야 하는데 실행하고자 하는 ec2 - 작업 - 보안 - IAM 역할 수정 - 새로운 역할 만들기에서 아래와 같은 역할을 생성하여 부여해야 한다. 그리고 재부팅 한다.
chmod 400 key이름.pem
ssh -i "key이름.pem" ubuntu@ip주소
sudo apt update
sudo apt install ruby-full
sudo apt install wget
cd /home/ubuntu
sudo apt install awscli
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
chmod +x ./install
sudo ./install auto
# 이걸로 설치 확인을 할 수 있다.
sudo service codedeploy-agent status
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/action
overwrite: yes
permissions:
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks:
ApplicationStart:
- location: scripts/deploy.sh
timeout: 60
runas: ubuntu
- name: Code Deploy
run: aws deploy create-deployment --application-name [만든 어플리케이션 이름] --deployment-config-name CodeDeployDefault.AllAtOnce --deployment-group-name [생성한 배포 그룹 이름] --s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
주의할 점 : Amazon Linux가 ubuntu인지 아닌지에 따라 appspec.yml 경로와 owner, group, runas가 ubuntu나 ec2-user로 구분이 되기에 사용하는 ec2 환경에서 사용자 계정 관리를 참고해야 한다.
Spring 기반 Github Action 및 AWS를 연동하는 과정에서 자동배포를 하면서 Shell Script도 써보고 많이 배우게 되었다.