์๋ ์ 10์์ ์ฒ์ aws์ ์๋ฒ ๋ฐฐํฌ๋ฅผ ์๋ํ์๋ค. ํด์ปคํค์ ์งํํ๋ค ๊ฐ๋ฐ์ ๋๋ด๊ณ ๋ฐฐํฌ๋ฅผ ์๋ํ๋๊ฑด๋ฐ ์๋ฌด๋ฐ ์ง์๋ ์์ด ๋งจ๋ ์ ํด๋ฉํ๋ค๋ณด๋ ์์์ด ์ฝ์ง์ ํ๋ค. jpa + mysql์ ์ฌ์ฉํ ํ๋ก์ ํธ์์ง๋ง rds ์ธํ ๋ ํ์ง ์๊ณ elastic beanstalk์ผ๋ก ๋ฐฐํฌํ๋ ค ํ์๋ค. ์๋ฌดํผ 1๋ ์ด ์ง๋ ์ง๊ธ ์ฌ์ ํ aws๋ ์ด๋ ต๋ค. ์ด๋ฒ์ github action ci/cd ํ์ดํ๋ผ์ธ์ ๊ตฌ์ถํ๋ ๊ณผ์ ์ ๋จ๊ฒจ๋๋ คํ๋ค.
์ธ์คํด์ค ์์ฑ
- ์ธ์คํด์ค ์์ฑ์ ์ฐ๋ถํฌ๋ก ํ์๊ณ ๋ฐ๋ผํ ๋ค๋ฅธ ๋ธ๋ก๊ทธ๋ ๋๋ฌด ๋ง์ผ๋ ์๋ต
ํ๊ทธ ๊ฐ ์ค์
- ์ง๊ธ ์ค์ ํ๋ ํ๊ทธ๋ ๋ค์์ codedeploy๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํจ์ด๋ค
์ธ๋ฐ์ด๋ ๊ท์น ํธ์ง
- ์ธ๋ฐ์ด๋ ๊ท์น์ ๋ณธ์ธ์ ํ๋ก์ ํธ์ ๋ง๊ฒ ์ด๋ฉด ๋๋ค.
- ํ์๋ ์๋์ ๊ฐ์ด ์ด์ด์ฃผ์๋ค.
- ssh ์ ์์ ์ํ 22๋ฒ ํฌํธ
- ์คํ๋ง ์คํ์ ์ํ 8080 ํฌํธ
- http, https ์ ์์ ์ํ 80, 443 ํฌํธ
- mysql์ ์ฌ์ฉํ๊ธฐ ์ํ 3306 ํฌํธ๋ฅผ ์ด์ด๋์๋ค.
ํ๋ ฅ์ IP ์ฐ๊ฒฐ
- ํ๋ ฅ์ IP ๋ฅผ ์์ฑํ๊ณ ์ด์ ์ ๋ง๋ ec2์ ์ฐ๊ฒฐํด์ค๋ค.
- ํ๋ ฅ์ IP๋ฅผ ์ฐ๊ฒฐํ์ง ์์ผ๋ฉด ec2์ IP๊ฐ ๊ณ์ ๋ฐ๋๊ฒ ๋๋ค.
- ๋ฌด์๋ณด๋ค ํ๋ ฅ์ IP๋ฅผ ์ฐ๊ฒฐํ์ง ์๊ณ ec2๊ฐ ์ผ์ ธ์์ผ๋ฉด ์๊ธ์ด ๋ถ๊ณผ๋๋ค.
- ๋ฐ๋๋ก ํ๋ ฅ์ IP๋ฅผ ์์ฑํ๊ณ ec2์ ์ฐ๊ฒฐํ์ง ์์ผ๋ฉด ์๊ธ์ด ๋ถ๊ณผ๋๋ค.
ssh๋ฅผ ํตํด ec2 ์ ์
- ๊ธ๋ฐฉ ํด๊ฒฐํ๋ ๋ฌธ์ ์ด๊ธด ํ์ง๋ง C๋๋ผ์ด๋ธ ๋ฐ๋ก ์๋์ pem ํค๋ฅผ ๋ฃ์ผ๋ ๋ค์ด๊ฐ์ง์ง ์์๋ค.
- ๋ฐํํ๋ฉด์ pemํค๋ฅผ ๋๊ณ ec2์ ์ ์ํ๋ ์ ๋ค์ด๊ฐ์ก๋ค. ์ด์ ๋..๋ชจ๋ฅด๊ฒ ๋ค
ec2 ์ธํ
sudo apt update && sudo apt upgrade # ubuntu ์
๋ฐ์ดํธ ๋ฐ ์
๊ทธ๋ ์ด๋
sudo apt install openjdk-17-jdk # ์๋ฐ ์ค์น
java -version # ๋ฒ์ ํ์ธ
sudo apt-get install git # ๊น ์ค์น
git --version # ๊น ๋ฒ์ ํ์ธ
# ์๋๋ aws ๊ฐ์ด๋๋ผ์ธ ๋ฐ๋ผํ๊ฒ
sudo apt install ruby-full
sudo apt install wget
wget https://{bucket-name}.s3.{region-identifier}.amazonaws.com/latest/install
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status #code deploy ์๋ ํ์ธ
IAM ๋ฑ๋ก
- ์ฌ์ง๊ณผ ๊ฐ์ด s3 ์ deploy์ ๋ํ ๊ถํ์ ์ถ๊ฐํด์ค๋ค.
์์์ ๋ง๋ IAM์ ec2์ ๋ฑ๋กํด์ค๋ค.
(์ฐธ๊ณ ) pemํค ์์ด ๋น๋ฐ๋ฒํธ๋ก ec2์ ์ ๊ทผ ๊ฐ๋ฅํ๋๋ก ์ธํ
- ec2 ์๋ฒ์์ ์๋ ํ์ผ์ PasswordAuthentication์ yes๋ก ๋ณ๊ฒฝ
sudo vi /etc/ssh/sshd_config sudo su - #ubuntu์ ๊ถํ ๋ถ์ฌ passwd ubuntu #ํจ์ค์๋ ๋ณ๊ฒฝ exit ํ #ec2๋ก ๋๊ฐ์ sudo service ssh restart #์ฌ์์
- ์ด๋ ๊ฒ ์ค์ ํ๋ฉด ssh ubuntu@{ip}.ap-northeast-2.compute.amazonaws.com ์ ํตํด ๋น๋ฐ๋ฒํธ๋ก ์ ์ ๊ฐ๋ฅํ๋ค.
S3 ์์ฑ
- ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ๊ธฐ ์ํ s3์๋ ์กฐ๊ธ ๋ค๋ฅด๊ฒ ์ธํ ํด์ค์ผ ํ๋ค.
IAM ์ฌ์ฉ์ ์์ฑ
- ์๋์ ๊ฐ์ด ์ก์ธ์ค ํค๋ฅผ ๋ง๋ค์ด์ค๋ค.
- ์ด ์ก์ธ์ค ํค๋ ์์ด๋ฒ๋ฆฌ์ง ์๊ฒ ๋ฐ๋ก ์ ์ฅํด๋ฌ์ผ ํ๋ค.
- ๋์ค์ github action ์์ ์ฌ์ฉ ์์
github setting
- AWS_ACCESS_KEY_ID์ AWS_SECRET_ACCESS_KEY๋ ๋ฐ๋ก ์์์ ๋ฐ์ ํค๋ฅผ ์ ๋ ฅํด์ค๋ค.
- AWS_REGION์ ap-northeast-2๋ก ์ธํ ํ๋ฉด ๋๋ค.
Code Deploy ๊ถํ ๋ถ์ฌ ๋ฐ ์์ฑ
- ์๋ ์ฌ์ง๊ณผ ๊ฐ์ด ๋ถ์ฌ ๋ฐ ์์ฑ
์์ฑ ํ deployment group ์ค์
- ์์์ ๋ง๋ IAM์ code-deploy์ ๋ฑ๋กํด์ค๋ค.
- ์ ์ผ ์ฒ์ ec2์ ๋ฑ๋กํ๋ ํ๊ทธ๋ฅผ ์ ํํ์ฌ ec2์ code deploy๋ฅผ ์ฐ๊ฒฐํด์ค๋ค.
./github/workflows/deploy.tml ์์ฑ
name: CI-CD
# ์ด๋ฒคํธ ํธ๋ฆฌ๊ฑฐ ์ค์
# push ์ด๋ฒคํธ ๋ฐ์ ์ ์คํ
# release ๋ธ๋์น์ push๊ฐ ์ด๋ฃจ์ด์ก์ ๋๋ง ์ํฌํ๋ก์ฐ ์คํ
on:
push:
branches:
- release
# ํ๊ฒฝ ๋ณ์
env:
S3_BUCKET_NAME: colony-deploy-bucket
CODE_DEPLOY_APPLICATION_NAME: CODE-DEPLOY-COLONY-TEST
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: CODE-DEPLOY-GROUP
# ์์
์ ์
jobs:
build:
runs-on: ubuntu-latest # ๊ฐ์ฅ ์ต์ ๋ฒ์ ์ ์ฐ๋ถํฌ๋ฅผ ์ฌ์ฉ
steps:
- name: Checkout # ์ ์ฅ์ ์ฒดํฌ์์
uses: actions/checkout@v2
- name: Set up JDK 17 # JDK 17 ์ค์น
uses: actions/setup-java@v2
with:
distribution: 'adopt'
java-version: 17
- name: Grant execute permission for gradlew # gradlew ์คํ ๊ถํ ๋ถ์ฌ
run: chmod +x ./gradlew
shell: bash
- name: Build with Gradle # Gradle์ ์ฌ์ฉํ์ฌ ๋น๋
run: ./gradlew build
shell: bash
- name: Make zip file # zip ํ์ผ ์์ฑ
run: zip -r ./$GITHUB_SHA .
shell: bash
- name: Configure AWS credentials # AWS ์ธ์ฆ ์ ๋ณด ์ค์
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 # ์์ฑ๋ zip ํ์ผ์ S3์ ์
๋ก๋
run: aws s3 cp --region ap-northeast-2 ./$GITHUB_SHA.zip s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip
- name: Code Deploy
run: |
aws deploy create-deployment \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--application-name ${{ env.CODE_DEPLOY_APPLICATION_NAME }} \
--deployment-group-name ${{ env.CODE_DEPLOY_DEPLOYMENT_GROUP_NAME }} \
--s3-location bucket=$S3_BUCKET_NAME,bundleType=zip,key=$GITHUB_SHA.zip
appspec.yml ์์ฑ
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/github-action
overwrite: yes
permissions: # ํ์ผ ๋ฐ ํด๋์ ๊ถํ ์ค์
- object: /
pattern: "**"
owner: ubuntu
group: ubuntu
hooks: # ํํฌ ์คํ ์ค์
ApplicationStart:
- location: scripts/gh_deploy.sh # ์คํํ ์คํฌ๋ฆฝํธ ํ์ผ์ ์์น
timeout: 60
runas: ubuntu
codedeploy-agent๋ฅผ ec2์ ์ ์ฉ์ํค๊ธฐ ์ํด ์ฌ์์ ๋ฐ ๋ก๊ทธ์ค์
- ์ฌ๊ธฐ๊น์ง ๋๋ค๋ฉด ec2 ํฐ๋ฏธ๋์ codedeploy-agent๋ฅผ ์ฌ์์ํ์ฌ ์ ์ฉ์ํจ๋ค.
sudo service codedeploy-agent restart (์ข ๊ฑธ๋ฆผ) tail -F /var/log/aws/codedeploy-agent/codedeploy-agent.log
snapshot.jar ์์ฑ๋์ง ์๋๋ก ์ค์
- jarํ์ผ์ ์ฐพ์์ ์๋์ผ๋ก ์คํ๋๊ฒ ํ๋๋ฐ snapshot๊น์ง ์๋ค๋ฉด jarํ์ผ์ด ๋๊ฐ๊ฐ ๋๋ค.
- jarํ์ผ์ด ํ๋์ฌ์ผ๋ง ์ ์์ ์ผ๋ก ์คํ๋๊ธฐ์ build ์ snapshot.jar๋ ์์ฑ๋์ง ์๋๋ก ํ๋ค.
//SNAPSHOT ์์ฑ x
jar {
enabled = false
}
sh ํ์ผ ์์ฑ
- ์ฌ๊ธฐ์ ์ฝ์ง์ ๊ฝค๋ ํ๋ค.
- ymlํ์ผ์ ํ์ํ ํ๊ฒฝ๋ณ์๊ฐ ์๋๋ฐ ์ด ํ๊ฒฝ๋ณ์๋ฅผ ํ๋ก๊ทธ๋จ ์คํ ์ ์ธํ ํด์ฃผ๊ธฐ ์ํด์ ec2 ๋ด๋ถ์ ์ธํ ์ด ํ์ํ๋ค.
- vim ~/.bashhrc ์ ๋ค์ด๊ฐ export๋ก ํ๊ฒฝ๋ณ์๋ฅผ ๋ฑ๋กํด์ฃผ์ด์ผ ํ๋ค.
- export SPRING_PROFILES_ACTIVE = dev
- ์ด๋ ๊ฒ ํ ํ sh ํ์ผ์ source ~/.bashrc ๋ฅผ ์ถ๊ฐํด jar์คํ ์ ํ๊ฒฝ๋ณ์๋ฅผ ์ฝ์ ์ ์๋๋ก ์ค์ ํด์ฃผ๋ฉด์ ํด๊ฒฐํ๋ค.
#!/bin/bash
PROJECT_NAME="colony"
JAR_PATH="/home/ubuntu/colony/build/libs/*.jar"
DEPLOY_PATH=/home/ubuntu/$PROJECT_NAME/
DEPLOY_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy.log"
DEPLOY_ERR_LOG_PATH="/home/ubuntu/$PROJECT_NAME/deploy_err.log"
APPLICATION_LOG_PATH="/home/ubuntu/$PROJECT_NAME/application.log"
BUILD_JAR=$(ls $JAR_PATH)
JAR_NAME=$(basename $BUILD_JAR)
echo "===== ๋ฐฐํฌ ์์ : $(date +%c) =====" >> $DEPLOY_LOG_PATH
echo "> build ํ์ผ๋ช
: $JAR_NAME" >> $DEPLOY_LOG_PATH
echo "> build ํ์ผ ๋ณต์ฌ" >> $DEPLOY_LOG_PATH
cp $BUILD_JAR $DEPLOY_PATH
echo "> ํ์ฌ ๋์์ค์ธ ์ดํ๋ฆฌ์ผ์ด์
pid ์ฒดํฌ" >> $DEPLOY_LOG_PATH
CURRENT_PID=$(pgrep -f $JAR_NAME)
if [ -z $CURRENT_PID ]
then
echo "> ํ์ฌ ๋์์ค์ธ ์ดํ๋ฆฌ์ผ์ด์
์กด์ฌ X" >> $DEPLOY_LOG_PATH
else
echo "> ํ์ฌ ๋์์ค์ธ ์ดํ๋ฆฌ์ผ์ด์
์กด์ฌ O" >> $DEPLOY_LOG_PATH
echo "> ํ์ฌ ๋์์ค์ธ ์ดํ๋ฆฌ์ผ์ด์
๊ฐ์ ์ข
๋ฃ ์งํ" >> $DEPLOY_LOG_PATH
echo "> kill -9 $CURRENT_PID" >> $DEPLOY_LOG_PATH
kill -9 $CURRENT_PID
fi
DEPLOY_JAR=$DEPLOY_PATH$JAR_NAME
echo "> DEPLOY_JAR ๋ฐฐํฌ" >> $DEPLOY_LOG_PATH
source ~/.bashrc # ํ๊ฒฝ ๋ณ์ ์ธํ
nohup java -jar $DEPLOY_JAR >> $APPLICATION_LOG_PATH 2> $DEPLOY_ERR_LOG_PATH &
sleep 3
echo "> ๋ฐฐํฌ ์ข
๋ฃ : $(date +%c)" >> $DEPLOY_LOG_PATH
- ์ฌ๊ธฐ๊น์ง ํ๋ฉด ci/cd ๋ฐฐํฌ ์๋ํ ์ธํ ์ ๋์ด๋๋ค.
- ์ด์ release ๋ธ๋์น์ push ๋๋ฉด ๋น๋ ํ s3๋ก zip ํ์ผ์ด ์ฌ๋ผ๊ฐ๊ฒ ๋๊ณ ec2์์ jarํ์ผ์ด ์คํ๋๊ฒ ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ฉด ci/cd ๋ฐฐํฌ ์๋ํ ์ธํ ์ ๋์ด๋๋ค.
์ด์ release ๋ธ๋์น์ push ๋๋ฉด ๋น๋ ํ s3๋ก zip ํ์ผ์ด ์ฌ๋ผ๊ฐ๊ฒ ๋๊ณ ec2์์ jarํ์ผ์ด ์คํ๋๊ฒ ๋๋ค.
'devOps ๐ก' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Prometheus & Grafana ๋ฅผ ํตํด ๋ชจ๋ํฐ๋ง์ ํด๋ณด์ (Spring boot) (2) | 2024.01.22 |
---|---|
๋ฌด์ค๋จ ๋ฐฐํฌ ์ ์ฉํ๊ธฐ (SpringBoot, Docker, Nginx, GithubAction) (1) | 2023.12.27 |
์คํ๋ง Docker, githubaction ์ฌ์ฉํ์ฌ ๋ฐฐํฌ ์๋ํ(CI/CD) ํ์ดํ๋ผ์ธ ๊ตฌ์ถ (1) | 2023.12.01 |
๋ฐฐํฌ ๊ณผ์ ์์ ์์๋ ์ผ๋ค (1) | 2023.10.07 |
[GIT] Git Flow | Github Flow ์ ๋ต (1) | 2023.08.24 |