๐Ÿฌ ๋„์ปค ๊นƒํ—ˆ๋ธŒ ์•ก์…˜

ozzingยท2022๋…„ 5์›” 22์ผ
0
post-thumbnail

๋„์ปค

๋ฆฌ๋ˆ…์Šค ์ปจํ…Œ์ด๋„ˆ์— ํ”„๋กœ์„ธ์Šค ๊ฒฉ๋ฆฌ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ์ปจํ…Œ์ด๋„ˆ๋กœ์„œ ๋” ์‰ฝ๊ฒŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋งŒ๋“ค์–ด์ง„ ์˜คํ”ˆ์†Œ์Šค ํ”„๋กœ์ ํŠธ

๊ธฐ์กด ๊ฐ€์ƒํ™” ๊ธฐ์ˆ 

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๊ฒŒ์ŠคํŠธ OS๋ฅผ ํ•˜๋‚˜์˜ ํ˜ธ์ŠคํŠธ OS ์œ„์— ์ƒ์„ฑ
  • ํ•˜์ดํผ๋ฐ”์ด์ €๋ฅผ ๊ฑฐ์ณ ์„ฑ๋Šฅ ์ €ํ•˜
  • ๊ฒŒ์ŠคํŠธ OS ์‚ฌ์šฉ์„ ์œ„ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ปค๋„ ๋“ฑ์˜ ํฌํ•จ์œผ๋กœ ์ด๋ฏธ์ง€ ์‚ฌ์ด์ฆˆ ์ฆ๊ฐ€

๋„์ปค ์ปจํ…Œ์ด๋„ˆ

  • ํ”„๋กœ์„ธ์Šค ๋‹จ์œ„์˜ ๊ฒฉ๋ฆฌ ํ™˜๊ฒฝ์œผ๋กœ ๋งค์šฐ ์ ์€ ์„ฑ๋Šฅ ์†์‹ค
  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ์‹คํ–‰ํŒŒ์ผ๋งŒ ํฌํ•จํ•˜์—ฌ ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰ ์ €ํ•˜
  • ์ด๋ฏธ์ง€ ์šฉ๋Ÿ‰ ์ €ํ•˜์— ๋”ฐ๋ฅธ ๋ฐฐํฌ ์‹œ๊ฐ„ ๋‹จ์ถ•

๋„์ปค ์‚ฌ์šฉ ์‹œ => ๊ฐœ๋ฐœ ๋ฐ ๋ฐฐํฌ ๊ณผ์ •์˜ ํŽธ๋ฆฌ์„ฑ! ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋…๋ฆฝ์„ฑ๊ณผ ํ™•์žฅ์„ฑ!


๊นƒํ—ˆ๋ธŒ ์•ก์…˜

๊นƒํ—ˆ๋ธŒ ์ €์žฅ์†Œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ Workflow๋ฅผ ์ž๋™ํ™” ํ•˜๋Š” CI/CD ๋„๊ตฌ

  • build, test, package, release, deploy ๋“ฑ ๋‹ค์–‘ํ•œ ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ Workflow ์ƒ์„ฑ
  • Runners๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํ™˜๊ฒฝ์—์„œ ์ง์ ‘ ๊ตฌ๋™ ๊ฐ€๋Šฅ
  • ์ €์žฅ์†Œ๋งˆ๋‹ค ์ตœ๋Œ€ 20๊ฐœ์˜ Workflow ๋“ฑ๋ก ๊ฐ€๋Šฅ
  • ๊ฐ Workflow์˜ Job๋งˆ๋‹ค ์ตœ๋Œ€ 6์‹œ๊ฐ„ ๋™์•ˆ ์‹คํ–‰, ์ดˆ๊ณผ์‹œ ์ž๋™ ์ค‘์ง€
  • Job์—์„œ Github API ํ˜ธ์ถœ์‹œ 1์‹œ๊ฐ„ ๋™์•ˆ ์ตœ๋Œ€ 1,000๋ฒˆ ๊ฐ€๋Šฅ

์žฅ์ 

  • ๋‹ค๋ฅธ CI ํˆด๊ณผ ๋‹ฌ๋ฆฌ ๋ณต์žกํ•˜์ง€ ์•Š์€ ์ ˆ์ฐจ, ๋ณ„๋„ ์„ค์น˜ ํ•„์š” ์—†์Œ
  • Workflow ๋ณต์ œ ์šฉ์ด
  • Github์™€์˜ ํ†ตํ•ฉ
  • ์—ฌ๋Ÿฌ OS ๋ฐ ๋Ÿฐํƒ€์ž„ ๋ฒ„์ „ ๋™์‹œ ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ
  • ๋ชจ๋“  ์–ธ์–ด ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ, ํ…Œ์ŠคํŠธ ๋ฐ ๋ฐฐํฌ ๊ฐ€๋Šฅ
  • ์„ค์ • ์ž์ฒด์— ๋งŽ์€ ์‹œ๊ฐ„์„ ์Ÿ์ง€ ์•Š์•„๋„ ๊ฐ€๋Šฅ -> ์ž‘์€ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์— ์šฉ์ด

๋‹จ์ 

  • ๋ฌธ์„œ ๋ถ€์กฑ
  • ๊ฐœ๋ณ„ Workflow ์‚ญ์ œ ๋ถˆ๊ฐ€๋Šฅ
  • Workflow์—์„œ ๋‹จ์ผ Job๋งŒ ์‹คํ–‰ ๋ถˆ๊ฐ€๋Šฅ
  • ํฐ ๊ทœ๋ชจ์˜ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์™„์ „ํ•˜์ง€ ๋ชปํ•œ ์ œ์–ด

๋„์ปค-๊นƒํ—ˆ๋ธŒ ์•ก์…˜

๊นƒํ—ˆ๋ธŒ ์•ก์…˜์„ ์ด์šฉํ•œ Docker Image Build ๋ฐ Push

image

ํ™˜๊ฒฝ

docker
docker-compose
nginx
gunicorn
mysql
python3.8
django(>=3.0)

nginx๋Š” ๋™์‹œ์ ‘์† ์ฒ˜๋ฆฌ์— ํŠนํ™”๋œ ์›น ์„œ๋ฒ„ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ, Apache๋ณด๋‹ค ๋™์ž‘์ด ๋‹จ์ˆœํ•˜๊ณ  ์ „๋‹ฌ์ž ์—ญํ• ๋งŒ ํ•œ๋‹ค.
gunicorn์€ Python WSGI(Web Server Gateway Interface)๋กœ python์œผ๋กœ ์ž‘์„ฑ๋œ ์›น ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ์„œ๋ฒ„ ์‚ฌ์ด์˜ ์ธํ„ฐํŽ˜์ด์Šค ๋˜๋Š” ๊ทœ์น™์ด๋‹ค.

image

nginx๋Š” ์—ฌ๋Ÿฌ๊ฐœ์˜ ์š”์ฒญ์„ ๋™์‹œ์— ๋ฐ›์•˜์„ ๋•Œ, ์ •์  ํŒŒ์ผ์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๋ฐ”๋กœ ๋Œ๋ ค์ฃผ๊ณ  ๋™์  ํŒŒ์ผ์€ gunicorn์„ ๊ฑฐ์ณ django์—๊ฒŒ ์š”์ฒญ์„ ๋„˜๊ธด๋‹ค.

๊ณผ์ •

.env ํŒŒ์ผ์— ์ž„์˜์˜ ์žฅ๊ณ  ์‹œํฌ๋ฆฟ ํ‚ค๋ฅผ ์ƒ์„ฑํ•ด ์ž…๋ ฅํ•œ๋‹ค.

Dockerfile ํŒŒ์ผ์„ ํ†ตํ•ด ๋„์ปค ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์†์‰ฝ๊ฒŒ ๋™์ผํ•œ ์ด๋ฏธ์ง€๋ฅผ ๋ฐ˜๋ณตํ•ด์„œ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

docker-compose.yml ํŒŒ์ผ๋กœ ๋…๋ฆฝ๋œ ์ปจํ…Œ์ด๋„ˆ์˜ ์‹คํ–‰ ์˜ต์…˜์„ ์ •์˜ํ•œ๋‹ค.

docker-compose up ์ปค๋งจ๋“œ๋ฅผ ํ†ตํ•ด ์ปจํ…Œ์ด๋„ˆ๋ฅผ ๊ฐœ์‹œํ•œ๋‹ค.

.env.prod ํŒŒ์ผ์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค(RDS) ๋ฐ EC2 ip ์ฃผ์†Œ, ์žฅ๊ณ  ์‹œํฌ๋ฆฟ ํ‚ค ๋“ฑ์„ ์ž…๋ ฅํ•œ๋‹ค.

Github Secrets-Actions์— .env.prod, EC2 ์„œ๋ฒ„ ํผ๋ธ”๋ฆญ DNS(IPv4) ์ฃผ์†Œ, ssh key (.pem) ์ „๋ฌธ์„ ์„ค์ •ํ•œ๋‹ค.

Actions ํƒญ์—์„œ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ master์— push ํ•œ ๋’ค ์ž ์‹œ ๊ธฐ๋‹ค๋ฆฌ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด Github Actions ๋˜๋Š” EC2 DNS ์ฃผ์†Œ์—์„œ ๋ฐฐํฌ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

image

image

๋ฌธ์ œ ๋ฐœ์ƒ ๋ฐ ํ•ด๊ฒฐ
์ดํ›„์— ๋””๋น„ ์—ฐ๊ฒฐํ•˜๋Š” ๊ณผ์ • ์ค‘ .env ํŒŒ์ผ๊ณผ .env.prod ํŒŒ์ผ์„ ๋™์ผํ•˜๊ฒŒ ์ทจ๊ธ‰ํ–ˆ๋‹ค. ๋‘ ํŒŒ์ผ์ด ๊ณต์œ ๊ฐ€ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ์ด๋‹ค.
๊ทธ๋ž˜์„œ prod ํŒŒ์ผ์— ๋””๋น„์— ๊ด€ํ•œ ์ •๋ณด๋“ค์„ ์ „๋ถ€ ์ง‘์–ด๋„ฃ๊ณ  ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๋Š”๋ฐ, KeyError๊ฐ€ ๊ณ„์† ๋ฐœ์ƒํ–ˆ๋‹ค.
ํ‚ค ์ž์ฒด๊ฐ€ ํ‹€๋ฆฐ์ค„์•Œ๊ณ  ๋ช‡ ๋ฒˆ ๊ฐ’์„ ๊ณ ์ณ์„œ ๋„ฃ์–ด๋ณด๊ธฐ๋„ ํ–ˆ์ง€๋งŒ ์•„๋‹ˆ์—ˆ๋‹ค. ๊ทธ๋ƒฅ .env ํŒŒ์ผ์— ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ธ์‹๋˜๋Š” ํ‚ค ๊ฐ’ ์ž์ฒด๊ฐ€ ์—†์—ˆ๋˜ ๊ฒƒ์ด๋‹ค.

0๊ฐœ์˜ ๋Œ“๊ธ€