Spring Boot + GitHub Actions + AWS CodeDeploy๋ฅผ ํ์ฉํ CI/CD ๊ตฌ์ถ
์๋ก
์ง๊ธ๊น์ง ๋งค๋ฒ ํ๋ก์ ํธ๋ฅผ ๊ตฌ์ถํ ๋๋ง๋ค ์ด์ ์ฝ๋๋ค์ ๋ฒ๊ฑฐ๋กญ๊ฒ ๋ด๊ฐ๋ฉด์ CI/CD๋ฅผ ๊ตฌ์ถํ์๋๋ฐ, ์ด๋ฒ ๊ธฐํ์ ํ๋ฒ ๋ฌธ์ํ๋ฅผ ํด๋ณด๊ณ ์ ๊ธ์ ์์ฑํ๊ฒ ๋์์ต๋๋ค.
CI/CD๋ฅผ ์ ์ฉํ๋ ์ด์ ๋ ์ด์ ์ ์์ฑํ ๊ฒ์๊ธ์ด ์์ผ๋ ์ฐธ๊ณ ํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ์ ์ผ๋ก EC2๋ ์์ฑ๋์ด์๋ค๊ณ ๊ฐ์ ํ๊ณ ์งํํ๊ฒ ์ต๋๋ค.
ํ๊ฒฝ
EC2(Amazone Linux), RDS(MySQL), S3, Spring Boot 2.6.4
์งํํ๋ ํ๊ฒฝ์ ์์ ๊ฐ์ผ๋ฉฐ, ์ฌ๊ธฐ์ ์ ๋ Ubuntu๊ฐ ์๋๋ผ Linux๋ก ์งํํ์์ ๊ผญ ํ์ธํ์๊ธฐ ๋ฐ๋๋๋ค. ์ง๊ธ์ ํด๊ฒฐ๋์๋์ง ๋ชจ๋ฅด๊ฒ ์ผ๋ ์ด์ ์ Ubuntu๋ก ์งํํ๋ ๊ณผ์ ์์ CodeDeply Agent๋ฅผ ์ค์นํ๋ ๋ถ๋ถ์์ Ruby๋ฒ์ ์ด ๋ฌธ์ ๋ฅผ ์ผ์ผ์ผ ์งํํ์ง ๋ชปํ์์ต๋๋ค.
๊ณผ์
CI/CD ํ๋ฆ์ ์ ์ด๋ฏธ์ง์ ๊ฐ์ต๋๋ค.
- ๊นํ๋ธ์์ผ๋ก ์ฝ๋๋ฅผ Push ํ๊ฒ ๋๋ฉด GitHub Actions์ด ์๋์ผ๋ก ์คํ๋์ด CI (๋น๋) ์์ ์ ์ํํ๊ฒ ๋ฉ๋๋ค.
- ์ฝ๋์์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ด๋ ๋น๋ ์์ ์ ํตํด jarํ์ผ์ด ์์ฑ๋๊ฒ ๋๊ณ ์ฌ์ ์ ์์ฑํ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ํจ๊ป AWS์ ์คํ ๋ฆฌ์ง ์๋น์ค์ธ S3์๊ฒ ์ ๋ฌ๋์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.
- S3์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋์๋ค๋ฉด EC2์ ์ค์นํ CodeDeply Agent๊ฐ S3์ ์ ์ฅ๋ ํ๋ก์ ํธ ํ์ผ์ ๊ฐ์ ธ์์ ๋ด๋ ค๋ฐ์ต๋๋ค.
- ๊ทธ ํ, ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฝ์ด ๋ค์ฌ์ ํ๋ก์ ํธ ์คํ์ ์์ํฉ๋๋ค.
์ฆ, ๊นํ๋ธ ์์ผ๋ก ์ฝ๋๋ฅผ push ํ๊ธฐ๋ง ํ๋ฉด ์๋์ผ๋ก ์ต์ ๋ฒ์ ์ ํ๋ก์ ํธ๊ฐ EC2์ ๋ด๋ ค๋ฐ์์ ธ์ ์ด ํ๋ก์ ํธ๋ฅผ ์คํํ๊ฒ ๋ฉ๋๋ค.
๋ชฉ์ฐจ
- CI Actions ์ค์
- IAM ์ค์
- S3 ์ค์
- GitHub Actions secrets ์ถ๊ฐ
- depley shell script ์์ฑ
- CD Actions S3 ์ ๋ก๋ ์์ฑ
- AWS CodeDeploy & AWS EC2 ์ฐ๋(EC2 ์ค์ , CodeDeploy ์ค์ )
- CD Actions Deploy ์์ฑ
1. CI Actions ์ค์
๋จผ์ ๋ณธ์ธ์ ํ๋ก์ ํธ ๋ ํฌ์งํ ๋ฆฌ์ ์ ๊ทผ ํ ์ฐ์ธก ์๋จ์ ์๋ Actions๋ฅผ ํด๋ฆญํฉ๋๋ค.
ํ๋์ ๊ธ์จ์ set up a workflow yourself๋ฅผ ํด๋ฆญํฉ๋๋ค.
# workflow์ ์ด๋ฆ
name: CI
# ํด๋น workflow๊ฐ ์ธ์ ์คํ๋ ๊ฒ์ธ์ง์ ๋ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ง์
on:
push:
branches: [ main ] # main branch๋ก push ๋ ๋ ์คํ๋ฉ๋๋ค.
pull_request:
branches: [ main ] # main branch๋ก pull request๋ ๋ ์คํ๋ฉ๋๋ค.
# workflow๋ ํ๊ฐ ์ด์์ job์ ๊ฐ์ง๋ฉฐ, ๊ฐ job์ ์ฌ๋ฌ step์ ๋ฐ๋ผ ๋จ๊ณ๋ฅผ ๋๋ ์ ์์ต๋๋ค.
jobs:
build:
name: CI
# ํด๋น jobs์์ ์๋์ steps๋ค์ด ์ด๋ ํ ํ๊ฒฝ์์ ์คํ๋ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํฉ๋๋ค.
runs-on: ubuntu-latest
steps:
# ์์
์์ ์ก์ธ์คํ ์ ์๋๋ก $GITHUB_WORKSPACE์์ ์ ์ฅ์๋ฅผ ์ฒดํฌ์์ํฉ๋๋ค.
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'zulu'
- name: Grant execute permission for gradlew
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle
run: ./gradlew build
shell: bash
์ CI ๋ด์ฉ์ ์์ฑ ํ Start commit๋ฅผ ๋๋ฌ์ค๋๋ค.
main branch๋ก push ํน์ pull_request๋ฅผ ์ํํ์ ๋ ์ CI ์ก์ ์ด ๋์ํ๊ฒ ๋๋ฉฐ, ํด๋น CI์ ์ญํ ์ ubuntu ์์์ ์๋์ผ๋ก ํ๋ก์ ํธ๋ฅผ ๋น๋ํ์ฌ ํ๋ก์ ํธ์ ์ค๋ฅ๊ฐ ์๋์ง ์๋์ง ๊ฒ์ฆ์ ์ํํฉ๋๋ค. ์ ์์ ์ ํตํด ํ๋ก์ ํธ์ ์ค๋ฅ๊ฐ ์๋ค๋ฉด ์ฌ์ ์ main branch๋ก์ ๋ถ๋ฏธ์ค๋ฌ์ด merge๊ฐ ์ผ์ด๋์ง ์๋๋ก ๋ง์ ์ ์์ผ๋ฉฐ, ํ ์คํธ ์ฝ๋๋ฅผ ์์ฑํ๋ค๋ฉด ํ ์คํธ ์ฝ๋ ๋ํ ์๋์ผ๋ก ์ํํ์ฌ ํตํฉ ํ ์คํธ๋ฅผ ์๋์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
2. IAM ์ค์
AWS๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ธ๋ถ ์๋น์ค์ ์ ๊ทผ์ ํ์ฉํ์ง ์์ต๋๋ค. ๋ฐ๋ผ์ IAM(Identify & Access Management)๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผ ๊ถํ์ ํ๋ํด์ผ ํฉ๋๋ค.
AWS์ ๋์๋ณด๋์์ IAM์ ์ ๊ทผ ํ '์ฌ์ฉ์ ์ถ๊ฐ'๋ฅผ ํด๋ฆญํฉ๋๋ค. ์ฌ๊ธฐ์ ์ฌ์ฉ์๋ AWS ์ธ๋ถ์์ ์ ์ํ ์ ์๋ ๊ถํ์ ๋ถ์ฌํ ๋์์ ์๋ฏธํฉ๋๋ค.
์ฌ์ฉ์์ ์ด๋ฆ๊ณผ ์ก์ธ์ค ์ ํ์ ์ ํํ ๋ค ๋ค์์ ๋๋ฆ ๋๋ค.
ํด๋น ํ์ด์ง์์ AWSCodeDeployFullAccess || AmazonS3FullAccess ์ด ๋ ๊ฐ์ ๊ถํ์ ๋ถ์ฌํฉ๋๋ค.
๋ค์ 3, 4๋ฒ ๊ณผ์ ์ ์ ํ์ฌํญ์ด๊ธฐ์ ๊ทธ๋ฅ ๋์ด๊ฐ๋ฉด ์ ์ด๋ฏธ์ง์ ๊ฐ์ด ์ฐ๋ฆฌ๊ฐ ๊ถํ์ ๋ถ์ฌํ ์ฌ์ฉ์๊ฐ ์์ฑ๋๊ณ ACCESS KEY์ SECRET KEY๊ฐ ๋ฐ๊ธ๋ฉ๋๋ค.
์ ์๋ฆผ์๋ ๋์์๋ฏ์ด ์ง๊ธ ํ์ธํ ์ ์๋ ACCESS KEY์ SECRET KEY๋ ์ง๊ธ ์ด ํ์ด์ง๊ฐ ํ์ธํ ์ ์๋ ๋ง์ง๋ง ๊ธฐํ์ ๋๋ค. ๋ฐ๋ผ์ ๋ฐ๋ก ACCESS KEY์ SECRET KEY๋ฅผ ๋ค๋ฅธ ๊ณณ์ ๋ฉ๋ชจํด ๋๊ฑฐ๋ .csvํ์ผ๋ก ๋ค์ด๋ก๋ ํด๋๋๋ก ํฉ๋๋ค.
3. S3 Bucket ์ค์
Amazone S3๋ Simple Stroage Service์ ์ค์๋ง๋ก์จ ํ์ฅ์ฑ, ๋ฐ์ดํฐ ๊ฐ์ฉ์ฑ, ๋ณด์ ๋ฐ ์ฑ๋ฅ์ ์ ๊ณตํ๋ ์๋ง์กด์ ๊ฐ์ฒด ์คํ ๋ฆฌ์ง ์๋น์ค์ ๋๋ค. ์ฆ ํ์ผ์ ์ ์ฅํ๋ ํ์ผ์๋ฒ๋ฅผ ์๋ฏธํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๋์๋ณด๋์์ S3๋ฅผ ํด๋ฆญํ์ฌ ์ ๊ทผํฉ๋๋ค.
๋ฒํท ๋ง๋ค๊ธฐ๋ฅผ ํด๋ฆญํฉ๋๋ค.
๋ฑํ ๋ฐฐํฌ๋ง์ ์ํด์๋ผ๋ฉด ๋ฐ๋ก ์ค์ ํด ์ค ๊ฒ์ด ์์ต๋๋ค. ๋ฒํท ์ด๋ฆ๋ง ์์ฑํด์ฃผ๋๋ก ํฉ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ์์ฑ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
4. GitHub Actions secrets ์ถ๊ฐ
2๋ฒ์์ ์์ฑํ IAM ACCESS KEY์ SECRET KEY๋ฅผ ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ ์์ ํ๋ฌธ ๊ทธ๋๋ก ๋ ธ์ถํ๊ฒ ๋๋ฉด ๋ณด์์ ๋งค์ฐ ํฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค. ๋ฐ๋ผ์ repository์ 'Setting -> Security -> Secrets -> Actions'์์ ํด๋น ํค ๊ฐ์ ๋ฑ๋กํ์ฌ ๋ ธ์ถํ์ง ์๊ณ ์ฌ์ฉํ๋๋ก ํฉ๋๋ค.
2๋ฒ์์ ์์ฑํ IAM ACCESS KEY์ SECRET KEY๋ฅผ ๋ฑ๋กํฉ๋๋ค.
๋ํ region๋ ์ถ๊ฐํด์ค์ผ ํ๋๋ฐ ์์ ๊ฐ์ด ap-northeast-2๋ฅผ ์ถ๊ฐํด์ค๋๋ค. ๋ณธ์ธ์ด ๋ค๋ฅธ region์ ์ฌ์ฉํ๊ณ ์๋ค๋ฉด ํด๋น region์ ์ ๋ ฅํด์ฃผ๋ฉด ๋ฉ๋๋ค.
์์ ๊ฐ์ด ACCESS KEY์ SECRET KEY ๊ทธ๋ฆฌ๊ณ REGION๊น์ง ์ธ ๊ฐ ๋ค ๋ฑ๋กํ๋๋ก ํ๋ฉด ๋ฉ๋๋ค.
5. deploy shell script ์์ฑ
#!/bin/bash
BUILD_JAR=$(ls /home/ec2-user/action/build/libs/*.jar)
JAR_NAME=$(basename $BUILD_JAR)
echo "> build ํ์ผ๋ช
: $JAR_NAME" >> /home/ec2-user/action/deploy.log
echo "> build ํ์ผ ๋ณต์ฌ" >> /home/ec2-user/action/deploy.log
DEPLOY_PATH=/home/ec2-user/action/
cp $BUILD_JAR $DEPLOY_PATH
echo "> ํ์ฌ ์คํ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
pid ํ์ธ" >> /home/ec2-user/action/deploy.log
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> ํ์ฌ ๊ตฌ๋์ค์ธ ์ ํ๋ฆฌ์ผ์ด์
์ด ์์ผ๋ฏ๋ก ์ข
๋ฃํ์ง ์์ต๋๋ค." >> /home/ec2-user/action/deploy.log
else
echo "> kill -15 $CURRENT_PID"
kill -15 $CURRENT_PID
sleep 5
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR ๋ฐฐํฌ" >> /home/ec2-user/action/deploy.log
nohup java -jar $DEPLOY_JAR >> /home/ec2-user/deploy.log 2>/home/ec2-user/action/deploy_err.log &
๋ณธ์ธ ํ๋ก์ ํธ ํด๋์ ์์ ๊ฐ์ด deploy.sh๋ฅผ ์์ฑํ์ฌ ์ถ๊ฐํ๋๋ก ํฉ๋๋ค.
์ ์คํฌ๋ฆฝํธ๋ ์ญํ ์ ์ ์ผ ์ด๋ฐ์ ์ค๋ช ํ ๋๋ก ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๊นํ๋ธ์ push ํ๊ฒ ๋๋ฉด ์ฝ๋์์ ๋ฌธ์ ๊ฐ ์๋ค๋ฉด ์ด๋ ๋น๋ ์์ ์ ํตํด jarํ์ผ์ด ์์ฑ๋๊ฒ ๋๊ณ ์ฌ์ ์ ์์ฑํ ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ๊ณผ ํจ๊ป AWS์ ์คํ ๋ฆฌ์ง ์๋น์ค์ธ S3์๊ฒ ์ ๋ฌ๋์ด ์ ์ฅ๋๊ฒ ๋ฉ๋๋ค.
- S3์ ์ฑ๊ณต์ ์ผ๋ก ์ ์ฅ๋์๋ค๋ฉด EC2์ ์ค์นํ CodeDeply Agent๊ฐ S3์ ์ ์ฅ๋ ํ๋ก์ ํธ ํ์ผ์ ๊ฐ์ ธ์์ ๋ด๋ ค๋ฐ์ต๋๋ค.
- ๊ทธ ํ, ๋ฐฐํฌ ์คํฌ๋ฆฝํธ ํ์ผ์ ์ฝ์ด ๋ค์ฌ์ ํ๋ก์ ํธ ์คํ์ ์์ํฉ๋๋ค.
์ฆ ์คํฌ๋ฆฝํธ์ ์ฝ๋๋ ํ๋ก์ ํธ๋ฅผ EC2์์ ์คํํ ๋ ์ด์ ์ ์คํ๋๊ณ ์๋ Spring Boot ํ๋ก์ ํธ๊ฐ ์๋ค๋ฉด ์ข ๋ฃ์ํจ ๋ค ์๋ก์ด ๋ฒ์ ์ ํ๋ก์ ํธ๋ฅผ ์คํํ๋๋ก ํฉ๋๋ค.
6. CD Actions S3 ์ ๋ก๋ ์ค์
์๊น 1๋ฒ์์ CI Actions๋ฅผ ์ถ๊ฐํด์คฌ๊ธฐ ๋๋ฌธ์ ๋ณธ์ธ ํ๋ก์ ํธ ๋ ํฌ์งํ ๋ฆฌ์ ./github/workflows ์ ์ ๊ทผํ๋ฉด ์์ ๊ฐ์ด ๋ํ๋ ๊ฒ์ ๋๋ค.
์ด์ CD.yml๋ ์์ฑํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ Add file ํด๋ฆญ ํ Create new file์ ํด๋ฆญํ์ฌ ์๋์ ์ฝ๋๋ฅผ ์ถ๊ฐํด์ฃผ๋๋ก ํฉ๋๋ค.
# workflow์ ์ด๋ฆ
name: CD
# ํด๋น workflow๊ฐ ์ธ์ ์คํ๋ ๊ฒ์ธ์ง์ ๋ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ง์
on:
push:
branches: [ main ] # main branch๋ก push ๋ ๋ ์คํ๋ฉ๋๋ค.
# ํด๋น yml ๋ด์์ ์ฌ์ฉํ key - value
env:
S3_BUCKET_NAME: project-bucket-v1
PROJECT_NAME: cicdtest
# workflow๋ ํ๊ฐ ์ด์์ job์ ๊ฐ์ง๋ฉฐ, ๊ฐ job์ ์ฌ๋ฌ step์ ๋ฐ๋ผ ๋จ๊ณ๋ฅผ ๋๋ ์ ์์ต๋๋ค.
jobs:
build:
name: CD
# ํด๋น jobs์์ ์๋์ steps๋ค์ด ์ด๋ ํ ํ๊ฒฝ์์ ์คํ๋ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํฉ๋๋ค.
runs-on: ubuntu-latest
steps:
# ์์
์์ ์ก์ธ์คํ ์ ์๋๋ก $GITHUB_WORKSPACE์์ ์ ์ฅ์๋ฅผ ์ฒดํฌ์์ํฉ๋๋ค.
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'zulu'
- 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 -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 }}
# script files ๋ณต์ฌ
- name: Copy script
run: cp ./scripts/*.sh ./deploy
# S3์ ์
๋ก๋
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
์ ์ฝ๋์ env์ S3_BUCKET_NAME ๋ถ๋ถ์ ๋ฐ๋์ ๋ณธ์ธ์ S3 ๋ฒํท ์ด๋ฆ์ผ๋ก ์ค์ ํด์ฃผ์ ์ผ ํฉ๋๋ค. ๋ณธ์ธ์ด 3๋ฒ์์ ์์ฑํ S3์ ๋ฒํท ์ด๋ฆ์ ์์ฑํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ด์ ์ปค๋ฐ ๋ด์ญ์ ์ดํด๋ณด๋ฉด CI์ CD๊ฐ ์ํ ์ค์ธ ๊ฒ์ ๋ณผ ์ ์๊ณ ์ฑ๊ณต์ ์ด๋ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ฒดํฌํ์๋ก ๋ณํ๊ฒ ๋ฉ๋๋ค.
์์ง๊น์ง CD๋ S3์ ์ ๋ก๋ํ๋ ๊ณผ์ ๊น์ง๋ง ์งํํ์ต๋๋ค. ๋ฐ๋ผ์ S3์ ๋ฒํท์ ์ ์ํ์ฌ ๋ณธ์ธ์ ํ๋ก์ ํธ๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์ ๋ก๋๊ฐ ๋์๋์ง ํ์ธํฉ๋๋ค.
7. AWS CodeDeploy & AWS EC2 ์ฐ๋
7-1 AWS ์ค์
์ด์ ๋ฐฐํฌ ์์คํ ์ธ codedeploy๋ฅผ ํตํด EC2 Instance์ ๋ฐฐํฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ์์ ์ ์ค์ ํ ๊ฒ์ ๋๋ค.
๋จผ์ codedeploy์ EC2 ๋ ์ฌ์ด์ ์ ๊ทผ์ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด์๋ AWS IAM์์ '์ญํ ๋ง๋ค๊ธฐ'๋ฅผ ํด์ผ ํฉ๋๋ค. ์ฌ์ฉ์ ๋ฑ๋ก์ด ์ธ๋ถ์์ AWS ์ธ๋ถ์์๋ถํฐ์ ์ ๊ทผ์ ํ๊ฐํ๋ ๊ฒ์ด๋ผ๋ฉด, ์ญํ ์ AWS ๋ด์์์ ์ ๊ทผ ๊ถํ์ด๋ผ๊ณ ๋ณผ ์ ์์ผ๋ฉฐ ๋ฑ๋ก ์์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
- ๋ค๋ฅธ ๊ณ์ ์ IAM ์ฌ์ฉ์
- AWS ๋ฆฌ์์ค์์ ์์ ์ ์ํํด์ผ ํ๋ EC2 ์ธ์คํด์ค์์ ์คํ ์ค์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋
- ๊ณ์ ๋ด ๋ฆฌ์์ค์์ ์์ ์ ์ํํ์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํด์ผ ํ๋ AWS ์๋น์ค
- SAML์ ํตํด ์ธ์ฆ ์ฐ๋์ ์ฌ์ฉํ๋ ์ฌ๋ด ๋๋ ํ ๋ฆฌ์ ์ฌ์ฉ์
๋ง์ฐฌ๊ฐ์ง๋ก IAM์ ์ ๊ทผํฉ๋๋ค.
AmazonEC2RoleforAWSCodeDeploy ๊ถํ์ ์ ํํฉ๋๋ค.
์ญํ ์ด๋ฆ๊ณผ ์ค๋ช ์ ๋๋ง ์์ฑํ ํ ์ญํ ์์ฑ์ ๋๋ฌ์ฃผ๋ฉด ๋ฉ๋๋ค.
EC2์์ ๋ฐฉ๊ธ ์์ฑํ ์ญํ ์ ์ฌ์ฉํ๋๋ก ์ ์ฅํฉ๋๋ค.
์ญํ ์ ๋ฐ๊พธ๊ณ ๋๋ฉด ์ธ์คํด์ค๋ฅผ ์ฌ๋ถํ ํ๋๋ก ํฉ๋๋ค.
์ด๋ ๊ผญ ์ฌ๋ถํ ์ ๋๋ฅด์ ์ผ ํฉ๋๋ค. ์ข ๋ฃ๋ ์ญ์ ์ ๋์ผํ๊ธฐ ๋๋ฌธ์ ๋ง ๊ทธ๋๋ก ์ข ๋ฃ๊ฐ ๋์ด๋ฒ๋ฆฌ๋ฉฐ ๋ค์ ์คํํ ์ ์์ต๋๋ค.
์ฌ๋ถํ ์ด ์๋ฃ๋๋ฉด EC2 ์ธ์คํด์ค์ ์ฐ๊ฒฐํ ๋ค ๋ค์ ๋ช ๋ น์ด๋ฅผ ํตํด codedeploy๋ฅผ ์ค์นํฉ๋๋ค.
aws s3 cp s3://aws-codedeploy-ap-northeast-2/latest/install . --region ap-northeast-2
download: s3://aws-codedeploy-ap-northeast-2/latest/install to ./install
๋ค์ด๋ก๋ ์ฑ๊ณต ์ ์์ ๊ฐ์ ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
์ด์ ์คํ ๊ถํ์ ์ฃผ๊ณ ์คํํ์ฌ ์ค์น๋ฅผ ๋ง๋ฌด๋ฆฌํฉ๋๋ค. ์๋ ๋ช ๋ น์ด๋ฅผ ์์๋๋ก ์ ๋ ฅํฉ๋๋ค.
chmod +x ./install
sudo ./install auto
๋ง์ฝ install ๋ถ๋ถ์์ /usr/bin/env: ruby: No such file or directory๊ณผ ๊ฐ์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒฝ์ฐ ruby๋ฅผ ์ฐพ์ ์ ์๋ค๋ ์๋ฏธ์ด๋ฏ๋ก ๋นํฉํ์ง ๋ง๊ณ ์๋ ๋ช ๋ น์ด๋ฅผ ํตํด ruby๋ฅผ ์ค์น ํ ๋ค์ ์ ๋ ฅํ๋ฉด ๋ฉ๋๋ค.
sudo yum install ruby;
์ค์น ํ์ธ์ ์ํด ์๋์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด The AWS CodeDeploy agent is running as PID **** ๋ฉ์์ง๊ฐ ์ถ๋ ฅ๋ฉ๋๋ค.
sudo service codedeploy-agent status
7-2 CodeDeploy ์ค์
EC2์ ๋ง์ฐฌ๊ฐ์ง๋ก, CodeDeploy์์๋ ์ญํ ์ ์์ฑํ๊ณ ์ค์ ํด์ผ ํฉ๋๋ค.
7-1๊ณผ ๋์ผํ๊ฒ ์ญํ ์์ฑ์ ๋ค์ด๊ฐ์ AWS ์๋น์ค ์ ํ ํ ์ฌ์ฉ ์ฌ๋ก๋ CodeDeploy๋ฅผ ์ ํํฉ๋๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ์ด๋ฆ๋ ์์ ๋กญ๊ฒ ๋ถ์ฌํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ด์ codedeploy ์๋น์ค์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํฉ๋๋ค.
๋์๋ณด๋์์ CodeDeploy์ ์ ๊ทผํฉ๋๋ค.
์ ํ๋ฆฌ์ผ์ด์ ์ ์์ฑํ๊ณ , ๋ฐฐํฌ ๊ทธ๋ฃน ์์ฑ์ ์ด์ด์ ์งํํฉ๋๋ค.
์๋น์ค ์ญํ ์ ์๊น ๋ง๋ค์๋ ์ญํ ์ ์ ํํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
ํ๊ฒฝ ๊ตฌ์ฑ์ Amazone EC2 ์ธ์คํด์ค๋ฅผ ์ ํํฉ๋๋ค.
๋ฐฐํฌ ๊ตฌ์ฑ์ ๋ค์๊ณผ ๊ฐ์ด CodeDeployDefault.AllAtOnce๋ฅผ ์ ํํ๊ณ ๋ก๋ ๋ฐธ๋ฐ์๋ ์ ๋ ํ์ฑํํ์ง ์์์ต๋๋ค.
์ด์ ํ๋ก์ ํธ ํด๋์ appspec.yml ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์ codedeploy๊ฐ ์๋ฒ ํ๊ฒฝ์ ์ค์น๋ฅผ ํ ์ ์๋๋ก ๋์์ ์ ์ํ ๋ด์ฉ์ ๋๋ค.
version: 0.0
os: linux
# S3์ ์๋ zip ํ์ผ์ด EC2์ ๋ฐฐํฌ๋ ์์น๋ฅผ ์ง์
files:
- source: / # CodeDeploy์์ ์ ๋ฌํด ์ค ํ์ผ ์ค destination์ผ๋ก ์ด๋์ํฌ ๋์์ ๋ฃจํธ๋ก ์ง์ (์ ์ฒดํ์ผ)
destination: /home/ec2-user/action/ # source์์ ์ง์ ๋ ํ์ผ์ ๋ฐ์ ์์น, ์ดํ jar๋ฅผ ์คํํ๋ ๋ฑ์ destination์์ ์ฎ๊ธด ํ์ผ๋ค๋ก ์งํ
overwrite: yes
permissions: # CodeDeploy์์ EC2์๋ฒ๋ก ๋๊ฒจ์ค ํ์ผ๋ค์ ๋ชจ๋ ec2-user๊ถํ์ ๊ฐ๋๋ก ํฉ๋๋ค.
- object: /
pattern: "**"
owner: ec2-user
group: ec2-user
# ApplicationStart ๋จ๊ณ์์ deploy.sh๋ฅผ ์คํ์ํค๋๋ก ํฉ
hooks: # CodeDeploy๋ฐฐํฌ ๋จ๊ณ์์ ์คํํ ๋ช
๋ น์ด๋ฅผ ์ง์ ํฉ๋๋ค.
ApplicationStart: # deploy.sh๋ฅผ ec2-user๊ถํ์ผ๋ก ์คํํฉ๋๋ค.
- location: scripts/deploy.sh
timeout: 60 # ์คํฌ๋ฆฝํธ ์คํ 60์ด ์ด์ ์ํ๋๋ฉด ์คํจ๊ฐ ๋ฉ๋๋ค.
runas: ec2-user
8. CD Actions Deploy ์์ฑ
์ด์ ์ง์ง ๋๋ฌ์ต๋๋ค. ์๊น ์์ฑํ๋ CD.yml์ ์๋์ Deploy ์ฝ๋๋ง ์ถ๊ฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
# Deploy
- name: Deploy
run: |
aws deploy create-deployment \
--application-name cicdtest-project \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name cicd-test-prod \
--file-exists-behavior OVERWRITE \
--s3-location bucket=project-bucket-v1,bundleType=zip,key=cicdtest/$GITHUB_SHA.zip \
--region ap-northeast-2 \
์ฌ๊ธฐ์ ์ด ๊ธ์ ๋ณด์๋ ๋ถ๋ค์ ๋ค์๊ณผ ๊ฐ์ ๋ถ๋ถ์ ๋ณธ์ธ์ด ์ค์ ํ๋ ์ด๋ฆ๋ค๋ก ๋ณ๊ฒฝํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
- application-name
- deployment-group-name
- s3-location bucket
- key
์ฌ๊ธฐ์ key๋ ๋ฒํท ์์์ ์ ์ฅํ๊ณ ์ํ๋ ๊ฒฝ๋ก์ ๋๋ค. ์ฆ, s3 ํ์ผ/๋๋ ํ ๋ฆฌ ๋ช ์ ๋๋ค.
์ ์ฒด ์ฝ๋๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
# workflow์ ์ด๋ฆ
name: CD
# ํด๋น workflow๊ฐ ์ธ์ ์คํ๋ ๊ฒ์ธ์ง์ ๋ํ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ง์
on:
push:
branches: [ main ] # main branch๋ก push ๋ ๋ ์คํ๋ฉ๋๋ค.
# ํด๋น yml ๋ด์์ ์ฌ์ฉํ key - value
env:
S3_BUCKET_NAME: project-bucket-v1
PROJECT_NAME: cicdtest
# workflow๋ ํ๊ฐ ์ด์์ job์ ๊ฐ์ง๋ฉฐ, ๊ฐ job์ ์ฌ๋ฌ step์ ๋ฐ๋ผ ๋จ๊ณ๋ฅผ ๋๋ ์ ์์ต๋๋ค.
jobs:
build:
name: CD
# ํด๋น jobs์์ ์๋์ steps๋ค์ด ์ด๋ ํ ํ๊ฒฝ์์ ์คํ๋ ๊ฒ์ธ์ง๋ฅผ ์ง์ ํฉ๋๋ค.
runs-on: ubuntu-latest
steps:
# ์์
์์ ์ก์ธ์คํ ์ ์๋๋ก $GITHUB_WORKSPACE์์ ์ ์ฅ์๋ฅผ ์ฒดํฌ์์ํฉ๋๋ค.
- uses: actions/checkout@v2
- name: Set up JDK 11
uses: actions/setup-java@v2
with:
java-version: '11'
distribution: 'zulu'
- 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 -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 }}
# script files ๋ณต์ฌ
- name: Copy script
run: cp ./scripts/*.sh ./deploy
# S3์ ์
๋ก๋
- name: Upload to S3
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$PROJECT_NAME/$GITHUB_SHA.zip
# Deploy
- name: Deploy
run: |
aws deploy create-deployment \
--application-name cicdtest-project \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name cicd-test-prod \
--file-exists-behavior OVERWRITE \
--s3-location bucket=project-bucket-v1,bundleType=zip,key=cicdtest/$GITHUB_SHA.zip \
--region ap-northeast-2 \
๊ฒฐ๋ก
main branch์ pull request๋ฅผ ํ๊ฒ ๋๋ฉด CI์ ์ํด ๋น๋ ๊ฒ์ฌ๋ฅผ ์ํํ๊ฒ ๋๊ณ push๋ฅผ ํ๊ฒ ๋๋ฉด ์๋์ ์ผ๋ก ๋ฐฐํฌ๊ฐ ๋๊ฒ ๋ฉ๋๋ค.
์ถ๊ฐ์ ์ผ๋ก aws-codeDeploy-๋ฐฐํฌ-๋ฐฐํฌID-View events์ ๋ค์ด๊ฐ๋ฉด ๋ฐฐํฌ ๊ณผ์ ์ ์ด์์ด ์๋์ง ํ์ธํ ์ ์์ผ๋ฉฐ, ์๋ฌด ์ด์์ด ์๋๋ฐ ํ๋ก์ ํธ๊ฐ ์คํ๋์ง ์๋๋ค๋ฉด EC2์ java๊ฐ ์ค์น๋์ด์๋์ง ํ์ธํ๊ธฐ ๋ฐ๋๋๋ค.
๋ค์์ผ๋ก๋ Nginx+Cerbot/SSL์ ์ฌ์ฉํ https ์ค์ ๊ณผ ๋ฌด์ค๋จ ๋ฐฐํฌ ์ค์ ๋ฐฉ๋ฒ์ ๋ํด ์์ฑํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.