AWS CodeDeploy๋ฅผ ํ์ฉํด์ ์๋ ๋ฐฐํฌ๋ฅผ ํ๊ธฐ ์ํด์๋ AWS์์ ๊ด๋ จ ์ค์ ๋ค์ ํด์ค์ผ ํฉ๋๋ค.
๐ AWS S3 ๋ฒํท ์์ฑ
Github Actions์์ ๋น๋ํ ํ๋ก์ ํธ๋ฅผ AWS์ ์ ์ฅํ๊ธฐ ์ํ S3 ๋ฒํท์ด ํ์ํฉ๋๋ค.
AWS > S3 > ๋ฒํท > ๋ฒํท ๋ง๋ค๊ธฐ๋ฅผ ๋๋ฌ์ค๋๋ค.

๋ฒํท ์ด๋ฆ๋ง ์ง์ ํ ํ ๋ค๋ฅธ ์ค์ ๋ค์ ๊ทธ๋๋ก ๋๊ณ ๋ฒํท ๋ง๋ค๊ธฐ๋ฅผ ๋๋ฌ ๋ฒํท์ ์์ฑํด์ค๋๋ค.
๐ EC2 IAM ์ค์
EC2๊ฐ S3์ CodeDeploy๋ฅผ ์ด์ฉํ ์ ์๋๋ก ๊ถํ ์ค์ ์ ํด์ค์ผํฉ๋๋ค.
AWS > IAM > ์ก์ธ์ค ๊ด๋ฆฌ > ์ญํ > ์ญํ ๋ง๋ค๊ธฐ๋ฅผ ๋๋ฌ์ค๋๋ค.

์์ ๊ฐ์ด ์ ํํ๊ณ ๋ค์์ ๋๋ฌ์ค๋๋ค.

AWSCodeDeployFullAccess
AmazonS3FullAccess
๋ ๊ฐ์ง ๊ถํ์ ์ ํํด์ฃผ๊ณ ๋ค์์ ๋๋ฌ์ค๋๋ค.

๋ง์ง๋ง์ผ๋ก ์ญํ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ ์ญํ ์์ฑ์ ๋๋ฌ์ค๋๋ค.
์ด์ ์์ฑ๋ IAM์ EC2์ ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
AWS > EC2 > ์ธ์คํด์ค๋ก ์ด๋ํด์ ์์ฑ๋ EC2 ์ธ์คํด์ค์ ๋ง์ฐ์ค๋ฅผ ๋๊ณ ์ฐํด๋ฆญ์ ํด์ค๋๋ค.

๋ณด์ > IAM ์ญํ ์์ ์ ๋๋ฌ์ค๋๋ค.

์์ฑํ IAM์ ์ ํํ๊ณ Update IAM role์ ๋๋ฌ์ค๋๋ค.
๐ CodeDeploy IAM ์ค์
๋ค์์ CodeDeploy๋ฅผ ์ํ IAM์ ์์ฑํด์ค์ผํฉ๋๋ค. ์ ๊ณผ์ ๊ณผ ๋น์ทํฉ๋๋ค.
AWS > IAM > ์ก์ธ์ค ๊ด๋ฆฌ > ์ญํ > ์ญํ ๋ง๋ค๊ธฐ๋ฅผ ๋๋ฌ์ค๋๋ค.

์ด๋ฒ์๋ ๋ค๋ฅธ AWS ์๋น์ค์ ์ฌ์ฉ ์ฌ๋ก์์ CodeDeploy๋ฅผ ๊ฒ์ํ ๋ค ์์ ๊ฐ์ด ์ ํํ๊ณ ๋ค์์ ๋๋ฌ์ค๋๋ค.

๊ทธ๋๋ก ๋ค์์ ๋๋ฌ์ค๋๋ค.

์ด๋ฆ๋ง ์ค์ ํด์ฃผ๊ณ ์ญํ ์์ฑ์ ๋๋ฌ์ค๋๋ค.
๐ CodeDeploy ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ
AWS > CodeDeploy > ์ ํ๋ฆฌ์ผ์ด์ > ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ์ ๋๋ฌ์ค๋๋ค.

์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฆ์ ์ ํ๊ณ ์ปดํจํ ํ๋ซํผ์ EC2/์จํ๋ ๋ฏธ์ค๋ก ์ค์ ํ ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ฑ์ ๋๋ฌ์ค๋๋ค.

์ด์ ๋ฐฐํฌ ๊ทธ๋ฃน ์์ฑ์ ๋๋ฌ์ค๋๋ค.

๋ฐฐํฌ ๊ทธ๋ฃน ์ด๋ฆ์ ์ ํ๊ณ ์๋น์ค ์ญํ ์๋ ์์์ ์์ฑํ๋ CodeDeploy IAM์ ์ง์ ํด์ค๋๋ค.

๋ฐฐํฌ ์ ํ์ ๊ทธ๋๋ก ๋ก๋๋ค.
ํ๊ฒฝ ๊ตฌ์ฑ์ผ๋ก๋ Amazon EC2 ์ธ์คํด์ค๋ฅผ ์ ํํ๊ณ ์ฐ๊ฒฐํ EC2 ์ธ์คํด์ค๋ฅผ ์ ํํด์ค๋๋ค.

๋๋จธ์ง ์ค์ ์ ๊ทธ๋๋ก ๋๊ณ ๋ก๋ ๋ฐธ๋ฐ์ฑ ํ์ฑํ ์ฒดํฌ๋ฅผ ํด์ ํ ํ ๋ฐฐํฌ ๊ทธ๋ฃน ์์ฑ์ ๋๋ฌ์ค๋๋ค.
๐ AWS IAM ์ฌ์ฉ์ ์ถ๊ฐ
์ด์ Github Actions์์ S3์ ์ ๊ทผํ์ฌ ํ์ผ์ ์ ๋ก๋ํ ์ ์๋๋ก IAM ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํด์ค๋๋ค.
AWS > IAM > ์ก์ธ์ค ๊ด๋ฆฌ > ์ฌ์ฉ์ > ์ฌ์ฉ์ ์ถ๊ฐ๋ฅผ ๋๋ฌ์ค๋๋ค.

์ฌ์ฉ์ ์ด๋ฆ์ ์ค์ ํ๊ณ ์ก์ธ์ค ํค - ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์ ์์ธ์ค์ ์ฒดํฌ๋ฅผ ํ ๋ค ๋ค์์ ๋๋ฌ์ค๋๋ค.

๊ธฐ์กด ์ ์ฑ ์ง์ ์ฐ๊ฒฐ์์ ์๊น ์ ํํ๊ฒ์ฒ๋ผ
AWSCodeDeployFullAccess
AmazonS3FullAccess
๋ ๊ฐ์ ๊ถํ์ ์ฒดํฌํ ํ ๋ค์์ ๋๋ฌ์ค๋๋ค.
์ดํ ๋ค๋ฅธ ์ค์ ๋ค์ ๋ณ๊ฒฝํ์ง ์๊ณ ์ฌ์ฉ์ ๋ง๋ค๊ธฐ๋ฅผ ํด์ค๋๋ค.

์ด๋ ๊ฒ ์ฌ์ฉ์๋ฅผ ์์ฑํ๋ฉด Access Key Id, Secret Access Key๊ฐ ๋์ต๋๋ค.
์ด ํค ๊ฐ๋ค์ ์ง๊ธ๋ง ํ์ธํ ์ ์์ผ๋ ํค๋ฅผ ๋ฉ๋ชจํด๋๊ฑฐ๋ .csv ๋ค์ด๋ก๋๋ฅผ ๋๋ฌ csv ํ์ผ์ ๋ค์ด๋ก๋ ๋ฐ์๋ก๋๋ค.
์ด์ ์ด ๋๊ฐ์ง ํค ๊ฐ๋ค์ Github ํ๊ฒฝ๋ณ์์ ์ถ๊ฐํด์ค๋๋ค.

๐ EC2 CodeDeploy Agent ์ค์น
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ก์ ํธ ์คํ์ ํ์ํ npm, yarn, git, node, pm2 ๋ฑ์ ์ค์น๊ฐ ๋๋ค๊ณ ๊ฐ์ ํ๊ฒ ์ต๋๋ค.
AWS CodeDeploy๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ EC2์ CodeDeploy Agent๋ฅผ ์ค์นํด์ค์ผํฉ๋๋ค.
๋จผ์ awscli ์ค์น๊ฐ ํ์ํฉ๋๋ค.
$ sudo apt update
$ sudo apt install awscli
์ ๋จ๊ณ์ Access Key Id, Secret Access Key๋ฅผ ์ ๋ ฅํด์ค๋๋ค.
$ sudo aws configure
AWS Access Key ID : ๋ค์ด ๋ฐ์ csv ํ์ผ ๋ด์ Access Key ID
AWS Secret Access KEy : ๋ค์ด ๋ฐ์ csv ํ์ผ ๋ด์ Secret Access Key
Default region name : ap-northeast-2
Default output format : json
CodeDeploy Agent ์ค์น ํ์ผ์ ๋ค์ด๋ก๋ ํ๊ณ install ํ์ผ์ ๊ถํ์ ์ถ๊ฐํฉ์๋ค.
$ wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
$ chmod +x ./install
ruby๋ฅผ ๋จผ์ ์ค์นํ๊ณ , CodeDeploy Agent๋ฅผ ์ค์นํฉ๋๋ค.
$ sudo apt-get install ruby
$ sudo ./install auto
$ sudo service codedeploy-agent status# ์ค์น ํ์ธ

๋ง์ง๋ง ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ์ ๋ ์์ ๊ฐ์ด active ์ํ์ด๋ฉด ์ฑ๊ณต์ ๋๋ค.
์ธ์คํด์ค ๋ถํ ์ codedeploy-agent๊ฐ ์๋์ผ๋ก ์ฌ์์๋๋๋ก shell script๋ฅผ ์์ฑํด์ค๋๋ค.
$ sudo vim /etc/init.d/codedeploy-startup.sh
i๋ก ํธ์ง๋ชจ๋ ์ง์
#!/bin
sudo service codedeploy-agent restart
esc -> :wq ์ ์ฅ ํ ๋๊ฐ๊ธฐ
์์ฑํ ์คํฌ๋ฆฝํธ ํ์ผ์ ์คํ ๊ถํ์ ์ถ๊ฐํฉ๋๋ค.
$ sudo chmod +x /etc/init.d/codedeploy-startup.sh
๐ appspec.yml ํ์ผ ์ถ๊ฐ
๋ฐฐํฌํ ํ๋ก์ ํธ์ ๋ฃจํธ ๊ฒฝ๋ก์ appspec.yml ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
appspec.yml ํ์ผ์ CodeDeploy๊ฐ ๋ฐฐํฌ๋ฅผ ๊ด๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฌ์ ํ์ผ์ ๋๋ค.
CodeDeploy๊ฐ EC2์ ํ๋ก์ ํธ๋ฅผ ์ฎ๊ธฐ๊ณ ๋๋ฉด, EC2์์ ์ด๋ฃจ์ด์ง ์์ ์ ํด๋น ํ์ผ์ ์ถ๊ฐํ์ฌ ์ ์ํ ์ ์์ต๋๋ค.
appspec.yml ํ์ผ
version: 0.0
os: linux
files:
- source: /
destination: /home/ubuntu/build
overwrite: yes
permissions:
- object: /home/ubuntu
pattern: '**'
owner: ubuntu
group: ubuntu
hooks:
AfterInstall:
- location: scripts/after-deploy.sh
timeout: 300
runas: ubuntu
CodeDeploy๊ฐ EC2์ ๋ฐฐํฌํ ์์น๋ฅผ destination
์ผ๋ก ์ง์ ํฉ๋๋ค.
ํ๋ก์ ํธ๊ฐ ์ฎ๊ฒจ์ง๊ณ ๋ ํ์ ์ด๋ฃจ์ด์ง ์์
์ scripts/after-deploy.sh
์ ์ ์ํฉ๋๋ค.
๐ after-deploy.sh ํ์ผ ์ถ๊ฐ
๋ฐฐํฌํ ํ๋ก์ ํธ์ ๋ฃจํธ ๊ฒฝ๋ก์ scripts ํด๋๋ฅผ ๋ง๋ค๊ณ ๊ทธ ์์ after-deploy.sh ํ์ผ์ ์ถ๊ฐํฉ๋๋ค.
scripts/after-deploy.sh ํ์ผ
#!/bin/bash
REPOSITORY=/home/ubuntu/build
cd $REPOSITORY
sudo yarn
sudo pm2 start dist
์ ๋ช ๋ น์ด๋ค์ EC2์ ๋ฐฐํฌ๊ฐ ๋๋ ํ ์คํ๋๋ ๋ช ๋ น์ด๋ค์ ๋๋ค.
๋ฐฐํฌ๋ ๊ฒฝ๋ก๋ก ๊ฐ์ ํ์ํ dependency๋ฅผ yarn
๋ช
๋ น์ด๋ก ์ค์นํด์ค ๋ค ์๋ฒ๋ฅผ ๋ค์ ์์ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
โ๏ธyarn not found, pm2 not found ์๋ฌnvm์ผ๋ก node๋ฅผ ์ค์นํ์ ๋ sudo๋ก ํ๋ฉด ์คํ์ด ์๋๋ ๋ฌธ์ ์ ๋๋ค.
๋ค์๊ณผ ๊ฐ์ด ํด๊ฒฐ ๊ฐ๋ฅํฉ๋๋ค.
sudo ln -s /root/.nvm/versions/node/v16.15.1/bin/yarn /usr/bin/yarn
sudo ln -s /root/.nvm/versions/node/v16.15.1/bin/pm2 /usr/bin/pm2
#!/bin/bash
REPOSITORY=/home/ubuntu/build
cd $REPOSITORY
sudo /usr/bin/yarn
sudo /usr/bin/pm2 start dist
๐ deploy.yml ํ์ผ ์์
๋ง์ง๋ง์ผ๋ก CI ๊ณผ์ ์์ ์์ฑํ๋ deploy.yml ํ์ผ์ ๋ช๊ฐ์ง ์์ ์ ์ถ๊ฐํด์ค์ผํฉ๋๋ค.
deploy.yml ํ์ผ
# This workflow will do a clean install of node dependencies, cache/restore them, build the source code and run tests across different versions of node
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
name: deploy
on:
push:
branches: [develop]
pull_request:
branches: [develop]
jobs:
build:
runs-on: ubuntu-18.04
strategy:
matrix:
node-version: [16.15.1]
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
steps:
- name: Checkout source code.
uses: actions/checkout@v2
- name: Use Node.js ${{ matrix.node-version }}
uses: actions/setup-node@v2
with:
node-version: ${{ matrix.node-version }}
- name: Check Npm -v
run: npm -v
- name: create env file
working-directory: ./
run: |
pwd
touch .env
echo PORT=${{ secrets.PORT }} >> .env
echo MONGODB_URI=${{ secrets.MONGODB_URI }} >> .env
echo JWT_SECRET=${{ secrets.JWT_SECRET }} >> .env
echo JWT_ALGO=${{ secrets.JWT_ALGO }} >> .env
cat .env
- name: build server files
working-directory: ./
run: |
yarn
yarn run build
###################################### ์ถ๊ฐ๋ ๋ถ๋ถ ######################################
- name: zip file
run: zip -r hous.zip ./dist ./scripts ./appspec.yml ./.env ./package.json
- name: AWS configure 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: ap-northeast-2
- name: upload to S3
run: aws s3 cp --region ap-northeast-2 ./hous.zip s3://hous-build/deploy/
- name: deploy with AWS codeDeploy
run: aws deploy create-deployment
--application-name hous-codedeploy
--deployment-config-name CodeDeployDefault.OneAtATime
--deployment-group-name GROUP
--s3-location bucket=hous-build,bundleType=zip,key=deploy/hous.zip
zip file
step ์์๋ ๋ช
์ํ ํ์ผ, ํด๋๋ค์ hous.zip ํ์ผ๋ก ์์ถํด์ค๋๋ค.
AWS configure credentials
step ์์๋ S3์ ์ ๊ทผํ๊ธฐ ์ํ IAM ์ฌ์ฉ์ ํค ๊ฐ์ ๋ฑ๋กํด์ฃผ๊ณ
upload to S3
step ์์ ์ค์ ๋ก S3์ hous.zip ์์ถํ์ผ์ ์ฎ๊ฒจ์ค๋๋ค.
deploy with AWS codeDeploy
step ์์ AWS CodeDeploy๊ฐ ์คํ๋๊ณ ๊ฐ์ฅ ์๋ซ์ค์ ์ง์ ํ ๊ณณ์์ ์์ถ ํ์ผ์ ํ์ด์ CodeDeploy์ ์ฐ๊ฒฐ๋ EC2 ์ธ์คํด์ค์ ๋ฐฐํฌํด์ค๋๋ค.
๋ฐฐํฌ๊ฐ ์๋ฃ๋๋ฉด after-deploy.sh ํ์ผ์ ์์ฑํด๋ ๋ช ๋ น์ด๋ค์ด ์คํ๋๋ฉด์ ์๋ฒ๊ฐ ์๋์ผ๋ก ์ฌ์์๋ฉ๋๋ค.
๐ CI/CD ์ ์ฉ ํ์ธ


โ๏ธ์ํ๊ฐ ์ ๋ถ ๋ณด๋ฅ์ค์ผ๋ก ๋จ๊ณ ์งํ์ด ๋์ง ์๋ ๊ฒฝ์ฐ codedeploy-agent๊ฐ ๋ฌธ์ ์ผ ๊ฐ๋ฅ์ฑ์ด ํฝ๋๋ค.
sudo service codedeploy-agent status
๋ช ๋ น์ด๋ก ์คํ์ค์ธ์ง ํ์ธํด๋ณด๊ณ์ค์น๊ฐ ๋์ง ์์๋ค๋ฉด ์ค์น๋ฅผ ์งํํ๊ณ ์คํ์ค์ด๋ผ๊ณ ๋ฌ๋ค๋ฉด
sudo service codedeploy-agent restart
๋ช ๋ น์ด๋ก ์ฌ์คํํ๊ณ ๋ค์ ์๋ํด๋ด ์๋ค.
pm2 logs dist
๋ช
๋ น์ด๋ก pm2 log๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.

CI/CD ์๋ฒ ์ฌ์์๊น์ง ๋ชจ๋ ์ฑ๊ณตํ ๋ชจ์ต์ ๋๋ค.
์ด๋ ๊ฒ ํ๋ฒ ์ธํ ์ ํด๋๋ฉด ๋ ์ด์ ๊ท์ฐฎ๊ฒ ์๋์ผ๋ก ๋ฐฐํฌํ์ง ์์๋ ์๋ฒ๊ฐ ์๋์ผ๋ก ๋ฐฐํฌ๋ฉ๋๋ค.