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

DevOps

[AWS] API Gateway

๐Ÿ“Œ API Gateway 

API gateway๋Š” api ๊ฐ€ ์ง€๋‚˜๋‹ค๋‹ˆ๋Š” ํ†ต๋กœ๋‹ค.  ์ด๊ฒŒ ์™œ ํ•„์š”ํ• ๊นŒ? 

์˜ค๋Š˜์€  API gateway ๊ฐ€ ์™œ ํ•„์š”ํ•œ์ง€์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€ํ•ด๋ณด์•˜๋‹ค.

 

 

๐Ÿ“ AWS API Gateway ๋ž€ ?

API Gateway ๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ API ๋ฅผ ์†์‰ฝ๊ฒŒ ์ƒ์„ฑ, ๊ฒŒ์‹œ, ์œ ์ง€ ๊ด€๋ฆฌ, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ณด์•ˆ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์„œ๋น„์Šค๋‹ค. 

AWS์—์„œ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, EventBridge, Lambda์™€ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. 

 

 

< ์ƒ์ƒํ•ด๋ณด๊ธฐ >

MSA ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌํ˜„๋œ ๋กœํŠผ ํ† ๋งˆํ†  ๋„๋ฉ”์ธ๋“ค

 

๋‚˜๋Š” API Gateway๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋กœํŠผ ํ† ๋งˆํ† (๋ฏธ๊ตญ ์˜ํ™” ํ‰์  ์‚ฌ์ดํŠธ)๊ฐ€ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ ๊ตฌํ˜„๋˜์–ด์žˆ๋‹ค๊ณ  ์ƒ์ƒํ–ˆ๋‹ค.

 

 

 

 

์—ฌ๋Ÿฌ ๊ฐœ๋กœ ํฉ์–ด์ ธ ์žˆ๋Š” ์„œ๋น„์Šค ๊ฐ€์šด๋ฐ service 2(ํ† ๋งˆํ† TV ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ) ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ service 1 (ํ† ๋งˆํ†  ๋ฎค๋น„ ์„œ๋น„์Šค์˜ ๋„๋ฉ”์ธ)๋กœ ์˜ฎ๊ฒจ์•ผ ํ•˜๋Š” ์ƒํ™ฉ์ด๋‹ค. service 2์˜ ํŠน์ • api๋ฅผ call ํ•˜๋Š” ๋ชจ๋“  URL์„ ๋‹ค ๋ฐ”๊ฟ”์ฃผ์–ด์•ผํ•œ๋‹ค. ๋„๋ฉ”์ธ์ด ๋ณ€๊ฒฝ๋˜์—ˆ์œผ๋‹ˆ๊นŒ ๋‹น์—ฐํ•œ ์–˜๊ธด๋ฐ ์ด๊ฑด ์ข€ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. 

 

 

 

 

์ด ๋•Œ, ๋ฟ”๋ฟ”ํžˆ ํฉ์–ด์ ธ์žˆ๋Š” MSA ์„œ๋น„์Šค๋“ค์„ API Gateway๋กœ ํ•œ ๊ตฐ๋ฐ๋กœ ๋ชจ์•„ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด? 

 

 

  • API ๊ฒŒ์ดํŠธ ์›จ์ด๋„ ํ•˜๋‚˜์˜ ์„œ๋ฒ„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋ฆ„์˜ ๋„๋ฉ”์ธ์ด ์žˆ๋‹ค. 

์ค‘๊ฐ„์— API Gateway ์„œ๋ฒ„๋กœ ๋ชจ์•˜๋‹ค๊ฐ€ ๋‹ค์‹œ ๋ชฉ์ ์ง€๋กœ ๋ป—์–ด๋‚˜๊ฐ€๋Š” ๊ตฌ์กฐ๋‹ค. ๋‚˜๋Š” ์Šคํ”„๋ง์—์„œ ํ”„๋ก ํŠธ ์ปจํŠธ๋กค๋Ÿฌ ์—ญํ• ์„ ํ•˜๋Š” ์„œ๋ธ”๋ฆฟ ๋””์ŠคํŒจ์ฒ˜๊ฐ€ ๋– ์˜ฌ๋ž๋‹ค. '์ˆ˜๋ฌธ' ์—ญํ• ์„ ํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์ ์ด ๊ณตํ†ต์ ์ด๊ธดํ•˜๋‹ค. redirecting๊ณผ ๋น„์Šทํ•œ ์›๋ฆฌ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์–ด์จŒ๋“  MSA ์•„ํ‚คํ…์ฒ˜๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์šด์šฉํ•˜๊ณ  ์žˆ๋‹ค๋ฉด ํŠน์ • URI๋ฅผ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•  ๋•Œ gateway๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์–ด๋–จ๊นŒ.

ํ•˜๋‚˜์˜ ์„œ๋น„์Šค๊ฐ€ ๋‹ค๋ฅธ ์„œ๋น„์Šค๋กœ ์ด๊ด€ํ•˜๋Š” ๋ฌธ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ ์ƒ๊ฐํ•ด๋ณด๋ฉด, ์•ž๋‹จ์—์„œ callํ•˜๋Š” ์ชฝ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ์ค‘๊ฐ„์— ์œ„์น˜ํ•œ API Gateway ๋งŒ ๋ณ€๊ฒฝํ•ด์ฃผ๋ฉด๋œ๋‹ค. 

 

API ๊ฒŒ์ดํŠธ ์›จ์ด ์„œ๋น„์Šค๊ฐ€ MSA ์— ์ ํ•ฉํ•˜๋‹ค๋Š” ์ด์œ ๊ฐ€ ์—ฌ๊ธฐ์— ์žˆ๋‹ค. MicroService์ฒ˜๋Ÿผ ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋น„์Šค๋กœ ํฉ์–ด์ ธ์žˆ๋Š” RestAPI๋ฅผ ๋ฐ˜๋“œ์‹œ ํ•˜๋‚˜์˜ gateway๋กœ ํ†ต๊ณผ์‹œํ‚ค๋ฉด์„œ ๊ด€๋ฆฌ๋ฅผ ํŽธํ•˜๊ฒŒ ํ•ด์ฃผ๊ณ  ๊ทธ ์™ธ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๊ฐ€ ์„œ๋น„์Šค๋ฅผ ์ฐฝ์ถœํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค. ๋™์ผํ•œ ๊ธฐ๋Šฅ์„ A ๋„๋ฉ”์ธ์—์„œ๋Š” node ๋กœ, B ๋„๋ฉ”์ธ์—์„œ๋Š” ์ž๋ฐ” ์Šคํ”„๋ง์œผ๋กœ ๊ตฌํ˜„ํ•  ๋•Œ ํ•œ ๊ณณ์—๋งŒ ๊ทธ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ•˜๊ณ  API Gateway๋กœ ๋„˜๋‚˜๋“œ๋Š” ๊ฑฐ๋‹ค. ๊ทผ๋ฐ ๋‹จ์ ๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•จ์œผ๋กœ์จ ์ž๊ธฐ ์ž์‹  ์•ˆ์— ์žˆ๋Š” api ๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๊ณ  ํ•  ๋•Œ์˜ ๋ฒˆ๊ฑฐ๋กญ๋‹ค. ๊ตณ์ด ๋‚ด ๋„๋ฉ”์ธ ์•ˆ์— ์žˆ๋Š” ๋กœ์ง์„ ํ˜ธ์ถœํ•˜๋Š”๋ฐ api gateway๋ฅผ ๊ฑฐ์น˜๋Š” ๊ฒŒ ์œตํ†ต์„ฑ์ด ์—†๋‹ค. 

 

๋ณธ์งˆ์ ์œผ๋กœ๋Š” ๊ฐ„๋‹จํ•˜์ง€๋งŒ ๋ชจ๋“  API๋ฅผ ํ•˜๋‚˜์˜ API ๋„๋ฉ”์ธ ์•ˆ์—์„œ ๊ด€๋ฆฌํ•ด์ค€๋‹ค ๋ผ๋Š” ํŠน์„ฑ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์— ๋ถ™์ผ ์ˆ˜ ์žˆ๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด ๋งŽ๋‹ค. ์—ฌ๊ธฐ์„œ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€๋ฆฌ๋Š” ๋กœ๊น…, ์—‘์„ธ์Šค ์ œ์–ด(๋ณด์•ˆ), ๋ชจ๋‹ˆํ„ฐ๋ง์ด๋‹ค.

 

 

๐Ÿ“ AWS API Gateway ์ข…๋ฅ˜

  • AWS API Gateway๋Š” 3๊ฐ€์ง€ ์ œํ’ˆ์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • HTTP API, Rest API, Websocket API 
  • API ์— ์ผ๊ด„์ ์œผ๋กœ ์ธ์ฆ์„ ๋ถ™ํž ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ๊ถŒํ•œ ๋ถ€์—ฌ ๊ฐ€๋Šฅํ•˜๋‹ค...!
    • ์–ด๋–ค ๋„๋ฉ”์ธ์—์„œ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์˜ ํŠน์ • API๋ฅผ ์š”์ฒญ ํ•  ๋•Œ, ์š”์ฒญ์„ ํ•˜๊ธฐ ์ „ options๋ผ๋Š” api๋ฅผ ๋จผ์ € ๋ณด๋ƒ„. 
    • ๋‚ด๊ฐ€ ์ง€๊ธˆ ์š”์ฒญ์„ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ํ—ˆ๋ฝ์„ ๊ตฌํ•˜๋Š” api 
    • ์ด๊ฒŒ ์–ด๋””์— ์“ฐ์ด๋ƒ. ๋ฐ”๋กœ CORS(Cross-Origin Resource Sharing)

 

๐Ÿ“ CORS์™€ AWS API Gateway 

  • Cross-Origin Resource Sharing : "๋„๋ฉ”์ธ์„ ๋„˜๋‚˜๋“ค๋ฉด์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ณต์œ ํ•œ๋‹ค"

Cross-Origin HTTP request 

  • Origin์ด ๋‹ค๋ฅธ API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ , 'tomatoMovie.com' ์„œ๋ฒ„ ์•ˆ์—์„œ 'tomatoTV.com' ์•ˆ์— ์žˆ๋Š” Rest API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ
  • ๋ณด์•ˆ ์ƒ์— ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋Š” API ํ˜ธ์ถœ (๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค) 
1. ๋‹ค๋ฅธ ๋„๋ฉ”์ธ ( 'tomato.com', 'tomatoMovie.com')
2. ๋‹ค๋ฅธ ํฌํŠธ ('tomatoMovie.com', 'tomatoMovie.com/5000')
3. ๋‹ค๋ฅธ ํ”„๋กœํ† ์ฝœ (https, http)

 

 

CORS ( Cross-Origin Resource Sharing)

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

CORS ํ™œ์„ฑํ™”์™€ OPTIONS ์‘๋‹ต

  • OPTIONS ๋ฉ”์„œ๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ์ˆ˜๋™์œผ๋กœ ๋งŒ๋“  ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, CORS ํ™œ์„ฑํ™”๋ฅผ ํ†ตํ•ด ์ž๋™์œผ๋กœ ๋งŒ๋“ค์–ด์ง„ ๊ฒƒ.
  • ์ด๊ฒŒ ์™œ ๋งŒ๋“ค์–ด์ง€๋ƒ.
  • API ๋ฐฉ์‹์œผ๋กœ get, post, put .. ์ค‘์— ๋ญ๋“ ์ง€, ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „์— API ๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์ฃผ์ฒด์˜ ๋„๋ฉ”์ธ์ด ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ ๋„๋ฉ”์ธ์ธ๊ฐ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด OPTIONS๊ฐ€ ์ƒ์„ฑ๋˜์—ˆ๋‹ค. 
  • ๊ทธ๋ž˜์„œ ๋ณธ๋ž˜ ํ˜ธ์ถœํ•œ API๋ณด๋‹ค ๋จผ์ € ํ˜ธ์ถœ๋œ๋‹ค.