๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

INFRA

[INFRA] ๋ณด์•ˆ์„ ๊ณ ๋ คํ•ด ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ค๊ณ„ํ•ด ๋ณด์ž

๐Ÿ“ ๋“ค์–ด๊ฐ€๋ฉฐ

์šฐ๋ฆฌ๋Š” ๊ธฐ์กด์— dev ์„œ๋ฒ„๋งŒ ์กด์žฌํ–ˆ๊ณ , prod ์„œ๋ฒ„๋Š” ์กด์žฌํ•˜์ง€ ์•Š์•˜๋‹ค.

prod ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•ด ์„ค๊ณ„ํ•œ๋‹ค๋ฉด, ์–ด๋–ค ์„ค๊ณ„๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ์‹œ์ž‘ํ–ˆ๋‹ค.

 

๊ทธ ๊ณผ์ •์— ๋Œ€ํ•ด ๊ธฐ๋กํ•ด๋ณด๊ณ ์ž ํ•œ๋‹ค.

1๏ธโƒฃ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™

์šฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ๋จผ์ € ๊ณ ๋ คํ•œ ๊ฒƒ์€ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์ด์—ˆ๋‹ค.

ํ˜„์žฌ AWS ์˜ ec2 ๋ฅผ ์ด์šฉํ•ด ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•œ dev ์„œ๋ฒ„์—์„œ์˜ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์€ ๋ชจ๋‘์—๊ฒŒ ์—ด๋ ค ์žˆ์—ˆ๋‹ค.

 

22๋ฒˆ ํฌํŠธ๋Š” ์šฐํ…Œ์ฝ” ๊ทœ์•ฝ์— ๋”ฐ๋ผ ํŠน์ • IP (์šฐํ…Œ์ฝ” ์บ ํผ์Šค ๋‚ด๋ถ€) ๋งŒ ์ ‘์†ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋‚˜, ๋‚˜๋จธ์ง€ ํฌํŠธ๋“ค์€ ๋ชจ๋“  IP ๊ฐ€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.

ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ง์ ‘ ์‚ฌ์šฉํ•˜๋Š” IP๊ฐ€ ๊ฒฐ๊ตญ dev ์„œ๋ฒ„์˜ IP ์˜€๊ธฐ ๋•Œ๋ฌธ์—, ์•…์˜์ ์ธ ์‚ฌ์šฉ์ž๊ฐ€ ํ•ด๋‹น IP๋กœ ๋Œ€๋Ÿ‰์˜ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ์„œ๋น„์Šค๊ฐ€ ์‰ฝ๊ฒŒ ๋‹ค์šด๋  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜€๋‹ค. ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ๋Š” ์„œ๋ฒ„ IP๋ฅผ ์ˆจ๊ธฐ๊ฑฐ๋‚˜ ๋ณดํ˜ธํ•˜๊ธฐ ์–ด๋ ค์› ๋‹ค.

๋˜ํ•œ 80 ํฌํŠธ๊ฐ€ ์ „ ์„ธ๊ณ„์— ๊ฐœ๋ฐฉ๋˜์–ด ์žˆ์œผ๋ฉด ์ž๋™ํ™”๋œ ์Šค์บ๋‹ ๋ด‡์ด๋‚˜ ์ทจ์•ฝ์  ๊ณต๊ฒฉ ์‹œ๋„์˜ ๋Œ€์ƒ์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌด์‹œํ•  ์ˆ˜ ์—†๋Š” ์œ„ํ—˜ ์š”์†Œ๊ฐ€ ๋œ๋‹ค. ๋” ๋‚˜์•„๊ฐ€ 80 ํฌํŠธ๋กœ ์™ธ๋ถ€ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋ฉด HTTPS๊ฐ€ ์•„๋‹Œ ํ‰๋ฌธ HTTP ์š”์ฒญ๋„ ๋ฐ›์•„๋“ค์—ฌ์งˆ ์ˆ˜ ์žˆ์–ด, ํ†ต์‹  ๋ณด์•ˆ ์ธก๋ฉด์—์„œ๋„ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ณด์•ˆ ๊ทธ๋ฃน์„ ๋ณ€๊ฒฝํ•ด์ฃผ์—ˆ๋‹ค.

 

 

ํ•ด๋‹น ๋ณด์•ˆ ๊ทธ๋ฃน์—์„œ๋Š” ssh ํ†ต์‹ ์„ bastion ์„œ๋ฒ„์—์„œ๋งŒ ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ง‰์•„ ๋‘”๋‹ค (์ด์— ๋Œ€ํ•ด์„œ๋Š” ์ถ”ํ›„์— ์„ค๋ช…ํ•œ๋‹ค.)
๋˜ํ•œ 443 ๊ณผ 80 ์— ๋Œ€ํ•ด์„œ๋Š” ๊ธฐ์กด๊ณผ ๊ฐ™์ด ๋ชจ๋“  IP ๋กœ๋ถ€ํ„ฐ์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ํŠน์ • ec2 ์— ๋Œ€ํ•ด์„œ๋งŒ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ–ˆ๋‹ค.

 

 

dev ์„œ๋ฒ„์˜ 80 ํฌํŠธ์™€ 443 ํฌํŠธ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ec2 ๊ฐ€ ๋ฐ”๋กœ LB ์—ญํ• ์„ ํ•˜๋Š” ec2 ์ด๋‹ค. ์ด ec2 ์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์€ ๋ชจ๋“  ip ๊ฐ€ 80 ๊ณผ 443 ์œผ๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‘์—ˆ๋‹ค.


์ฆ‰, ๊ธฐ์กด์˜ ์„œ๋ฒ„ ๊ตฌ์กฐ์—์„œ๋Š” dev ์„œ๋ฒ„ ๋”ฑ ํ•˜๋‚˜๋งŒ ์žˆ์—ˆ๋‹ค. 443, 80 ํฌํŠธ๋“ค์€ ๋ชจ๋“  IP ์— ๋Œ€ํ•ด ์—ด์–ด๋‘์—ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ฐœ์„ ๋œ ์„œ๋ฒ„์˜ ๊ตฌ์กฐ์—์„œ๋Š” lb ๋ฅผ ์•ž์— ๋‘๊ณ , lb ๋งŒ์ด ์„œ๋ฒ„ ์—ญํ• ์„ ํ•˜๋Š” ec2 ๋กœ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ฌ์ง€์–ด ssh ํ†ต์‹ ์„ ํ•˜๋Š” 22๋ฒˆ ํฌํŠธ๋Š” ํŠน์ • IP ๋„ ์•„๋‹Œ bastion ์œผ๋กœ๋งŒ ์—ด์–ด ๋‘์—ˆ๋‹ค.

 

2๏ธโƒฃ bastion 

์•ž์„œ ์–ธ๊ธ‰ํ•œ bastion ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?
์ด๋Š” ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์™ธ๋ถ€ ๋„คํŠธ์›Œํฌ์™€ ๋‚ด๋ถ€ ๋„คํŠธ์›Œํฌ ์‚ฌ์ด์— ์œ„์น˜ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์„œ๋ฒ„๋‹ค.

์‚ฌ์‹ค ์ด๋ ‡๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด ์–ด๋ ต๊ณ  ๋ณต์žกํ•ด๋ณด์ด์ง€๋งŒ, ๊ฐ„๋‹จํžˆ ๋งํ•˜์ž๋ฉด prod ์„œ๋ฒ„๊ฐ€ ๋„์›Œ์ง„ ec2 ๋ฅผ ์ ‘๊ทผํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ์ปฌ์˜ ํ„ฐ๋ฏธ๋„์—์„œ pem ํ‚ค๋ฅผ ํ†ตํ•ด ์ ‘์†ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ bastion ์„œ๋ฒ„๊ฐ€ ์ ‘์†ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋ง‰๋ง๋กœ ec2 ํ•˜๋‚˜ ๋” ๋„์›Œ์„œ ์ด ec2 ๊ฐ€ ๋Œ€์‹  ์ ‘์†ํ•˜๋Š” ๊ฒƒ๋ฟ์ด๋‹ค..

๊ธฐ์กด์˜ ๋ฐฉ์‹์ธ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋กœ์ปฌ์˜ ํ„ฐ๋ฏธ๋„์—์„œ pem ํ‚ค๋ฅผ ํ†ตํ•ด ์ ‘์† ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š”, ํ•ด๋‹น ์„œ๋ฒ„๊ฐ€ public ์œผ๋กœ ์—ด๋ ค ์žˆ๊ฑฐ๋‚˜ ํŠน์ • ip ์— ๋Œ€ํ•ด์„œ ์˜คํ”ˆ๋˜์–ด ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ์— ์ทจ์•ฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ bastion ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๋ฉด, ํ•ด๋‹น ์„œ๋ฒ„์˜ ssh ์ ‘์† ์ž์ฒด๋ฅผ ์„œ๋ฒ„๋ฅผ ๊ฒฝ์œ ํ•˜๋„๋ก ๊ฐ•์ œํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋‹ค์‹œ ๊ฐœ์„ ๋œ prod ์„œ๋ฒ„์˜ ๋ณด์•ˆ ๊ทธ๋ฃน์„ ํ™•์ธํ•ด๋ณด์ž. 22๋ฒˆ ํฌํŠธ๋Š” ์˜ค์ง bastion ์„œ๋ฒ„๋งŒ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

3๏ธโƒฃ SSM

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๋Š” bastion ์„œ๋ฒ„๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค!

 

์•ž์„œ ์ด์•ผ๊ธฐํ•œ ๊ฒƒ๊ณผ ๊ฐ™์ด ssh ํ†ต์‹ ์€ bastion ์„œ๋ฒ„๋กœ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค. bastion ์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด,  ์–ด๋–ป๊ฒŒ ssh ํ†ต์‹ ์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์„๊นŒ?

 

์šฐ๋ฆฌ๋Š” SSM ์„ ์‚ฌ์šฉํ•˜๊ธฐ๋กœ ํ–ˆ๊ธฐ์— ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

SSM ์ด๋ž€ ๋ฌด์—‡์ผ๊นŒ?
AWS์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ด€๋ฆฌ ์„œ๋น„์Šค๋กœ, EC2·์˜จํ”„๋ ˆ๋ฏธ์Šค ์„œ๋ฒ„·์ปจํ…Œ์ด๋„ˆ ๋“ฑ ์ธํ”„๋ผ๋ฅผ ์ค‘์•™์—์„œ ์›๊ฒฉ์œผ๋กœ ์ œ์–ด·์ž๋™ํ™” ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค€๋‹ค.  ์ฆ‰, pem ํ‚ค ์—†์ด AWS ๋‚ด๋ถ€์—์„œ CLI ๋กœ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•˜์ž๋ฉด, ๊ธฐ์กด์— pem ํ‚ค๋ฅผ ํ†ตํ•ด ๋กœ์ปฌ ํ„ฐ๋ฏธ๋„๋กœ ์ ‘์†ํ•ด์•ผ ํ–ˆ๋˜ ssh ํ„ฐ๋ฏธ๋„์„ AWS ์˜ ์›น ํŽ˜์ด์ง€ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.


์šฐ๋ฆฌ๊ฐ€ SSM ์„ ๋„์ž…ํ•œ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

โœ… 1. ๋น„์šฉ ์ธก๋ฉด

 

ํ˜„์žฌ EC2 ๊ตฌ์„ฑ

  • dev(1) + Nginx(1) + DB(1) + prod(1) = ์ด 4๋Œ€ → ์•ฝ $24/์›”(t2.micro ๊ธฐ์ค€)
  • Bastion ์„œ๋ฒ„ ์ถ”๊ฐ€ ์‹œ +$6/์›” ์ฆ๊ฐ€ → ๋ถˆํ•„์š”ํ•œ ๋น„์šฉ ๋ถ€๋‹ด์ด ์ฆ๊ฐ€ํ•œ๋‹ค.

๋ฐ˜๋ฉด, SSM ์€ ๊ณ ๊ธ‰ ํŒŒ๋ผ๋ฏธํ„ฐ ๋“ฑ ํŠน์ˆ˜ํ•œ ์˜ต์…˜์„ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ•œ ๋ฌด๋ฃŒ๋กœ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•˜๋‹ค.

โœ… 2. ๊ด€๋ฆฌ ํšจ์œจ์„ฑ ์ธก๋ฉด

Bastion ๋ฐฉ์‹

  • ๊ด€๋ฆฌํ•ด์•ผ ํ•  ์„œ๋ฒ„๊ฐ€ ํ•˜๋‚˜ ๋” ๋Š˜์–ด๋‚˜ ์šด์˜ ํฌ์ธํŠธ ์ฆ๊ฐ€
  • ๋ณด์•ˆ์„ ์œ„ํ•ด EC2 ์— ์ ‘๊ทผํ•˜๋Š” ์‚ฌ์šฉ์ž๋“ค์— ๋Œ€ํ•ด ์ง์ ‘ ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋กœ๊น…์„ ํ†ตํ•ด ์ถ”์ ํ•ด์•ผ ํ•œ๋‹ค.

SSM ๋ฐฉ์‹

  • ๋ณ„๋„์˜ ์„œ๋ฒ„๊ฐ€ ๋ถˆํ•„์š”ํ•˜๋ฉฐ, ๊ฐ ์ธ์Šคํ„ด์Šค์˜ ์—์ด์ „ํŠธ๋งŒ ๊ด€๋ฆฌํ•˜๋ฉด ๋œ๋‹ค.

 

โœ… 3. ๋ณด์•ˆ ๊ฐ•ํ™” ์ธก๋ฉด


Bastion ๋ฐฉ์‹

  • .pem ํ‚ค๋ฅผ ๋กœ์ปฌ/์„œ๋ฒ„์— ๋ณด๊ด€ํ•ด์•ผ ํ•จ → ํ‚ค ํƒˆ์ทจ ์‹œ ๋ณด์•ˆ ๋ฆฌ์Šคํฌ๊ฐ€ ์ฆ๊ฐ€ํ•œ๋‹ค.
  • 22๋ฒˆ ํฌํŠธ๊ฐ€ ์—ด๋ ค ์žˆ์–ด์•ผ ํ•˜๊ธฐ์— ์œ„ํ—˜ ์š”์†Œ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

SSM ๋ฐฉ์‹

  • pem ํ‚ค ๋ถˆํ•„์š”, IAM Role ๊ธฐ๋ฐ˜ ์ธ์ฆ → ์ž๊ฒฉ ์ฆ๋ช… ํƒˆ์ทจ ์œ„ํ—˜์ด ์ตœ์†Œํ™”๋œ๋‹ค.
  • 22๋ฒˆ ํฌํŠธ ๋‹ซ์„ ์ˆ˜ ์žˆ์Œ → ์™ธ๋ถ€ ๊ณต๊ฒฉ์„ ๋ฐ›์„ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ์†Œํ•œ๋‹ค

์ด๋Ÿฌํ•œ ๋น„์šฉ / ๊ด€๋ฆฌ / ๋ณด์•ˆ ์ธก๋ฉด์—์„œ ์šฐ๋ฆฌ๋Š” ๋ณด์•ˆ์„ ๊ณ ๋ คํ•œ ์„œ๋ฒ„ ์•„ํ‚คํ…์ฒ˜ ์„ค๊ณ„์—์„œ SSM ์ด ๋” ์ ์ ˆํ•œ ๋Œ€์•ˆ์ด๋ผ๊ณ  ํŒ๋‹จํ–ˆ๋‹ค.

4๏ธโƒฃ Private Subnet ๊ณผ Public Subnet

๊ธฐ์กด์—๋Š” ์„œ๋ฒ„๋ฅผ public subnet ์— ๋‘์–ด ํ•ด๋‹น ์„œ๋ฒ„์˜ ip ๋กœ ์–ผ๋งˆ๋“ ์ง€ ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ prod ์„œ๋ฒ„๋ฅผ ๊ตฌ์ถ•ํ•˜๋ฉฐ ๋ณด์•ˆ์„ ๊ณ ๋ คํ•˜๋Š” ๊ณผ์ •์—์„œ๋Š” prod ์„œ๋ฒ„๋ฅผ VPC ๋‚ด๋ถ€์˜ private subnet ์œผ๋กœ ์˜ฎ๊ธฐ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋‹ค.

 

Private Subnet ๊ณผ Public Subnet ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์€ ์ฃผ์ œ์—์„œ ์–ด๊ธ‹๋‚˜๋ฏ€๋กœ ๋”ฐ๋กœ ์–ธ๊ธ‰ํ•˜์ง€๋Š” ์•Š๊ฒ ๋‹ค.

ํ•ด๋‹น ๋‚ด์šฉ์ด ํ—ท๊ฐˆ๋ฆฌ์‹œ๋Š” ๋ถ„๋“ค์€ VPC / Private Subnet / Public Subnet ์— ๋Œ€ํ•ด ์ถ”๊ฐ€์ ์œผ๋กœ ํ•™์Šตํ•˜์‹œ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿค—


๐Ÿ™‹ private subnet ์œผ๋กœ ๋‘๋Š” ๊ฒƒ์˜ ํšจ๊ณผ
Private Subnet์— ์„œ๋ฒ„๋ฅผ ๋‘๋ฉด ํผ๋ธ”๋ฆญ IP๊ฐ€ ํ• ๋‹น๋˜์ง€ ์•Š์œผ๋ฉฐ, VPC ๋ผ์šฐํŒ… ํ…Œ์ด๋ธ”์— ์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด๊ฐ€ ์—†์œผ๋ฏ€๋กœ ์™ธ๋ถ€์—์„œ ์ง์ ‘ ์ ‘์†ํ•  ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ์ธ๋ฐ”์šด๋“œ ์š”์ฒญ์€ ์ฐจ๋‹จ๋œ๋‹ค.

๐Ÿ™‹ ์™œ ์ธ๋ฐ”์šด๋“œ ๊ทœ์น™์œผ๋กœ ์ด๋ฏธ prod ์„œ๋ฒ„๋กœ์˜ ์ ‘๊ทผ์„ ์ฐจ๋‹จํ–ˆ์Œ์—๋„ ์™œ private subnet ์„ ๊ณ ๋ คํ•ด์•ผ ํ• ๊นŒ?
์ด๋Š” ๋‚ด๊ฐ€ Private subnet / public subnet ์— ๋Œ€ํ•ด ๊ณ ๋ คํ•˜๋ฉด์„œ ๋“ค์—ˆ๋˜ ์˜๋ฌธ์ด๋‹ค.

๋ณด์•ˆ ๊ทธ๋ฃน์€ ์ผ์ข…์˜ ๋…ผ๋ฆฌ์  ๋ฐฉํ™”๋ฒฝ์— ๊ฐ€๊น๋‹ค. ์„œ๋ฒ„์— ํผ๋ธ”๋ฆญ IP๊ฐ€ ์žˆ์œผ๋ฉด ์™ธ๋ถ€์—์„œ '์ง‘ ์œ„์น˜(IP)' ์ž์ฒด๋Š” ์•Œ ์ˆ˜ ์žˆ๊ณ , ๋‚˜๋Š” SG๋ผ๋Š” ๊ทœ์น™(‘๊ฐ€์กฑ๋งŒ ๋“ค์–ด์™€’)์œผ๋กœ ๋ฌธ์„ ๋‹ซ์•„๋‘”๋‹ค. ํ•˜์ง€๋งŒ ๋งŒ์•ฝ ๊ทœ์น™์„ ์ž˜๋ชป ์ ์šฉํ•˜๋ฉด ๊ทธ ํ‹ˆ์„ ํƒ€ ๋„๋‘‘์€ ๋ฐ”๋กœ ๋“ค์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๋ฐ˜๋Œ€๋กœ ์„œ๋ฒ„๋ฅผ Private Subnet์— ๋‘๋ฉด ์•„์˜ˆ ์™ธ๋ถ€์™€ ์—ฐ๊ฒฐ๋œ ๊ธธ(์ธํ„ฐ๋„ท ๊ฒŒ์ดํŠธ์›จ์ด)์ด ์—†๊ธฐ ๋•Œ๋ฌธ์—, ๋„๋‘‘์€ ์ง‘์— ์˜ค๋Š” ๊ธธ ์ž์ฒด๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋‹ค. ์ฆ‰, ๋‹จ์ˆœํžˆ ๋ฌธ์„ ์ž ๊ทธ๋Š” ๊ฒƒ(SG)๋ณด๋‹ค, ์ง‘ ์ž…๊ตฌ๋ฅผ ์™ธ๋ถ€ ๋„๋กœ์™€ ๋‹จ์ ˆ ์‹œ์ผœ ๋„คํŠธ์›Œํฌ ๊ฒฝ๊ณ„ ์ฐจ์›์—์„œ ๋ง‰๋Š” ์…ˆ์ด๋‹ค.

๋”ฐ๋ผ์„œ Private Subnet์€ SG๋งŒ์œผ๋กœ๋Š” ๋ง‰์„ ์ˆ˜ ์—†๋Š” ์‹ค์ˆ˜๋‚˜ ์„ค์ • ์˜ค๋ฅ˜๊นŒ์ง€ ๋Œ€๋น„ํ•œ ์ด์ค‘ ๋ฐฉ์–ด๋กœ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ™‹ ์„œ๋ฒ„๋ฅผ private subnet ์— ๋‘”๋‹ค๋ฉด ์„œ๋ฒ„ API ๋กœ์˜ ์ ‘๊ทผ์€ ์–ด๋–ป๊ฒŒ ํ•˜๋Š”๊ฑฐ์ง€?
์ด๋ฅผ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๋กœ๋“œ ๋ฐธ๋Ÿฐ์„œ ์—ญํ• ์„ ํ•˜๋Š” Nginx ๋ฅผ public subnet ์— ๋‘์—ˆ๋‹ค.

์ฆ‰, Public Subnet ์— ํ•ด๋‹นํ•˜๋ฉฐ LB ์—ญํ• ์„ ํ•˜๋Š” Nginx ์„œ๋ฒ„๊ฐ€ ์š”์ฒญ์„ ๋ฐ›์•„ VPC ๋‚ด๋ถ€์˜ Private Subnet ์ธ dev ์„œ๋ฒ„์—๊ฒŒ ์š”์ฒญ์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

5๏ธโƒฃ Nginx

1. proxy pass

 

์œ„์™€ ๊ฐ™์ด nginx ์˜ proxy_pass ๊ด€๋ จ ์„ค์ •์„ ํ•ด์ฃผ์—ˆ๋‹ค.
์ด๋ ‡๊ฒŒ ๋˜๋ฉด, Nginx ๋Š” ๋‚ด๊ฐ€ ์ „๋‹ฌ์„ ์›ํ•˜๋Š” VPC ๋‚ด๋ถ€์— ์žˆ๋Š” prod ์„œ๋ฒ„์—๊ฒŒ๋กœ ์š”์ฒญ์„ ๋„˜๊ฒจ์ค€๋‹ค.

  • proxy_set_header Host $host; → ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ณด๋‚ธ Host ํ—ค๋” ์œ ์ง€.
  • proxy_set_header X-Real-IP $remote_addr; → ํด๋ผ์ด์–ธํŠธ์˜ ์‹ค์ œ IP ์ „๋‹ฌ.
  • proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; → ํ”„๋ก์‹œ ์ฒด์ธ์„ ๋”ฐ๋ผ ํด๋ผ์ด์–ธํŠธ IP ๋ฆฌ์ŠคํŠธ ์ „๋‹ฌ.
  • proxy_set_header X-Forwarded-Proto $scheme; → ์›๋ž˜ ์š”์ฒญ ํ”„๋กœํ† ์ฝœ(HTTP/HTTPS) ์ „๋‹ฌ.
  • proxy_set_header X-Forwarded-Host $server_name; → ์š”์ฒญ์ด ๋“ค์–ด์˜จ Host ์ •๋ณด ์ „๋‹ฌ.

๊ธฐ์กด์˜ ์š”์ฒญ์„ ์ตœ๋Œ€ํ•œ ์œ ์ง€ํ•˜๋ฉฐ proxy pass ๊ฐ€ ์ด๋ค„์ง€๋„๋ก ํ–ˆ๋‹ค.

 

2. ๊ณผ๋„ํ•œ ์š”์ฒญ ์‹œ ํŠน์ • IP ์ฐจ๋‹จ

 

limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=20r/s;

 

์ด๋Š” 1์ดˆ๋‹น 20๋ฒˆ์˜ ์š”์ฒญ๊นŒ์ง€๋Š” ํ—ˆ์šฉํ•˜๋Š” ์„ค์ •์ด๋‹ค. $binary_remote_addr ๋Š” ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ip ์— ํ•ด๋‹นํ•œ๋‹ค.

 

limit_req zone=req_limit_per_ip burst=10 nodelay;

 

์ˆœ๊ฐ„์ ์œผ๋กœ ์š”์ฒญ์ด ๋” ๋ชฐ๋ฆด ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์—, ๋ชฐ๋ฆฌ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ 10๋ฒˆ๊นŒ์ง€ ์ถ”๊ฐ€์ ์œผ๋กœ ์š”์ฒญ์„ ํ—ˆ์šฉํ•œ๋‹ค. ์ฆ‰, 1์ดˆ์— ๋Œ€ํ•˜์—ฌ  ์ตœ๋Œ€ 30๋ฒˆ๊นŒ์ง€ ์š”์ฒญ์„ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

 

 

์œ„ ์„ค์ •์ด ์ž˜ ์ ์šฉ๋๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด์„œ ์œ„์™€ ๊ฐ™์ด ์‹ค์ œ๋กœ ์š”์ฒญ์„ ์ด๋ณด์•˜๋‹ค. ์ด๋Š” 31๊ฐœ์˜ ์š”์ฒญ์„ ์ดˆ๋งˆ๋‹ค ์˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ฐ„๊ฐ„ํžˆ 503 ์ด ์ƒํƒœ ์ฝ”๋“œ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.


์ด์ œ ์šฐ๋ฆฌ ์„œ๋ฒ„๋Š” 

 

1. ์™ธ๋ถ€์—์„œ ํ•จ๋ถ€๋กœ ์ ‘๊ทผํ•  ์ˆ˜ ์—†๊ณ 

2. ์™ธ๋ถ€์—์„œ๋Š” ํผ๋ธ”๋ฆญ IP ๊ฐ€ ์—†์œผ๋‹ˆ ์ธํ„ฐ๋„ท์œผ๋กœ ์ ‘์†์„ ํ•  ์ˆ˜๊ฐ€ ์—†์œผ๋ฉฐ

3. ์ผ์ • ๊ฐœ์ˆ˜ ์ด์ƒ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด 503 ์ด ํ•ด๋‹น IP ์— ๋Œ€ํ•ด ๋œจ๊ฒŒ ๋˜๊ณ  

4. ์—ฐ๊ฒฐ ์‹œ์— pem ํ‚ค๊นŒ์ง€ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๋Š” ์•ˆ์ „ํ•œ ์„œ๋ฒ„๊ฐ€ ๋˜์—ˆ๋‹ค!

 

์ด๋ฒˆ ๊ณผ์ •์—์„œ ๋ณด์•ˆ๊ณผ ํ•จ๊ป˜ ์„œ๋ฒ„๋ฅผ ๊ณ ๋ คํ•ด๋ณด๋ฉฐ ์ฒ˜์Œ์œผ๋กœ ๊ฐœ๋ฐœ์ž๋ž€ ์ด๋Ÿฐ ๊ฒƒ๋“ค์„ ๊ณ ๋ คํ•˜๊ณ  ๋‹ค๋ค„์•ผ ํ•˜๋Š” ์ง์—…์ด๊ตฌ๋‚˜, ํ˜น์‹œ ๋ชจ๋ฅผ ์ƒํ™ฉ์„ ๋Œ€๋น„ํ•œ๋‹ค๋Š” ๊ฑด ์ด๋Ÿฐ ๊ฑฐ๊ตฌ๋‚˜ ํ•˜๋Š” ๊นจ๋‹ฌ์Œ์„ ์–ป์„ ์ˆ˜ ์žˆ์—ˆ๋‹ค.