[AWS] CodePipeline: EC2์— CodeDeploy ์—ฐ๋™

์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ ์ ‘์† ์—†์ด ํŠน์ • ๋ฆฌ์†Œ์Šค๋ฅผ ๋ฐ”๋ผ๋ณด๋ฉฐ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜๋Š” consumer๋ฅผ ๋งŒ๋“ค๊ฒŒ ๋๋‹ค.
์ด ์ผ€์ด์Šค๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ๋ฌด์กฐ๊ฑด ํ•˜๋‚˜๋งŒ ์žˆ์–ด์•ผ ํ•˜๊ณ , ๋‹ค์šดํƒ€์ž„์ด ์กฐ๊ธˆ์€ ์žˆ์–ด๋„ ์ƒ๊ด€์ด ์—†๋‹ค.

๊ทธ๋ž˜์„œ ์„œ๋ฒ„์ฒ˜๋Ÿผ ๋ธ”๋ฃจ-๊ทธ๋ฆฐ ๋ฐฐํฌ๋„ ์—†์ด ๋ ˆ๊ฑฐ์‹œํ•˜๊ฒŒ stop and start ๋ฐฐํฌ๋ฅผ ๊ตฌ์„ฑํ•ด๋ดค๋‹ค.

์–ธ์–ด๋Š” nodejs๋ฅผ ์“ฐ๊ณ , pm2๋กœ ๋‹จ์ผ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ด€๋ฆฌํ•˜๋„๋ก ํ•  ๊ฒƒ์ด๋‹ค.




EC2 ์„ธํŒ…

๊ธฐ๋ณธ ๋Ÿฐํƒ€์ž„์„ ๊น”์•„์ฃผ๊ณ 

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install 16
npm i -g pm2

pm2๊ฐ€ ์ž˜ ๋„๋Š”์ง€ ๋ณธ๋‹ค.

pm2 start npm --name "consumer" -- start




Code Deploy agent ์„ค์น˜

EC2์—์„œ code deploy์˜ ๋™์ž‘์„ ์ธ์ง€ํ•˜๊ณ  ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ ค๋ฉด, ๊ทธ๋Ÿฐ๊ฑธ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ๋ชฌ์ด ๊น”๋ ค์žˆ์–ด์•ผ ํ•œ๋‹ค.
๊ทธ๊ฒŒ code deploy agent๋‹ค. ๊น”์•„์ค€๋‹ค.

sudo yum update
sudo yum install ruby
sudo yum install wget
cd /home/ec2-user
wget https://bucket-name.s3.region-identifier.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
sudo service codedeploy-agent status

๊ทธ๋ž˜์„œ ์ด๋ ‡๊ฒŒ ์‹คํ–‰๋˜๋ฉด ๋œ๋‹ค.




EC2์— ์—ญํ•  ๋ถ€์—ฌ

Code Deploy์—์„œ EC2์— ๊ฝ‚์„ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด EC2์—๋„ ํŠน์ •ํ•œ ๊ถŒํ•œ์„ ๋„ฃ์–ด์ค˜์•ผ ํ•œ๋‹ค.

๋‚œ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด๋‘”๊ฑธ ์ผ๋Š”๋ฐ


Code Deploy Role์ด ์žˆ์–ด์•ผ ํ•˜๊ณ 


์‹ ๋ขฐ๊ด€๊ณ„๋Š” ์ด๋ž˜ ์ฃผ๋ฉด ๋œ๋‹ค.




Code Pipeline ์ƒ์„ฑ

์ด์ œ CI/CD ๊ตฌ์„ฑ ์‹œ์ž‘์ด๋‹ค.

์ด๋ฆ„ ๋จผ์ € ์ง“๊ณ 


์†Œ์Šค๋ฅผ ์–ด๋””์„œ ๋ฐ›์•„์˜ฌ์ง€๋ฅผ ์ •ํ•œ๋‹ค.

Codebuild๋„ ๋งŒ๋“ค์–ด์ฃผ์ž

์ด๊ฑด ๋”ฐ๋กœ ๋งŒ๋“ ๋‹ค์Œ์— ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•œ๋‹ค.




Code build ์ƒ์„ฑ

๋ฐฐํฌ ํ™˜๊ฒฝ๋“ค์€ ๋Œ€์ถฉ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์„ฑ์œผ๋กœ๋งŒ ์คฌ๊ณ 

buildspec๋งŒ ์ž˜ ๋‹ฌ์•„์คฌ๋‹ค.

buildspec์—์„œ๋Š” ํ™˜๊ฒฝ๋ณ€์ˆ˜๋งŒ ๋‹ค์šด๋ฐ›๊ณ  ๋ฐ”๋กœ exportํ•˜๋„๋ก ๊ตฌ์„ฑํ–ˆ๋‹ค.

version: 0.2

phases:
  pre_build:
    commands:
      - echo foo
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - aws s3 cp s3://.../prod/.env .env
  post_build:
    commands:
      - echo Build completed on `date`
      - echo success

artifacts:
  files:
    - '**/*'
    - '*'



Code Deploy ์ƒ์„ฑ

๋‹ค์Œ์€ ๊ฐ€์žฅ ์ค‘์š”ํ•œ CodeDeploy๋‹ค.

์ด๊ฒƒ๋„ CodeDeploy ์ฝ˜์†” ๊ฐ€์„œ ๋งŒ๋“ค์–ด์ค€ ๋‹ค์Œ์— ์—ฐ๊ฒฐํ•ด์ค˜์•ผ ํ•œ๋‹ค.

์•ฑ ๋จผ์ € ๋งŒ๋“ค์–ด์ฃผ๊ณ 

๊ฑฐ๊ธฐ๋‹ค ๋ฐฐํฌ ๊ทธ๋ฃน์„ ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

์—ญํ• ์€ ๋Œ€์ถฉ CodeDeploy ๊ถŒํ•œ ๋‹ค ๋‹ฌ์•„๋†“์€ ์—ญํ•  ๋งŒ๋“ค์–ด์„œ ๋ถ™์—ฌ์ฃผ๋ฉด ๋˜๊ณ ,
์—ฌ๊ธฐ์„œ๋Š” ๊ตณ์ด ๋ธ”๋ฃจ/๊ทธ๋ฆฐ ๋ฐฐํฌ๊ฐ€ ํ•„์š”ํ•˜์ง€๋Š” ์•Š์œผ๋‹ˆ ๋ฐฐํฌ ํƒ€์ž…์€ ํ˜„์žฌ ์œ„์น˜๋กœ ํ•ด์ค€๋‹ค.

ํ™˜๊ฒฝ ๊ตฌ์„ฑ ํƒญ์—์„œ๋Š” ์–ด๋–ค EC2์— ๊ฝ‚์„์ง€๋ฅผ ์ •ํ•œ๋‹ค.
์ด๋ฆ„์œผ๋กœ ํ•ด์„œ ๋งค์นญ์‹œํ‚ค๋ฉด ๋œ๋‹ค.

code deploy agent๋ฅผ ๊น”์ง€ ๋ง์ง€๋ฅผ ๋ฌผ์–ด๋ณด๋Š” ๋ถ€๋ถ„์ด๋‹ค.
์•„๊นŒ ์œ„์˜ ์ปค๋งจ๋“œ๋กœ ๊น”์•˜๋‹ค๋ฉด "์•ˆ ํ•จ"์œผ๋กœ ํ•ด๋„ ๋œ๋‹ค.

๋ฐฐํฌ๋Š” ํ•œ๋ฒˆ์— ๋ฐฐํฌํ•˜๊ณ 

๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ๋Š” ๋ˆ๋‹ค. ํ•„์š”์—†๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด๋†“๊ณ  ์™„๋ฃŒ ๋ฒ„ํŠผ ๋ˆ„๋ฅด๋ฉด ๋์ธ๋ฐ...

์ž ๊น๋งŒ ๊ธฐ๋‹ค๋ ค๋ณด๋ผ.
ํ•˜๋‚˜ ๋” ์„ธํŒ…ํ•ด์•ผ ํ• ๊ฒŒ ์žˆ๋‹ค.




appspec ์„ธํŒ…

buildspec์ด ๋นŒ๋“œ์— ๋Œ€ํ•œ ์„ค์ •ํŒŒ์ผ์ด๋ผ๋ฉด, appspec์€ ๋ฐฐํฌ์— ๋Œ€ํ•œ ์„ค์ •ํŒŒ์ผ์ด๋‹ค.
์ด๊ฑด ๋ฌด์กฐ๊ฑด ๋ฃจํŠธ๊ฒฝ๋กœ์— ์žˆ์–ด์•ผ ํ•œ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.

version: 0.0
os: linux
files:
  - source: /
    destination: /home/ec2-user/app
    overwrite: true
hooks:
  ApplicationStop:
    - location: scripts/stop.sh
      runas: ec2-user
    - location: scripts/clear.sh
      runas: root
  Install:
    - location: scripts/install.sh
      runas: root
  ApplicationStart:
    - location: scripts/restart.sh
      runas: ec2-user

files๋Š” codebuild์—์„œ ๋ฐ›์•„์˜จ ํŒŒ์ผ๋“ค์„ ์–ด๋–ป๊ฒŒ EC2์— ์ง‘์–ด๋„ฃ์„์ง€์— ๋Œ€ํ•œ ๋ถ€๋ถ„์ด๋‹ค. ๋‚œ /home/ec2-user/app๋ผ๋Š” ๊ฒฝ๋กœ์— ๋ณต๋ถ™ํ•˜๋„๋ก ํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ , hooks๋Š” ๊ฐ ์ด๋ฒคํŠธ์— ๋งž์ถฐ์„œ ์–ด๋–ค ๋™์ž‘์„ ์‹คํ–‰ํ• ์ง€ ์ง€์ •ํ•˜๋Š” ๋ถ€๋ถ„์ด๋‹ค. ์‰˜์ฝ”๋“œ๋ฅผ ํ”„๋กœ์ ํŠธ์— ์ž‘์„ฑํ•ด๋‘” ๋‹ค์Œ์—, ๊ทธ ๊ฒฝ๋กœ๋ฅผ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.
๊ฐœ์ธ์ ์œผ๋กœ ๋‚œ ์ด๊ฒŒ ์ข€ ๋งŽ์ด ๊ท€์ฐฎ๊ณ  ์งœ์ฆ๋‚ฌ๋‹ค.

์„ธํŒ…ํ•˜๊ธฐ์ „์— ์‹น ๋‚ ๋ฆฌ๊ณ , installํ•ด์„œ pm2 restart๋ฅผ ๋•Œ๋ฆฌ๋„๋ก ํ–ˆ๋‹ค.

์ด๊ฒŒ node ๊ด€๋ จํ•ด์„œ ํ™˜๊ฒฝ๋ณ€์ˆ˜๊ฐ€ ๊ผฌ์ผ๋•Œ๊ฐ€ ๋งŽ์•„์„œ ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ๋‹ค ๋•Œ๋ ค๋ฐ•์•˜๋‹ค.




๋

appspec.yml์„ ๋ฃจํŠธ์—๋‹ค ์ž˜ ์ €์žฅํ•ด๋†จ๋‹ค๋ฉด, ์ด์ œ Code Pipeline์„ ๋งŒ๋“ค์–ด์ฃผ์ž.

๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ๋งŒ๋“ค์–ด์งˆ ๊ฒƒ์ด๋‹ค.

๊ทธ๋Ÿผ ์ด๋Ÿฐ์‹์œผ๋กœ ์ด๋ฒคํŠธ ๋‹จ์œ„๋กœ ๋ฐฐํฌ๊ฐ€ ๋  ๊ฒƒ์ด๊ณ 

EC2์—์„œ๋„ ๋ฐ˜์˜์ด ๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.



์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/codedeploy-agent-operations-install-linux.html
https://docs.aws.amazon.com/ko_kr/codedeploy/latest/userguide/reference-appspec-file.html#appspec-reference-server
https://yoo11052.tistory.com/113
https://stackoverflow.com/questions/39520571/codedeploy-pm2-command-not-found