๐Ÿ‘จ‍๐Ÿ‘ฉ‍๐Ÿ‘ง‍๐Ÿ‘ฆ Project/๐Ÿ“บ KIOSEK

๋ฐฐํฌ ์ž๋™ํ™” ๊ตฌ์ถ•๊ธฐ

DevPoong 2023. 7. 31. 23:31
 

1. ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋œ ๊ณ„๊ธฐ

 

ํ˜„์žฌ ๊ต๋‚ด ์„œ๋ฒ„์‹ค์— ์šด์˜์„œ๋ฒ„๊ฐ€ ๊ตฌ์ถ•๋˜์–ด ์žˆ๊ณ ,
๊ต๋‚ด๋ง ์ •์ฑ…์— ๋”ฐ๋ผ ์™ธ๋ถ€ ์•ก์„ธ์Šค ํฌํŠธ๋Š” 80, 443 2๊ฐœ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ฏธ 80, 443์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ต๋‚ด๋ง์— ์ ‘์†ํ•ด ์žˆ์„ ๋•Œ๋งŒ 22๋ฒˆ ํฌํŠธ๋กœ ssh ์ ‘์†์„ ํ†ตํ•ด ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์šด์˜์„œ๋ฒ„์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ด๋ ‡๋“ฏ ๊ต๋‚ด๋ง์— ์ ‘์†ํ•ด์•ผ๋งŒ ํ•œ๋‹ค๋Š” ๋ฌธ์ œ๋„ ์žˆ์—ˆ์ง€๋งŒ,
๊ฒฐ๊ตญ์—๋Š” ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋‹ค ๋ณด๋‹ˆ ๋ช…๋ น์–ด๋ฅผ ์ž˜๋ชป ์ž…๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์—ˆ๊ณ  ๋ฐฐํฌํ•  ๋•Œ๋งˆ๋‹ค ๋ฐ˜๋ณต๋˜๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜๋‹ค ๋ณด๋‹ˆ ๋ฐฐํฌ ์ž๋™ํ™”๊ฐ€ ์ •๋ง ์ ˆ์‹คํ–ˆ๋‹ค.

 

2. ๋ฐฐํฌ ์ž๋™ํ™” ํ”Œ๋กœ์šฐ

์šฐ์„  Jenkins๋ฅผ ์ด์šฉํ•˜์—ฌ ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ ์ž ํ•œ๋‹ค.

  1. PR์ด Master ๋ธŒ๋žœ์น˜๋กœ Merge๋˜๋ฉด Github WebHook์ด Trigger ๋œ๋‹ค.
  2. ํ•ด๋‹น Gtihub Webhook์„ ํ†ตํ•ด ์•„๋ž˜์˜ Jenkins์˜ ๋ฐฐํฌ PipeLine์ด ์‹คํ–‰๋œ๋‹ค.
  3. Github๋ฅผ ํ†ตํ•ด ์ฝ”๋“œ๋ฅผ ๋ณต์‚ฌํ•ด ์˜จ๋‹ค. 
  4. ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•œ๋‹ค.
  5. docker build๋ฅผ ํ†ตํ•ด image๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.
  6. ECR๋กœ ํ•ด๋‹น docker image๋ฅผ push ํ•œ๋‹ค.
  7. EC2์— ๋“ฑ๋กํ•ด ๋†“์€ deploy.sh ์‰˜ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•œ๋‹ค.

์ด๋ฒˆ์— ๋ฐฐํฌ ์ž๋™ํ™”๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉด์„œ ์ •๋ง ๋งŽ์€ ์˜ค๋ฅ˜๋ฅผ ์ ‘ํ–ˆ๊ณ , ํ•˜๋‚˜์˜ ์˜ค๋ฅ˜๋ฅผ ์žก์ง€ ๋ชปํ•ด์„œ ์ดํ‹€ ๋™์•ˆ ๊ณ ์ƒํ•˜๊ธฐ๋„ ํ–ˆ๋‹ค.

 

3.  (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 1) .gitignore ์ฒ˜๋ฆฌํ•œ ๋น„๋ฐ€์ •๋ณด๋ฅผ ํฌํ•จํ•œ yml ์„ค์ • ํŒŒ์ผ

DB์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๋‚˜ ํ† ํฐ์˜ key ๋“ฑ ์—ฌ๋Ÿฌ ์•”ํ˜ธ์ •๋ณด๋ฅผ ํฌํ•จํ•œ yml ํŒŒ์ผ๋“ค์€ ์ด๋ฏธ .gitignore ์„ค์ •์„ ํ†ตํ•ด github์—๋Š” ์˜ฌ๋ผ๊ฐ€ ์žˆ์ง€ ์•Š์€ ์ƒํƒœ์ด๋‹ค.
๋”ฐ๋ผ์„œ, Jenkins์—์„œ ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ๋“  ํ•ด๋‹น ์ •๋ณด๋“ค์„ ์‚ฝ์ž…ํ•ด์ค˜์•ผ ํ•œ๋‹ค.

ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฉ๋ฒ•์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์—ˆ๋‹ค.

  1. private repo๋กœ ๋งŒ๋“ ๋‹ค.
  2. ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ์ด์šฉํ•˜๊ณ  .gitignore ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ์•”ํ˜ธํ™”๋œ ๋น„๋ฐ€์ •๋ณด๋ฅผ ymlํŒŒ์ผ์— ๋„ฃ๊ณ  .gitignore๋ฅผ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
  4. git submodule์„ ์ด์šฉํ•˜์—ฌ public repo์— ์„ค์ •์ •๋ณด๋“ค์ด ๋‹ด๊ธด private sub repo๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.
  5. Config Server๋ฅผ ์ด์šฉํ•œ๋‹ค.

์—ฌ๋Ÿฌ ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋งŒ, ๋‚˜๋Š” 4๋ฒˆ ๋ฐฉ๋ฒ•์„ ์„ ํƒํ•˜์˜€๋‹ค.

Git์— submodule์ด๋ผ๋Š” ๊ฐœ๋…์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์ด๋ฒˆ ๊ธฐํšŒ์— ์•Œ๊ฒŒ ๋˜์—ˆ๊ณ , application-db.yml๊ณผ ๊ฐ™์ด ๋น„๋ฐ€์ •๋ณด๊ฐ€ ๋‹ด๊ธด ํŒŒ์ผ์„ private repo์— ์ €์žฅํ•˜๊ณ  ์ด submodule์„ ๋ฐฐํฌํ•˜๋ ค๋Š” public repo์— ์ถ”๊ฐ€ํ•ด ์ฃผ์—ˆ๋‹ค.

ํ•ด๋‹น ๋ฐฉ์‹์„ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์šฐ์„  Github access token์„ Jenkins Credentials์— ์ถ”๊ฐ€ํ•ด์ฃผ์–ด์•ผ ํ•˜๊ณ  ์•„๋ž˜์™€ ๊ฐ™์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•œ๋‹ค.

checkout scmGit(
        branches: [[name: 'master']],
        extensions: [submodule(parentCredentials: true,reference: '', trackingSubmodules: true)],
        userRemoteConfigs: [[credentialsId: 'access token credentials id', url: 'https://github.com/{๋ฐฐํฌํ•˜๋ ค๋Š”repo}']]
)

 

 

4. (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 2) Jenkins ๋‚ด๋ถ€์—์„œ docker๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š์Œ

๋‚˜๋Š”  Jenkins๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ•˜์˜€๋‹ค.
๋˜ํ•œ, ํŒŒ์ดํ”„๋ผ์ธ ๋‚ด์— docker build, push ๋“ฑ์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์กด์žฌํ•˜์ง€๋งŒ "docker not found" ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

๊ฒฐ๋ก ์ ์œผ๋กœ๋Š” Jenkins ์ปจํ…Œ์ด๋„ˆ์˜ docker.sock์„ Host์˜ docker.sock์— ๋งˆ์šดํŠธ ํ•ด์ฃผ์ง€ ์•Š์•„์„œ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.
Jenkins๋ฅผ Docker ์ปจํ…Œ์ด๋„ˆ ํ™˜๊ฒฝ์œผ๋กœ ์‹คํ–‰ํ•˜๋ฉด ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ Host์˜ Docker๋ฅผ ์ด์šฉํ•˜์—ฌ ์ž‘์—…์„ ํ•ด์•ผ ํ•œ๋‹ค.
ํ•˜์ง€๋งŒ, ๊ทธ๊ฒŒ Host์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์ง€ ์•Š์•„์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ด์—ˆ๋‹ค.

docker.sock(Docker Socket)์ด๋ž€ ๋„์ปค ๋ฐ๋ชฌ์ด ๊ธฐ๋ณธ์œผ๋กœ Listen ํ•˜๊ณ  ์žˆ๋Š” ์œ ๋‹‰์Šค ์†Œ์ผ“์ด๋‹ค. ๊ฒฐ๊ตญ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์—์„œ ๋ฐ๋ชฌ๊ณผ ์ƒํ˜ธ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

 

5. (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 3) Jenkins๋ฅผ ๊ตฌ๋™ํ•˜๋Š” EC2 ์„œ๋ฒ„์˜ ๊ณ„์†๋œ Down

Jenkins๋ฅผ ๊ตฌ๋™ ์ค‘์ธ ์„œ๋ฒ„๋Š” ํ”„๋ฆฌํ‹ฐ์–ด๋กœ ๊ตฌ์„ฑํ•˜์—ฌ์„œ ์„ฑ๋Šฅ์ด ๋งค์šฐ ๋‚ฎ๋‹ค. RAM๋„ 1GB์—ฌ์„œ Jenkins์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ๋Š” ๋ฌด๋ฆฌ๊ฐ€ ์žˆ๋‹ค.
์ž‘์—…์„ ์›ํ™œํ•˜๊ฒŒ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” Swap ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ค์ •ํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

์ด๊ฑธ ๋ชฐ๋ž์„ ๋•Œ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋‚˜ ์ฐธ ๋‚œ๊ฐํ–ˆ์—ˆ๋‹ค. ์ธ์Šคํ„ด์Šค์— ์ ‘์†ํ•ด์„œ ์•„๋ž˜ ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ๋œ๋‹ค.

sudo fallocate -l 1.5G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile

 

 

6. (ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… 4) No basic auth credentials Error

ํ•ด๋‹น ์—๋Ÿฌ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์ดํ‹€ ๋™์•ˆ ๊ณ ์ƒํ•œ ๊ธฐ์–ต์ด ์žˆ๋‹ค.

aws configure ๋ช…๋ น์„ ํ†ตํ•ด ์ •๋ณด๋ฅผ ๋“ฑ๋กํ•˜๊ณ 
aws ecr get-login-password --region ap-northeast-2 | docker login -u AWS --password-stdin{๊ณ„์ •๋ฒˆํ˜ธ}.dkr.ecr.ap-northeast-2.amazonaws.com ๋ช…๋ น์„ ํ†ตํ•ด ์ธ์ฆ์ฝ”๋“œ๋ฅผ ๊ฐฑ์‹ ํ•˜์˜€์Œ์—๋„ ๊ณ„์†ํ•ด์„œ ํ•ด๋‹น ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜์˜€๋‹ค.

์ •๋ง ํฌ๊ธฐํ• ๊นŒ ์ˆ˜์‹ญ ๋ฒˆ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€ ์•„๊นŒ์›Œ์„œ๋ผ๋„ ๊ณ„์† ์ด๊ฒƒ์ €๊ฒƒ ๋ณ€๊ฒฝํ•ด ๋ณด๋ฉด์„œ ์ˆ˜์ •ํ•˜๋‹ค๊ฐ€
deploy.sh ์Šคํฌ๋ฆฝํŠธ ๋‚ด์— sudo docker compose up -d ๋ช…๋ น์—์„œ sudo๋ฅผ ์‚ญ์ œํ•ด ๋ณด๋‹ˆ ์ž˜๋˜์—ˆ๋‹ค. 

๋ˆˆ๋ฌผ์ด ํ•‘ ๋Œ์•˜๋‹ค.. ์™œ sudo๋ฅผ ์ง€์› ์„ ๋•Œ ์ž˜๋˜๋Š”์ง€ ์‚ฌ์‹ค ์ดํ•ด๊ฐ€ ์ž˜ ๊ฐ€์ง€๋Š” ์•Š๋Š”๋‹ค.
๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜์˜€์ง€๋งŒ, ํ•ด๋‹น ๋ถ€๋ถ„์— ๋Œ€ํ•ด ๊ธฐ์ˆ  ๋ถ€์ฑ„๋ฅผ ๋– ์•ˆ์€ ๊ฒƒ ๊ฐ™์•„ ๋งˆ์Œ์ด ๋ฌด๊ฒ๋‹ค.

 

ํ›„๊ธฐ

๋ฐฐํฌ์ž๋™ํ™”๋ฅผ ๊ฒฐ๊ตญ 3์ผ ๋งŒ์— ๊ตฌ์ถ•ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์œ„์— ์ž‘์„ฑํ•œ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ์ผ€์ด์Šค ์ด์™ธ์—๋„ ์ •๋ง ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์—ˆ๋‹ค. ๊ทธ๋ƒฅ ํ•˜์ง€ ๋ง๊นŒ๋ผ๋Š” ๊ณ ๋ฏผ์„ ๊ณ„์†ํ–ˆ์ง€๋งŒ ์‹œ๊ฐ„์„ ์Ÿ์•„ ๋„ฃ๋Š” ๋งŒํผ ์—๋Ÿฌ๋Š” ํ•˜๋‚˜์”ฉ ์ง€์›Œ์ ธ ๋‚˜๊ฐ”๋‹ค. ๋ฐฐํฌ ์ž๋™ํ™”๋ผ๋Š” ๊ฒŒ ์ •๋ง ํฐ ์ˆ™์ œ์ฒ˜๋Ÿผ ๋Š๊ปด์กŒ์—ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ๊ตฌ์ถ•ํ•˜๊ณ  ๋‚˜๋‹ˆ ํ•œ ๋‹จ๊ณ„ ์„ฑ์žฅํ–ˆ๋‹ค๋Š” ์ƒ๊ฐ์ด ๋“ ๋‹ค.

๊ฒฐ๊ตญ Jenkins๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์ด์šฉํ•œ ๊ฒƒ๋ฟ์ด์ง€๋งŒ 3์ผ ๋™์•ˆ "์ด๊ฑฐ ํ•˜๋‚˜ ์ œ๋Œ€๋กœ ๋ชปํ•˜๋‚˜"๋ผ๋Š” ์ƒ๊ฐ์— ์ •๋ง ํž˜๋“ค์—ˆ๋‹ค.
์ƒ๊ฐ๋ณด๋‹ค ๋‚ด ์ผ€์ด์Šค์— ๋งž๋Š” ์ฐธ๊ณ ์ž๋ฃŒ๋Š” ๋ณ„๋กœ ์—†์—ˆ๊ณ , ๊ด€๋ จ๋œ ์ฑ…๊ณผ StackOverFlow๋„ ์ „๋ถ€ ๋’ค์ ธ๋ณด๊ณ  ๋‚˜์„œ์•ผ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
๋ฌด์ž‘์ • ์—๋Ÿฌ๋ฅผ ๋ณต์‚ฌํ•ด์„œ ๊ฒ€์ƒ‰์ฐฝ์— ๋ถ™์—ฌ ๋„ฃ๊ธฐ ํ•ด์„œ ํ•ด๊ฒฐํ•œ ๊ฒฝ์šฐ๋„ ๋ฌผ๋ก  ์žˆ์—ˆ์ง€๋งŒ, ์™œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ ๊ฒƒ์ธ์ง€๋ฅผ ๋จผ์ € ์ƒ๊ฐํ•ด ๋ณด๊ณ  ๊ฒ€์ƒ‰ํ•˜์˜€์„ ๋•Œ ๋ฌธ์ œ ํ•ด๊ฒฐ ์†๋„๊ฐ€ ๋” ๋น ๋ฆ„์„ ๋Š๊ผˆ๋‹ค.

์ด์ œ ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌํ•˜์ง€ ์•Š๊ณ  ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์–ด ๋”์šฑ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์ด ์„ธ๋ จ๋˜์—ˆ๋‹ค.
๋ฉฐ์น  ์ „์—๋Š” ๊ฐœ๋ฐœ์„œ๋ฒ„๋ฅผ Cloud ํ™˜๊ฒฝ์œผ๋กœ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…์„ ์ง„ํ–‰ํ•˜์˜€๋Š”๋ฐ, ์ด๋ฒˆ์—๋Š” ๋ฐฐํฌ์ž๋™ํ™”๊นŒ์ง€ ๊ตฌ์ถ•ํ•˜์—ฌ ์ ์  ๋” ํ™˜๊ฒฝ์„ ๋ฐœ์ „์‹œํ‚ค๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ์„ฑ์ทจ๊ฐ์ด ํ™•์‹คํžˆ ์žˆ๋‹ค.
๋‹ค์Œ์—๋Š” ECS๋กœ ๋ฐฐํฌ ํ™˜๊ฒฝ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ๊ทธ์— ๋Œ€ํ•ด script๋ฅผ ๋ณ€๊ฒฝํ•ด ๋ด์•ผ๊ฒ ๋‹ค.