API Gateway

REST ๋ฐ WebSocket API๋ฅผ ์ƒ์„ฑ, ๊ฒŒ์‹œ, ์œ ์ง€, ๋ชจ๋‹ˆํ„ฐ๋ง ๋ฐ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•œ AWS ์„œ๋น„์ŠคAPI ๊ฐœ๋ฐœ์ž๋Š” AWS ๋˜๋Š” ๋‹ค๋ฅธ ์›น ์„œ๋น„์Šค๋ฅผ ๋น„๋กฏํ•ด AWS ํด๋ผ์šฐ๋“œ์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•˜๋Š” API๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

API Gateway Architecture

API Gateway ๊ธฐ๋Šฅ

Amazon API Gateway๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณต

  • ์ƒํƒœ ์ €์žฅ(WebSocket) ๋ฐ ์ƒํƒœ ๋น„์ €์žฅ(HTTP ๋ฐ REST) API์— ๋Œ€ํ•œ ์ง€์›

  • ๊ฐ•๋ ฅํ•˜๊ณ  ์œ ์—ฐํ•œ ์ธ์ฆ ๋ฉ”์ปค๋‹ˆ์ฆ˜(์˜ˆ: AWS Identity and Access Management ์ •์ฑ…, Lambda ๊ถŒํ•œ ๋ถ€์—ฌ์ž ํ•จ์ˆ˜, Amazon Cognito ์‚ฌ์šฉ์ž ํ’€ ๋“ฑ)

  • API๋ฅผ ๊ฒŒ์‹œํ•˜๊ธฐ ์œ„ํ•œ ๊ฐœ๋ฐœ์ž ํฌํ„ธ

  • ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์•ˆ์ „ํ•˜๊ฒŒ ๋กค์•„์›ƒํ•˜๊ธฐ ์œ„ํ•œ Canary ๋ฆด๋ฆฌ์Šค ๋ฐฐํฌ

  • API ์‚ฌ์šฉ ๋ฐ API ๋ณ€๊ฒฝ์— ๋Œ€ํ•œ CloudTrail ๋กœ๊น… ๋ฐ ๋ชจ๋‹ˆํ„ฐ๋ง

  • ๊ฒฝ๋ณด ์„ค์ • ๊ธฐ๋Šฅ์„ ํฌํ•จํ•œ CloudWatch ์•ก์„ธ์Šค ๋กœ๊น… ๋ฐ ์‹คํ–‰ ๋กœ๊น…

  • AWS CloudFormation ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ API ์ƒ์„ฑ์„ ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ

  • ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„ ์ง€์›

  • ์ผ๋ฐ˜์ ์ธ ์›น ์ต์Šคํ”Œ๋กœ์ž‡์œผ๋กœ๋ถ€ํ„ฐ API๋ฅผ ๋ณดํ˜ธํ•˜๊ธฐ ์œ„ํ•ด AWS WAF์™€ ํ†ตํ•ฉ

  • ์„ฑ๋Šฅ ์ง€์—ฐ ์‹œ๊ฐ„ ํŒŒ์•… ๋ฐ ํ•™์Šต์„ ์œ„ํ•ด AWS X-Ray์™€ ํ†ตํ•ฉ

์„œ๋ฒ„๋ฆฌ์Šค ์•„ํ‚คํ…์ฒ˜์˜ ์ผ๋ถ€๋กœ ๊ตฌ์„ฑ

API Gateway๋Š” AWS Lambda ๋ฐ HTTP ์—”๋“œํฌ์ธํŠธ์™€ ๊ฐ„์†Œํ•œ ํ”„๋ก์‹œ ํ†ตํ•ฉ์„ ์ง€์›ํ•˜๊ธฐ ๋–„๋ฌธ์— AWS ์„œ๋ฒ„๋ฆฌ์Šค ์ธํ”„๋ผ์˜ ์•ฑ ํŽ˜์ด์‹ฑ(app-facing) ๋ถ€๋ถ„์„ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ

์‚ฌ์šฉ ๋Œ€์ƒ

API Gateway๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Œ

  1. API ๊ฐœ๋ฐœ์ž API๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋ฐฐํฌํ•˜์—ฌ API Gateway์—์„œ ํ•„์š”ํ•œ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ API ๊ฐœ๋ฐœ์ž๋Š” AWS ๊ณ„์ • ๋‚ด์—์„œ API๋ฅผ ์†Œ์œ ํ•œ IAM ์‚ฌ์šฉ์ž์—ฌ์•ผ ํ•จ

  2. ์•ฑ ๊ฐœ๋ฐœ์ž API Gateway์—์„œ API ๊ฐœ๋ฐœ์ž๊ฐ€ ์ƒ์„ฑํ•œ WebSocket ๋˜๋Š” REST API๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ AWS ์„œ๋น„์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ์— ํšจ๊ณผ์ ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•

์•ฑ ๊ฐœ๋ฐœ์ž๋Š” API ๊ฐœ๋ฐœ์ž์˜ ๊ณ ๊ฐ์ด๊ธฐ์—, API์— IAM ๊ถŒํ•œ์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Amazon Cognito ์‚ฌ์šฉ์ž ํ’€ ์ž๊ฒฉ ์ฆ๋ช… ์—ฐ๋™์—์„œ ์ง€์›ํ•˜๋Š” ํƒ€์‚ฌ ์—ฐ๋™ ์ž๊ฒฉ ์ฆ๋ช… ๊ณต๊ธ‰์ž๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ง€์›ํ•˜๋Š” ๊ฒฝ์šฐ, ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” AWS ๊ณ„์ •์„ ๋ณด์œ ํ•  ํ•„์š”๊ฐ€ ์—†์Œ

API Gateway ๊ฐœ๋…

  • API Gateway

    • ๋ฐฑ์—”๋“œ HTTP ์—”๋“œํฌ์ธํŠธ, AWS Lambda ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐํƒ€ AWS ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ RESTful ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค(API)์˜ ์ƒ์„ฑ, ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ

    • AWS Lambda ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐํƒ€ AWS ์„œ๋น„์Šค๋ฅผ ๋…ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ WebSocket์˜ ์ƒ์„ฑ, ๋ฐฐํฌ ๋ฐ ๊ด€๋ฆฌ

    • ํ”„๋ŸฐํŠธ ์—”๋“œ HTTP ๋ฐ WebSocket ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋œ API ๋ฉ”์„œ๋“œ ํ˜ธ์ถœ

  • API Gateway HTTP API ๋ฐฑ์—”๋“œ HTTP ์—”๋“œํฌ์ธํŠธ ๋˜๋Š” Lambda ํ•จ์ˆ˜์™€ ํ†ตํ•ฉ๋œ ๋ผ์šฐํŒ… ๋ฐ ๋ฉ”์„œ๋“œ์˜ ๋ชจ์Œ ์ด ๋ชจ์Œ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šคํ…Œ์ด์ง€๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ ๊ฐ ๋ผ์šฐํŒ…์€ API Gateway์—์„œ ์ง€์›๋˜๋Š” ๊ณ ์œ ์˜ HTTP ๋™์‚ฌ๋ฅผ ๊ฐ€์ง„ API ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ๋…ธ์ถœ๋จ

  • API Gateway REST API ๋ฐฑ์—”๋“œ HTTP ์—”๋“œํฌ์ธํŠธ, Lambda ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐํƒ€ AWS ์„œ๋น„์Šค์™€ ํ†ตํ•ฉ๋˜์–ด ์žˆ๋Š” HTTP ๋ฆฌ์†Œ์Šค์™€ ๋ฉ”์„œ๋“œ์˜ ๋ชจ์Œ ์ด ๋ชจ์Œ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šคํ…Œ์ด์ง€๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ ๊ฐ API ๋ฆฌ์†Œ์Šค๋Š” API Gateway์—์„œ ์ง€์›ํ•˜๋Š” ์ „์šฉ HTTP ๋™์‚ฌ๊ฐ€ ์žˆ๋Š” API ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜ ์ด์ƒ ํ‘œ์‹œ ๊ฐ€๋Šฅ

  • API Gateway WebSocket API ๋ฐฑ์—”๋“œ HTTP ์—”๋“œํฌ์ธํŠธ, Lambda ํ•จ์ˆ˜ ๋˜๋Š” ๊ธฐํƒ€ AWS ์„œ๋น„์Šค์™€ ํ†ตํ•ฉ๋˜์–ด ์žˆ๋Š” WebSocket ๋ผ์šฐํŒ…๊ณผ ๋ผ์šฐํŒ… ํ‚ค์˜ ๋ชจ์Œ ์ด ๋ชจ์Œ์„ ํ•˜๋‚˜ ์ด์ƒ์˜ ์Šคํ…Œ์ด์ง€๋กœ ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Œ API ๋ฉ”์„œ๋“œ๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ WebSocket ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ํ˜ธ์ถœ๋˜๋ฉฐ, ์ด ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋“ฑ๋ก๋œ ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„๊ณผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ

  • API ๋ฐฐํฌ API Gateway API์˜ ํŠน์ • ์‹œ์  ์Šค๋ƒ…์ƒท ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋ ค๋ฉด ๋ฐฐํฌ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ์˜ API ๋‹จ๊ณ„์™€ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์–ด์•ผ ํ•จ

  • API ๊ฐœ๋ฐœ์ž API Gateway ๋ฐฐํฌ๋ฅผ ์†Œ์œ ํ•œ AWS ๊ณ„์ •(์˜ˆ: ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์•ก์„ธ์Šค๋„ ์ง€์›ํ•˜๋Š” ์„œ๋น„์Šค ๊ณต๊ธ‰์ž)

  • API ์—”๋“œํฌ์ธํŠธ ํŠน์ • ๋ฆฌ์ „์— ๋ฐฐํฌ๋˜๋Š” API Gateway์˜ API ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์€ {api-id}.execute-api.{region}.amazonaws.com. ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜•์˜ API ๋์ ์ด ์ง€์›๋จ

    • ์—ฃ์ง€ ์ตœ์ ํ™” API ์—”๋“œํฌ์ธํŠธ

    • ํ”„๋ผ์ด๋น— API ์—”๋“œํฌ์ธํŠธ

    • ๋ฆฌ์ „ API ์—”๋“œํฌ์ธํŠธ

  • API ํ‚ค ์˜์ˆซ์ž ๋ฌธ์ž์—ด๋กœ API Gateway ์‚ฌ์šฉํ•˜์—ฌ ์•ฑ REST ๋˜๋Š” websocket API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž API Gateway ๋ฅผ ๋Œ€์‹ ํ•˜์—ฌ API ํ‚ค๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ CSV ํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Œ API ํ‚ค์™€ Lambda ๊ถŒํ•œ ๋ถ€์—ฌ์ž ๋˜๋Š” ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš์„ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์—ฌ API ์•ก์„ธ์Šค๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ

  • API ๋‹จ๊ณ„ API์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ƒํƒœ์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ์ฐธ์กฐ(์˜ˆ: 'dev', 'prod', 'beta', 'v2') API ๋‹จ๊ณ„๋Š” API ID์™€ ๋‹จ๊ณ„ ์ด๋ฆ„์œผ๋กœ ์‹๋ณ„๋จ

  • ์•ฑ ๊ฐœ๋ฐœ์ž API ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐฐํฌํ•œ API์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋ฉฐ AWS ๊ณ„์ •์ด ์žˆ๊ฑฐ๋‚˜ ์—†์„ ์ˆ˜๋„ ์žˆ๋Š” ์•ฑ ์ƒ์„ฑ์ž ์•ฑ ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ API ํ‚ค๋กœ ์‹๋ณ„๋˜๊ฒŒ ๋จ

  • ์ฝœ๋ฐฑ URL ์ƒˆ ํด๋ผ์ด์–ธํŠธ๊ฐ€ WebSocket ์—ฐ๊ฒฐ์„ ํ†ตํ•ด ์—ฐ๊ฒฐ๋˜๋ฉด API Gateway์—์„œ ํ†ตํ•ฉ์„ ํ˜ธ์ถœํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ์˜ ์ฝœ๋ฐฑ URL์„ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Œ ์ด ์ฝœ๋ฐฑ URL์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฑ์—”๋“œ ์‹œ์Šคํ…œ์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ

  • ๊ฐœ๋ฐœ์ž ํฌํ„ธ ๊ณ ๊ฐ์ด API ์ œํ’ˆ(API ๊ฒŒ์ดํŠธ์›จ์ด ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš)์„ ๋“ฑ๋ก, ๊ฒ€์ƒ‰ ๋ฐ ๊ตฌ๋…ํ•˜๊ณ , API ํ‚ค๋ฅผ ๊ด€๋ฆฌํ•˜๊ณ , API์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์ง€ํ‘œ๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

  • ์—ฃ์ง€ ์ตœ์ ํ™” API ์—”๋“œํฌ์ธํŠธ AWS ๋ฆฌ์ „์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์†์‰ฝ๊ฒŒ ํด๋ผ์ด์–ธํŠธ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก CloudFront ๋ฐฐํฌํŒ์„ ์‚ฌ์šฉํ•  ๋•Œ ์ง€์ •๋œ ๋ฆฌ์ „์— ๋ฐฐํฌ๋˜๋Š” API Gateway API์˜ ๊ธฐ๋ณธ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„ API ์š”์ฒญ์€ ์ง€๋ฆฌ์ ์œผ๋กœ ๋‹ค์–‘ํ•œ ํด๋ผ์ด์–ธํŠธ๋ฅผ ์œ„ํ•ด ์—ฐ๊ฒฐ ์‹œ๊ฐ„์„ ์ผ๋ฐ˜์ ์œผ๋กœ ํ–ฅ์ƒ์‹œํ‚ค๋Š” ๊ฐ€์žฅ ๊ฐ€๊นŒ์šด CloudFront ์ž…์ง€ ์ง€์ (POP)์œผ๋กœ ๋ผ์šฐํŒ…๋จ

  • ํ†ตํ•ฉ ์š”์ฒญ API Gateway์—์„œ WebSocket API ๋ผ์šฐํŒ… ๋˜๋Š” REST API ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์—ฌ๊ธฐ์—์„œ ๋ผ์šฐํŒ… ์š”์ฒญ์˜ ๋ณธ๋ฌธ ๋˜๋Š” ๋ฉ”์„œ๋“œ์˜ ๋ณธ๋ฌธ ๋ฐ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ์—์„œ ์š”๊ตฌํ•˜๋Š” ํ˜•์‹์œผ๋กœ ๋งคํ•‘ํ•จ

  • ํ†ตํ•ฉ ์‘๋‹ต API Gateway์—์„œ WebSocket API ๋ผ์šฐํŒ… ๋˜๋Š” REST API ๋ฉ”์„œ๋“œ์˜ ๋‚ด๋ถ€ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋ฐฑ์—”๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ ์•ฑ์œผ๋กœ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต ํ˜•์‹์œผ๋กœ ๋ฐ›์€ ์ƒํƒœ ์ฝ”๋“œ, ํ—ค๋”, ํŽ˜์ด๋กœ๋“œ๋ฅผ ์—ฌ๊ธฐ์—์„œ ๋งคํ•‘ํ•จ

  • ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ VTL(Velocity Template Language)์— ๋‚˜์˜จ ์Šคํฌ๋ฆฝํŠธ๋กœ, ํ”„๋ŸฐํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋œ ์š”์ฒญ ๋ณธ๋ฌธ์„ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•˜๊ฑฐ๋‚˜ ๋ฐฑ์—”๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋œ ์‘๋‹ต ๋ณธ๋ฌธ์„ ํ”„๋ŸฐํŠธ์—”๋“œ ๋ฐ์ดํ„ฐ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ ํ†ตํ•ฉ ์š”์ฒญ ๋˜๋Š” ํ†ตํ•ฉ ์‘๋‹ต์— ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ์ด ์ง€์ •๋  ์ˆ˜ ์žˆ์Œ ์ด๋“ค์€ ์‹คํ–‰ ์‹œ๊ฐ„์— ์ปจํ…์ŠคํŠธ ๋ฐ ์Šคํ…Œ์ด์ง€ ๋ณ€์ˆ˜๋กœ ์ œ๊ณต๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ์Œ ๋งคํ•‘์€ ์š”์ฒญ์— ๋Œ€ํ•ด ํด๋ผ์ด์–ธํŠธ์—์„œ ๋ฐฑ์—”๋“œ๋กœ ํ†ตํ•ฉ์„ ํ†ตํ•ด ํ—ค๋”๋‚˜ ๋ณธ๋ฌธ์„ ์ „๋‹ฌํ•˜๋Š” ์ž๊ฒฉ ์ฆ๋ช… ๋ณ€ํ™˜๋งŒํผ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Œ ๋ฐฑ์—”๋“œ์—์„œ ํด๋ผ์ด์–ธํŠธ๋กœ ํŽ˜์ด๋กœ๋“œ๊ฐ€ ์ „๋‹ฌ๋˜๋Š” ์‘๋‹ต์˜ ๊ฒฝ์šฐ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€

  • ๋ฉ”์„œ๋“œ ์š”์ฒญ API ๋ฐฉ๋ฒ•์˜ ๊ณต์šฉ ์ธํ„ฐํŽ˜์ด์Šค API Gateway ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ์— ์•ก์„ธ์Šคํ•˜๊ธฐ ์œ„ํ•ด ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋ฐ ๋ณธ์ฒด๋ฅผ ์ •์˜

  • ๋ฉ”์„œ๋“œ ์‘๋‹ต REST API์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ API์˜ ์‘๋‹ต์— ๊ธฐ๋Œ€ํ•˜๋Š” ๋ณธ๋ฌธ ๋ชจ๋ธ, ํ—ค๋”, ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์„œ ์ •์˜

  • ๋ชจ์˜ ํ†ตํ•ฉ ๋ชจ์˜ ํ†ตํ•ฉ์—์„œ๋Š” ํ†ตํ•ฉ ๋ฐฑ์—”๋“œ๊ฐ€ ์—†์–ด๋„ API Gateway์—์„œ ์ง์ ‘ API ์‘๋‹ต์ด ์ƒ์„ฑ๋จ API ๊ฐœ๋ฐœ์ž๋Š” API Gateway๊ฐ€ ๋ชจ์˜ ํ†ตํ•ฉ ์š”์ฒญ์— ์‘๋‹ตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๊ฒฐ์ •๋˜๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด, ๋ฉ”์„œ๋“œ์˜ ํ†ตํ•ฉ ์š”์ฒญ ๋ฐ ํ†ตํ•ฉ ์‘๋‹ต์„ ๊ตฌ์„ฑํ•˜์—ฌ ์ •ํ•ด์ง„ ์ƒํƒœ ์ฝ”๋“œ์™€ ์‘๋‹ต์„ ์—ฐ๊ฒฐํ•จ

  • ๋ชจ๋ธ ์š”์ฒญ ๋˜๋Š” ์‘๋‹ต ํŽ˜์ด๋กœ๋“œ์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์Šคํ‚ค๋งˆ ๋ชจ๋ธ์€ API์—์„œ ๊ฐ•๋ ฅํ•œ ํ˜•์‹์˜ SDK๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ํ•„์š”ํ•˜๋ฉฐ, ํŽ˜์ด๋กœ๋“œ๋ฅผ ํ™•์ธํ•˜๋Š” ๋ฐ์—๋„ ์‚ฌ์šฉ๋จ ๋ชจ๋ธ์€ ์ƒ˜ํ”Œ ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•ด ํ”„๋กœ๋•์…˜ ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ ์ƒ์„ฑ์„ ์‹œ์ž‘ํ•˜๊ธฐ์— ํŽธ๋ฆฌํ•œ ๋„๊ตฌ๋กœ, ์žˆ์œผ๋ฉด ์œ ์šฉํ•˜๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ์„ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋ธ์€ ํ•„์š”ํ•˜์ง€ ์•Š์Œ

  • ํ”„๋ผ์ด๋น— API ์—”๋“œํฌ์ธํŠธ ์ธํ„ฐํŽ˜์ด์Šค VPC ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๋…ธ์ถœ๋˜๊ณ  ํด๋ผ์ด์–ธํŠธ๊ฐ€ VPC ๋‚ด๋ถ€์˜ ํ”„๋ผ์ด๋น— API ๋ฆฌ์†Œ์Šค์— ์•ˆ์ „ํ•˜๊ฒŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” API ์—”๋“œํฌ์ธํŠธ ํ”„๋ผ์ด๋น— API๋Š” ํผ๋ธ”๋ฆญ ์ธํ„ฐ๋„ท๊ณผ ๊ฒฉ๋ฆฌ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์•ก์„ธ์Šค ๊ถŒํ•œ์ด ์žˆ๋Š” API Gateway์˜ VPC ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Œ

  • ํ”„๋ผ์ด๋น— ํ†ตํ•ฉ ๋ฆฌ์†Œ์Šค๋ฅผ ํผ๋ธ”๋ฆญ ์ธํ„ฐ๋„ท์— ๋…ธ์ถœํ•˜์ง€ ์•Š๊ณ , ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ”„๋ผ์ด๋น— REST API ์—”๋“œํฌ์ธํŠธ๋ฅผ ํ†ตํ•ด ๊ณ ๊ฐ VPC ๋‚ด๋ถ€์˜ ๋ฆฌ์†Œ์Šค์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” API Gateway ํ†ตํ•ฉ ์œ ํ˜•์ž„

  • ํ”„๋ก์‹œ ํ†ตํ•ฉ ๊ฐ„์†Œํ™”๋œ API Gateway ํ†ตํ•ฉ ๊ตฌ์„ฑ. HTTP ํ”„๋ก์‹œ ํ†ตํ•ฉ ๋˜๋Š” Lambda ํ”„๋ก์‹œ ํ†ตํ•ฉ์œผ๋กœ ํ”„๋ก์‹œ ํ†ตํ•ฉ์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ HTTP ํ”„๋ก์‹œ ํ†ตํ•ฉ์—์„œ API Gateway๋Š” ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ HTTP ๋ฐฑ์—”๋“œ ๊ฐ„์— ์ „์ฒด ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ „๋‹ฌํ•จ Lambda ํ”„๋ก์‹œ ํ†ตํ•ฉ์—์„œ API Gateway๋Š” ์ „์ฒด ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ Lambda ํ•จ์ˆ˜์˜ ์ž…๋ ฅ๊ฐ’์œผ๋กœ ์ „์†กํ•จ ๊ทธ๋Ÿฐ ๋‹ค์Œ API Gateway๋Š” Lambda ํ•จ์ˆ˜ ์ถœ๋ ฅ์„ ํ”„๋ŸฐํŠธ ์—”๋“œ HTTP ์‘๋‹ต์œผ๋กœ ๋ณ€ํ™˜ํ•จ REST API์—์„œ ํ”„๋ก์‹œ ํ†ตํ•ฉ์€ ํ”„๋ก์‹œ ๋ฆฌ์†Œ์Šค์—์„œ ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉ๋˜๋ฉฐ, ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜(์˜ˆ: {proxy+})์™€ catch-all ANY ๋ฉ”์„œ๋“œ๋กœ ํ‘œ์‹œ๋จ

  • ๋น ๋ฅธ ์ƒ์„ฑ ๋น ๋ฅธ ์ƒ์„ฑ์„ ์‚ฌ์šฉํ•˜์—ฌ HTTP API ์ƒ์„ฑ์„ ๊ฐ„์†Œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น ๋ฅธ ์ƒ์„ฑ์€ Lambda ๋Š” HTTP ํ†ตํ•ฉ, ๊ธฐ๋ณธ catch-all ๋ผ์šฐํŒ…, ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ž๋™ ๋ฐฐํฌํ•˜๋„๋ก ๊ตฌ์„ฑ๋œ ๊ธฐ๋ณธ ์Šคํ…Œ์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ API๋ฅผ ์ƒ์„ฑ

  • ๋ฆฌ์ „ API ์—”๋“œํฌ์ธํŠธ ํŠน์ • ๋ฆฌ์ „์— ๋ฐฐํฌ๋˜๊ณ  ๋™์ผํ•œ AWS ๋ฆฌ์ „์—์„œ EC2 ์ธ์Šคํ„ด์Šค์™€ ๊ฐ™์€ ํด๋ผ์ด์–ธํŠธ์— ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” API์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์œผ๋กœ, API ์š”์ฒญ์€ CloudFront ๋ฐฐํฌํŒ์„ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  ๋ฆฌ์ „๋ณ„ API Gateway๋กœ ์ง์ ‘ ์ง€์ •๋จ ๋ฆฌ์ „ ๋‚ด ์š”์ฒญ์˜ ๊ฒฝ์šฐ ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ๋Š” CloudFront ๋ฐฐํฌํŒ์— ๋Œ€ํ•œ ๋ถˆํ•„์š”ํ•œ ์™•๋ณต์„ ์šฐํšŒํ•จ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ, ๋ฆฌ์ „ ์—”๋“œํฌ์ธํŠธ์— ์ง€์—ฐ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ ๋ผ์šฐํŒ…์„ ์ ์šฉํ•˜์—ฌ ๋™์ผํ•œ ๋ฆฌ์ „ API ์—”๋“œํฌ์ธํŠธ ๊ตฌ์„ฑ์„ ์‚ฌ์šฉํ•ด ์—ฌ๋Ÿฌ ๋ฆฌ์ „์— API๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๋ฐฐํฌ๋œ ๊ฐ API์— ๋™์ผํ•œ ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์„ค์ •ํ•˜๊ณ , ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ง€์—ฐ ์‹œ๊ฐ„์ด ๊ฐ€์žฅ ์งง์€ ๋ฆฌ์ „์— ๋ผ์šฐํŒ…ํ•˜๋„๋ก Route 53์—์„œ ์ง€์—ฐ ์‹œ๊ฐ„ ๊ธฐ๋ฐ˜ DNS ๋ ˆ์ฝ”๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜๋„ ์žˆ์Œ

  • ๋ผ์šฐํŒ… API Gateway์—์„œ WebSocket ๋ผ์šฐํŒ…์€ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€๋ฅผ ๋ฉ”์‹œ์ง€ ๋‚ด์šฉ์— ๋”ฐ๋ผ AWS Lambda ํ•จ์ˆ˜ ๊ฐ™์€ ํŠน์ • ํ†ตํ•ฉ์œผ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋จ WebSocket API๋ฅผ ์ •์˜ํ•  ๋•Œ ๋ผ์šฐํŒ… ํ‚ค์™€ ํ†ตํ•ฉ ๋ฐฑ์—”๋“œ๋ฅผ ์ง€์ •ํ•˜๋ฉฐ, ๋ผ์šฐํŒ… ํ‚ค๋Š” ๋ฉ”์‹œ์ง€ ๋ณธ๋ฌธ์˜ ์†์„ฑ์ž„ ์ˆ˜์‹  ๋ฉ”์‹œ์ง€์—์„œ ๋ผ์šฐํŒ… ํ‚ค๊ฐ€ ์ผ์น˜ํ•˜๋ฉด ํ†ตํ•ฉ ๋ฐฑ์—”๋“œ๊ฐ€ ํ˜ธ์ถœ๋จ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ผ์šฐํŒ… ํ‚ค์— ๋Œ€ํ•ด ๊ธฐ๋ณธ ๋ผ์šฐํŒ…์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜, ๋ผ์šฐํŒ…์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฑ์—”๋“œ ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ์ „๋‹ฌํ•˜๋Š” ํ”„๋ก์‹œ ๋ชจ๋ธ์„ ์ง€์ •ํ•  ์ˆ˜๋„ ์žˆ์Œ

  • ๋ผ์šฐํŒ… ์š”์ฒญ API Gateway์— ์žˆ๋Š” WebSocket API ๋ฉ”์„œ๋“œ์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ๋ณธ๋ฌธ์„ ์ •์˜ ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ํ†ตํ•ด ๋ฐฑ์—”๋“œ์— ์•ก์„ธ์Šคํ•˜๋ ค๋ฉด ๋ฐ˜๋“œ์‹œ ์ด ํŒŒ๋ผ๋ฏธํ„ฐ์™€ ๋ณธ๋ฌธ์„ ์š”์ฒญ์— ํฌํ•จ์‹œ์ผœ ๋ณด๋‚ด์•ผ ํ•จ

  • ๋ผ์šฐํŒ… ์‘๋‹ต WebSocket API์˜ ํผ๋ธ”๋ฆญ ์ธํ„ฐํŽ˜์ด์Šค๋กœ, ์•ฑ ๊ฐœ๋ฐœ์ž๊ฐ€ API Gateway์— ๊ธฐ๋Œ€ํ•˜๋Š” ๋ณธ๋ฌธ ๋ชจ๋ธ, ํ—ค๋”, ์ƒํƒœ ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์„œ ์ •์˜ํ•˜๊ฒŒ ๋จ

  • ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš์€ ์„ ํƒํ•œ API ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ฐฐํฌ๋œ REST ๋˜๋Š” WebSocket API์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ œ๊ณตํ•˜๊ณ , ์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš์„ ์‚ฌ์šฉํ•ด ์กฐ์ ˆ ๋ฐ ํ• ๋‹น๋Ÿ‰ ์ œํ•œ์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ๊ฐœ๋ณ„ ํด๋ผ์ด์–ธํŠธ API ํ‚ค์— ์ ์šฉ๋จ

  • WebSocket ์—ฐ๊ฒฐ API Gateway๋Š” ํด๋ผ์ด์–ธํŠธ์™€ API Gateway ์ž์ฒด ์‚ฌ์ด์— ์˜๊ตฌ์ ์ธ ์—ฐ๊ฒฐ์„ ์œ ์ง€ API Gateway๊ณผ Lambda ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ ๊ฐ„์—๋Š” ์ง€์†์ ์ธ ์—ฐ๊ฒฐ์ด ์—†์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ ์„œ๋น„์Šค๋Š” ํด๋ผ์ด์–ธํŠธ์—์„œ ์ˆ˜์‹ ํ•œ ๋ฉ”์‹œ์ง€์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ํ•„์š” ์‹œ ํ˜ธ์ถœ๋จ

API Gateway ์ข…๋ฅ˜

  1. HTTP API REST API๋ณด๋‹ค ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง๊ณ  ๋น„์šฉ์ด ์ €๋ ดํ•˜๊ฒŒ RESTful API๋ฅผ ๊ตฌ์„ฑ ๊ฐ€๋Šฅ AWS Lambda ํ•จ์ˆ˜ ๋˜๋Š” ๊ณต๊ฐœ ๋ผ์šฐํŒ…์ด ๊ฐ€๋Šฅํ•œ HTTP ์—”๋“œํฌ์ธํŠธ์— ์š”์ฒญ์„ ์ „์†กํ•  ์ˆ˜ ์žˆ์Œ HTTP API๋Š” OpenID Connect ๋ฐ OAuth 2.0 ๊ถŒํ•œ ๋ถ€์—ฌ๋ฅผ ์ง€์› ๋˜ํ•œ CORS(Cross-Origin Resource Sharing) ๋ฐ ์ž๋™ ๋ฐฐํฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋จ

  2. REST API API Gateway REST API๋Š” ๋ฆฌ์†Œ์Šค์™€ ๋ฉ”์„œ๋“œ๋กœ ๊ตฌ์„ฑ ๋ฆฌ์†Œ์Šค๋ž€ ์•ฑ์ด ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ด ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋…ผ๋ฆฌ์  ์—”ํ„ฐํ‹ฐ ๋ฉ”์„œ๋“œ๋Š” API ์‚ฌ์šฉ์ž๊ฐ€ ์ œ์ถœํ•œ REST API ์š”์ฒญ ๋ฐ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋ฐ˜ํ™˜๋˜๋Š” ์‘๋‹ต

    ์•ฑ์€ ๋ฐฑ์—”๋“œ์—์„œ ์š”์ฒญ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๊ณ  ๊ฐ€์ ธ์˜ค๋Š” ์œ„์น˜๋ฅผ ์•Œ ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ, API Gateway REST API์—์„œ ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ๋ฉ”์„œ๋“œ ์š”์ฒญ ๋ฐ ๋ฉ”์„œ๋“œ ์‘๋‹ต์œผ๋กœ ์บก์Аํ™”๋˜๊ณ  API๋Š” integration requests(ํ†ตํ•ฉ ์š”์ฒญ) ๋ฐ integration responses(ํ†ตํ•ฉ ์‘๋‹ต)์„ ์ด์šฉํ•ด ๋ฐฑ์—”๋“œ์™€ ํ†ต์‹ ํ•˜๊ฒŒ ๋จ

    ํ†ตํ•ฉ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋Œ€ํ•œ (ํ•ด๋‹น HTTP ์ƒํƒœ ์ฝ”๋“œ์˜) ์ ์ ˆํ•œ ๋ฉ”์„œ๋“œ ์‘๋‹ต์œผ๋กœ ๋ผ์šฐํŒ…ํ•˜๋ ค๋ฉด, ํ†ตํ•ฉ์—์„œ ๋ฉ”์„œ๋“œ๋กœ ํ•„์š”ํ•œ ์‘๋‹ต ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋งคํ•‘ํ•˜๋„๋ก ํ†ตํ•ฉ ์‘๋‹ต์„ ๊ตฌ์„ฑํ•˜๋ฉด ๋จ ๊ทธ๋Ÿฐ ๋‹ค์Œ, ํ•„์š”์— ๋”ฐ๋ผ ๋ฐฑ์—”๋“œ์˜ ์ถœ๋ ฅ ๋ฐ์ดํ„ฐ ํ˜•์‹์„ ํ”„๋ŸฐํŠธ์—”๋“œ์˜ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ API Gateway๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ํŽ˜์ด๋กœ๋“œ์˜ ์Šคํ‚ค๋งˆ๋‚˜ ๋ชจ๋ธ์„ ์ •์˜ํ•˜์—ฌ ๋ณธ๋ฌธ ๋งคํ•‘ ํ…œํ”Œ๋ฆฟ์„ ์†์‰ฝ๊ฒŒ ์„ค์ • ๊ฐ€๋Šฅ

  3. WebSocket API WebSocket API์—์„œ ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„๋Š” ์–ธ์ œ๋“  ์„œ๋กœ ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์Œ ๋ฐฑ์—”๋“œ ์„œ๋ฒ„๋Š” ๋ณต์žกํ•œ ํด๋ง ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•  ํ•„์š” ์—†์ด ์—ฐ๊ฒฐ๋œ ์‚ฌ์šฉ์ž ๋ฐ ์žฅ์น˜๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์‰ฝ๊ฒŒ ํ‘ธ์‹œํ•  ์ˆ˜ ์žˆ์Œ

    API Gateway WebSocket API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์—ฐ๊ฒฐ์ด๋‚˜ ๋Œ€์šฉ๋Ÿ‰ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋ฒ„๋ฅผ ํ”„๋กœ๋น„์ €๋‹ํ•˜๊ฑฐ๋‚˜ ๊ด€๋ฆฌํ•˜์ง€ ์•Š๊ณ ๋„ ์•ˆ์ „ํ•œ ์‹ค์‹œ๊ฐ„ ํ†ต์‹  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ

    • ์ฑ„ํŒ… ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜

    • ์ฃผ์‹ ์‹œ์„ธ ํ‘œ์‹œ๊ธฐ์™€ ๊ฐ™์€ ์‹ค์‹œ๊ฐ„ ๋Œ€์‹œ ๋ณด๋“œ

    • ์‹ค์‹œ๊ฐ„ ๊ฒฝ๊ณ  ๋ฐ ์•Œ๋ฆผ

HTTP API์™€ REST API ๋น„๊ต

HTTP API๋Š” ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด ์งง๊ณ  ๋น„์šฉ ํšจ๊ณผ์ ์ธ AWS Lambda ํ”„๋ก์‹œ ๋ฐ HTTP ํ”„๋ก์‹œ API๋ฅผ ์œ„ํ•ด ์„ค๊ณ„๋จ HTTP API๋Š” OIDC ๋ฐ OAuth 2.0 ์ธ์ฆ์„ ์ง€์›ํ•˜๋ฉฐ CORS ๋ฐ ์ž๋™ ๋ฐฐํฌ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ์ œ๊ณตํ•˜๊ณ , ์ด์ „ ์„ธ๋Œ€ REST API๋Š” ํ˜„์žฌ ๋” ๋งŽ์€ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ API ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์™„์ „ํžˆ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅ

๊ถŒํ•œ ๋ถ€์—ฌ์ž

HTTP API

REST API

AWS Lambda

โœ”

IAM

โœ”

Amazon Cognito

โœ”*

โœ”

OpenID Connect/OAuth 2.0

โœ”

* Amazon Cognito๋ฅผ JWT ๋ฐœ๊ธ‰์ž๋กœ ์‚ฌ์šฉ

Integration

HTTP API

REST API

HTTP ํ”„๋ก์‹œ

โœ”

โœ”

Lambda ํ”„๋ก์‹œ

โœ”

โœ”

HTTP

โœ”

AWS ์„œ๋น„์Šค

โœ”

โœ”

ํ”„๋ผ์ด๋น— ํ†ตํ•ฉ

โœ”

โœ”

๋ชจ์˜

โœ”

API ๊ด€๋ฆฌ

HTTP API

REST API

์‚ฌ์šฉ๋Ÿ‰ ๊ณ„ํš

โœ”

API ํ‚ค

โœ”

์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„

โœ”*

โœ”

* HTTP API TLS 1.0 ์ง€์› ์•ˆ๋จ

๊ฐœ๋ฐœ

HTTP API

REST API

Cache

โœ”

๋ณ€ํ™˜ ์š”์ฒญ

โœ”

์š”์ฒญ/์‘๋‹ต ๊ฒ€์ฆ

โœ”

ํ˜ธ์ถœ ํ…Œ์ŠคํŠธ

โœ”

CORS ๊ตฌ์„ฑ

โœ”

์ž๋™ ๋ฐฐํฌ

โœ”

๊ธฐ๋ณธ ๋‹จ๊ณ„

โœ”

๊ธฐ๋ณธ ๊ฒฝ๋กœ

โœ”

Security

HTTP API

REST API

ํด๋ผ์ด์–ธํŠธ ์ธ์ฆ์„œ

โœ”

AWS WAF

โœ”

๋ฆฌ์†Œ์Šค ์ •์ฑ…

โœ”

API ์œ ํ˜•

HTTP API

REST API

๋ฆฌ์ „

โœ”

โœ”

์—ฃ์ง€ ์ตœ์ ํ™”

โœ”

ํ”„๋ผ์ด๋น—

โœ”

Monitoring

HTTP API

REST API

Amazon CloudWatch Logs์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋กœ๊ทธ

โœ”

โœ”

Amazon Kinesis Data Firehose์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๋กœ๊ทธ

โœ”

์‹คํ–‰ ๋กœ๊ทธ

โœ”

Amazon CloudWatch ์ง€ํ‘œ

โœ”

โœ”

AWS X-Ray

โœ”

HTTP API

๊ฐœ๋ฐœ

์ƒ์„ฑ

ํ•จ์ˆ˜ API๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ์ตœ์†Œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋ผ์šฐํŒ…, ํ†ตํ•ฉ, ์Šคํ…Œ์ด์ง€ ๋ฐ ๋ฐฐํฌ๊ฐ€ ์žˆ์–ด์•ผ ํ•จ

๋ผ์šฐํŒ…

์ˆ˜์‹  API ์š”์ฒญ์„ ๋ฐฑ์—”๋“œ ๋ฆฌ์†Œ์Šค๋กœ ์ง์ ‘ ๋ผ์šฐํŒ… ๊ฒฝ๋กœ๋Š” HTTP ๋ฉ”์„œ๋“œ์™€ ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ(์˜ˆ: GET /pets)๋ผ๋Š” ๋‘ ๋ถ€๋ถ„์œผ๋กœ ๊ตฌ์„ฑ ๋ผ์šฐํŒ…์— ๋Œ€ํ•œ ํŠน์ • HTTP ๋ฉ”์„œ๋“œ๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ANY ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•ด ์ •์˜ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜์‹œํ‚ฌ ์ˆ˜๋„ ์žˆ์Œ ๋‹ค๋ฅธ ๊ฒฝ๋กœ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์— ๋Œ€ํ•ด catch-all ์—ญํ• ์„ ํ•˜๋Š” $default ๊ฒฝ๋กœ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Œ

  • ๊ฒฝ๋กœ ๋ณ€์ˆ˜ ์ž‘์—… HTTP API ๋ผ์šฐํŒ…์—์„œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ

    ์˜ˆ) GET /pets/{petID} ๋ผ์šฐํŒ…์€ ํด๋ผ์ด์–ธํŠธ๊ฐ€ https://api-id.execute-api.us-east-2.amazonaws.com/pets/6์— ์ œ์ถœํ•˜๋Š” GET ์š”์ฒญ์„ ํฌ์ฐฉ

    ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋Š” ๋ผ์šฐํŒ…์˜ ๋ชจ๋“  ํ•˜์œ„ ๋ฆฌ์†Œ์Šค๋ฅผ ํฌ์ฐฉํ•˜๊ฒŒ ๋จ ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋ณ€์ˆ˜ ์ด๋ฆ„์— +์„ ์ถ”๊ฐ€ (์˜ˆ: {proxy+}) ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋Š” ๋ฆฌ์†Œ์Šค ๊ฒฝ๋กœ์˜ ๋์— ์žˆ์–ด์•ผํ•จ

  • ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ ์ž‘์—… HTTP API์— ๋Œ€ํ•œ ์š”์ฒญ์— ํฌํ•จ๋œ ๊ฒฝ์šฐ API Gateway์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ ํ†ตํ•ฉ์œผ๋กœ ๋ณด๋ƒ„

    ์˜ˆ) ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์š”์ฒญ์„ https://api-id.execute-api.us-east-2.amazonaws.com/pets?id=4&type=dog์— ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ํŒŒ๋ผ๋ฏธํ„ฐ ?id=4&type=dog๊ฐ€ ํ†ตํ•ฉ์— ์ „์†ก๋˜๊ฒŒ ๋จ

  • $default ๋ผ์šฐํŒ… ์ž‘์—… $default ๋ผ์šฐํŒ…์€ API์˜ ๋‹ค๋ฅธ ๋ผ์šฐํŒ…๊ณผ ๋ช…์‹œ์ ์œผ๋กœ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ์š”์ฒญ์„ ํฌ์ฐฉ

    $default ๋ผ์šฐํŒ…์ด ์š”์ฒญ์„ ๋ฐ›๋Š” ๊ฒฝ์šฐ API Gateway์—์„œ ์ „์ฒด ์š”์ฒญ ๊ฒฝ๋กœ๋ฅผ ํ†ตํ•ฉ์— ๋ณด๋ƒ„ ์˜ˆ) $default ๋ผ์šฐํŒ…๋งŒ ์žˆ๋Š” API๋ฅผ ์ƒ์„ฑํ•˜์—ฌ https://petstore-demo-endpoint.execute-api.com HTTP ์—”๋“œํฌ์ธํŠธ๊ฐ€ ์žˆ๋Š” ANY ๋ฉ”์„œ๋“œ์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Œ ์š”์ฒญ์„ https://api-id.execute-api.us-east-2.amazonaws.com/store/checkout์— ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ API Gateway์—์„œ ์š”์ฒญ์„ https://petstore-demo-endpoint.execute-api.com/store/checkout์— ๋ณด๋ƒ„

  • API ์š”์ฒญ ๋ผ์šฐํŒ… ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์š”์ฒญ์„ ๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ API Gateway์—์„œ ๋จผ์ € ์š”์ฒญ์„ ๋ผ์šฐํŒ…ํ•  ๋‹จ๊ณ„๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋จ ์š”์ฒญ์ด ๋‹จ๊ณ„์™€ ๋ช…์‹œ์ ์œผ๋กœ ์ผ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ API Gateway๋Š” ์š”์ฒญ์„ ํ•ด๋‹น ๋‹จ๊ณ„๋กœ ๋ณด๋‚ด๊ฒŒ ๋˜๋ฉฐ, ์š”์ฒญ๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ API Gateway๋Š” ์š”์ฒญ์„ $default ๋‹จ๊ณ„๋กœ ๋ณด๋‚ด๊ฒŒ ๋จ ๋งŒ์•ฝ $default ๋‹จ๊ณ„๊ฐ€ ์—†์œผ๋ฉด API๊ฐ€ {"message":"Not Found"}๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ

    API Gateway ๋ผ์šฐํŒ… ์šฐ์„  ์ˆœ์œ„ 1. ๋ผ์šฐํŒ… ๋ฐ ๋ฉ”์„œ๋“œ์— ์™„์ „ํžˆ ์ผ์น˜ 2. ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜({proxy+})๊ฐ€ ์žˆ๋Š” ๋ผ์šฐํŒ… ๋ฐ ๋ฉ”์„œ๋“œ์— ์ผ์น˜ 3. $default ๋ผ์šฐํŒ…

    ๋ผ์šฐํŒ… ์˜ˆ์ œ 1. GET /pets/dog/{id} 2. GET /pets/{proxy+} 3. ANY /{proxy+} 4. $default

    ์š”์ฒญ

    ์„ ํƒํ•œ ๋ผ์šฐํŒ…

    ์„ค๋ช…

    GET /pets/dog/{id}

    ์™„์ „ํžˆ ์ผ์น˜

    GET /pets/{proxy+}

    ์š”์ฒญ์ด ๋ผ์šฐํŒ…๊ณผ ์™„์ „ํžˆ ์ผ์น˜ํ•˜์ง€ ์•Š์œผ๋‚˜, GET ๋ฉ”์„œ๋“œ์™€ ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ผ์šฐํŒ… ํฌ์ฐฉ

    ANY /{proxy+}

    ANY ๋ฉ”์„œ๋“œ๋Š” ๋ผ์šฐํŒ…์— ๋Œ€ํ•ด ์ •์˜ํ•˜์ง€ ์•Š์€ ๋ชจ๋“  ๋ฉ”์„œ๋“œ์™€ ์ผ์น˜ํ•จ. ๋ณต์žกํ•œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š” ๋ผ์šฐํŒ…์€ $default ๋ผ์šฐํŒ…๋ณด๋‹ค ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’๊ฒŒ ๋จ

์•ก์„ธ์Šค ์ œ์–ด

JWT(JSON Web Token)๋ฅผ OIDC(OpenID Connect) ๋ฐ OAuth 2.0 ํ”„๋ ˆ์ž„์›Œํฌ์˜ ์ผ๋ถ€๋กœ ์‚ฌ์šฉํ•˜์—ฌ API์— ๋Œ€ํ•œ ํด๋ผ์ด์–ธํŠธ ์•ก์„ธ์Šค๋ฅผ ์ œํ•œ API์˜ ๊ฒฝ๋กœ์— ๋Œ€ํ•ด JWT ๊ถŒํ•œ ๋ถ€์—ฌ์ž๋ฅผ ๊ตฌ์„ฑํ•˜๋ฉด API Gateway๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ API ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ œ์ถœํ•˜๋Š” JWT๋ฅผ ๊ฒ€์ฆ

API ์š”์ฒญ ๊ถŒํ•œ ๋ถ€์—ฌ

API Gateway๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ผ๋ฐ˜ ์›Œํฌํ”Œ๋กœ์šฐ

  1. ํ† ํฐ์— ๋Œ€ํ•œ identitySource๋ฅผ ํ™•์ธ identitySource์—๋Š” ํ† ํฐ๋งŒ ํฌํ•จํ•˜๊ฑฐ๋‚˜ Bearer ์ ‘๋‘์‚ฌ๊ฐ€ ๋ถ™์€ ํ† ํฐ๋งŒ ํฌํ•จ๋ ์ˆ˜ ์žˆ์Œ

  2. ํ† ํฐ ๋””์ฝ”๋”ฉ

  3. ๋ฐœํ–‰์ž์˜ jwks_uri์—์„œ ๊ฐ€์ ธ์˜จ ํผ๋ธ”๋ฆญ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํฐ์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๊ณผ ์„œ๋ช…์„ ํ™•์ธ ํ˜„์žฌ RSA ๊ธฐ๋ฐ˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜๋งŒ ์ง€์›

  4. ํด๋ ˆ์ž„์„ ๊ฒ€์ฆ API Gateway๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ† ํฐ ํด๋ ˆ์ž„์„ ํ‰๊ฐ€

    • kid โ€“ ํ† ํฐ์—๋Š” ํ† ํฐ์— ์„œ๋ช…ํ•œ jwks_uri์˜ ํ‚ค์™€ ์ผ์น˜ํ•˜๋Š” ํ—ค๋” ํด๋ ˆ์ž„ ์œ ๋ฌด

    • iss โ€“ ๊ถŒํ•œ ๋ถ€์—ฌ์ž์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ issuer์™€ ์ผ์น˜

    • aud ๋˜๋Š” client_id โ€“ ๊ถŒํ•œ ๋ถ€์—ฌ์ž์— ๋Œ€ํ•ด ๊ตฌ์„ฑ๋œ audience ํ•ญ๋ชฉ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜

    • exp โ€“ ํ˜„์žฌ ์‹œ๊ฐ„(UTC ๊ธฐ์ค€) ์ดํ›„ ์—ฌ๋ถ€

    • nbf โ€“ ํ˜„์žฌ ์‹œ๊ฐ„(UTC ๊ธฐ์ค€) ์ด์ „ ์—ฌ๋ถ€

    • iat โ€“ ํ˜„์žฌ ์‹œ๊ฐ„(UTC ๊ธฐ์ค€) ์ด์ „ ์—ฌ๋ถ€

    • scope ๋˜๋Š” scp โ€“ ํ† ํฐ์— ๋ผ์šฐํŒ…์˜ authorizationScopes ๋ฒ”์œ„ ์ค‘ ํ•˜๋‚˜ ์ด์ƒ์ด ํฌํ•จ ์—ฌ๋ถ€

์ด๋Ÿฌํ•œ ๋‹จ๊ณ„ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํŒจํ•˜๋ฉด API Gateway๋Š” API ์š”์ฒญ์„ ๊ฑฐ๋ถ€ JWT๋ฅผ ๊ฒ€์ฆํ•œ ํ›„ API Gateway๋Š” ํ† ํฐ์˜ ํด๋ ˆ์ž„์„ API ๊ฒฝ๋กœ์˜ ํ†ตํ•ฉ์— ์ „๋‹ฌ Lambda ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๋ฐฑ์—”๋“œ ๋ฆฌ์†Œ์Šค๋Š” $context.authorizer.claims์˜ JWT ํด๋ ˆ์ž„์— ์•ก์„ธ์Šค ๊ฐ€๋Šฅ

ํ†ตํ•ฉ(Integration)

ํ†ตํ•ฉ ๋ฐฑ์—”๋“œ ๋ฆฌ์†Œ์Šค์— ๋ผ์šฐํŠธ๋ฅผ ์—ฐ๊ฒฐ HTTP APIs, Lambda ํ”„๋ก์‹œ, AWS ์„œ๋น„์Šค ๋ฐ HTTP ํ”„๋ก์‹œ ํ†ตํ•ฉ ์ง€์›

  1. HTTP API ๋ผ์šฐํŒ…์„ ๊ณต๊ฐœ์ ์œผ๋กœ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋Š” HTTP ์—”๋“œํฌ์ธํŠธ์— ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ์Œ API Gateway์ด ํ”„๋ŸฐํŠธ ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ ์‚ฌ์ด์— ์ „์ฒด ์š”์ฒญ ๋ฐ ์‘๋‹ต์„ ์ „๋‹ฌ

    ๊ฒฝ๋กœ ๋ณ€์ˆ˜์™€์˜ HTTP ํ”„๋ก์‹œ ํ†ตํ•ฉ HTTP API ๋ผ์šฐํŒ…์—์„œ ๊ฒฝ๋กœ ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉ ์˜ˆ) ๋ผ์šฐํŒ… /pets/{petID}์€ /pets/6์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํฌ์ฐฉ

  2. Lambda ํด๋ผ์ด์–ธํŠธ๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด API Gateway๋Š” Lambda ํ•จ์ˆ˜์— ์š”์ฒญ์„ ์ „์†กํ•˜๊ณ  ํ•จ์ˆ˜์˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜

    • ํŽ˜์ด๋กœ๋“œ ํ˜•์‹ ๋ฒ„์ „ API Gateway์—์„œ Lambda ํ†ตํ•ฉ์œผ๋กœ ์ „์†กํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ํ˜•์‹๊ณผ API Gateway์ด Lambda์—์„œ ์‘๋‹ต์„ ํ•ด์„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ง€์ •

      Version 2.0 (Default)

        {
            "version": "2.0",
            "routeKey": "$default",
            "rawPath": "/my/path",
            "rawQueryString": "parameter1=value1&parameter1=value2&parameter2=value",
            "cookies": [
                "cookie1",
                "cookie2"
            ],
            "headers": {
                "Header1": "value1",
                "Header2": "value1,value2"
            },
            "queryStringParameters": {
                "parameter1": "value1,value2",
                "parameter2": "value"
            },
            "requestContext": {
                "accountId": "123456789012",
                "apiId": "api-id",
                "authorizer": {
                    "jwt": {
                        "claims": {
                            "claim1": "value1",
                            "claim2": "value2"
                        },
                        "scopes": [
                            "scope1",
                            "scope2"
                        ]
                    }
                },
                "domainName": "id.execute-api.us-east-1.amazonaws.com",
                "domainPrefix": "id",
                "http": {
                    "method": "POST",
                    "path": "/my/path",
                    "protocol": "HTTP/1.1",
                    "sourceIp": "IP",
                    "userAgent": "agent"
                },
                "requestId": "id",
                "routeKey": "$default",
                "stage": "$default",
                "time": "12/Mar/2020:19:03:58 +0000",
                "timeEpoch": 1583348638390
            },
            "body": "Hello from Lambda",
            "pathParameters": {
                "parameter1": "value1"
            },
            "isBase64Encoded": false,
            "stageVariables": {
                "stageVariable1": "value1",
                "stageVariable2": "value2"
            }
        }

      Version 1.0

        {
            "version": "1.0",
            "resource": "/my/path",
            "path": "/my/path",
            "httpMethod": "GET",
            "headers": {
                "Header1": "value1",
                "Header2": "value2"
            },
            "multiValueHeaders": {
                "Header1": [
                    "value1"
                ],
                "Header2": [
                    "value1",
                    "value2"
                ]
            },
            "queryStringParameters": {
                "parameter1": "value1",
                "parameter2": "value"
            },
            "multiValueQueryStringParameters": {
                "parameter1": [
                    "value1",
                    "value2"
                ],
                "parameter2": [
                    "value"
                ]
            },
            "requestContext": {
                "accountId": "123456789012",
                "apiId": "id",
                "authorizer": {
                    "claims": null,
                    "scopes": null
                },
            "domainName": "id.execute-api.us-east-1.amazonaws.com",
            "domainPrefix": "id",
            "extendedRequestId": "request-id",
            "httpMethod": "GET",
                "identity": {
                    "accessKey": null,
                    "accountId": null,
                    "caller": null,
                    "cognitoAuthenticationProvider": null,
                    "cognitoAuthenticationType": null,
                    "cognitoIdentityId": null,
                    "cognitoIdentityPoolId": null,
                    "principalOrgId": null,
                    "sourceIp": "IP",
                    "user": null,
                    "userAgent": "user-agent",
                    "userArn": null
                },
                "path": "/my/path",
                "protocol": "HTTP/1.1",
                "requestId": "id=",
                "requestTime": "04/Mar/2020:19:15:17 +0000",
                "requestTimeEpoch": 1583349317135,
                "resourceId": null,
                "resourcePath": "/my/path",
                "stage": "$default"
            },
            "pathParameters": null,
            "stageVariables": null,
            "body": "Hello from Lambda!",
            "isBase64Encoded": true
        }
    • Lambda ํ•จ์ˆ˜ ์‘๋‹ต ํ˜•์‹ ํŽ˜์ด๋กœ๋“œ ํ˜•์‹ ๋ฒ„์ „์— ๋”ฐ๋ผ Lambda ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜ํ•ด์•ผ ํ•˜๋Š” ์‘๋‹ต ๊ตฌ์กฐ๋ฅผ ๊ฒฐ์ •ํ•˜๊ฒŒ ๋จ

      Version 1.0

        {
            "isBase64Encoded": true|false,
            "statusCode": httpStatusCode,
            "headers": { "headerName": "headerValue", ... },
            "multiValueHeaders": { 
                "headerName": ["headerValue", "headerValue2", ...], ... 
            },
            "body": "..."
        }

      Version 2.0 API Gateway์€ Lambda ํ•จ์ˆ˜๊ฐ€ ์œ ํšจํ•œ JSON์„ ๋ฐ˜ํ™˜ํ•˜๊ณ  statusCode๋ฅผ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์œผ๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฐ€์ •ํ•˜๊ฒŒ ๋จ

      • isBase64Encoded = false

      • statusCode = 200

      • content-type = application/json

      • body์€ ํ•จ์ˆ˜์˜ ์‘๋‹ต

        {
          "cookies" : ["cookie1", "cookie2"],
          "isBase64Encoded": true|false,
          "statusCode": httpStatusCode,
          "headers": { "headerName": "headerValue", ... },
          "body": "Hello from Lambda!"
        }
  3. AWS ์„œ๋น„์Šค ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์ผ๋ฅ˜ ํ†ตํ•ฉ(first-class intergration)์œผ๋กœ ๋’ท๋ฐ›์นจ๋˜๋Š” ๊ฒฝ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, API Gateway ํ˜ธ์ถœ์„ AWS ์„œ๋น„์Šค API๋ฅผ ์ œ๊ณต

    ๋งคํ•‘ ์š”์ฒญ ๋งค๊ฐœ ๋ณ€์ˆ˜

    ์œ ํ˜•

    ์˜ˆ

    ์ฐธ๊ณ 

    ํ—ค๋” ๊ฐ’

    $request.header.name

    ํ—ค๋” ์ด๋ฆ„์€ ๋Œ€/์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•˜์ง€ ์•Š์Œ. API Gateway ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ํ—ค๋” ๊ฐ’์„ ์‰ผํ‘œ๋กœ ๊ฒฐํ•ฉ. "header1": "value1,value2".

    ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ๊ฐ’

    $request.querystring.name

    ์ฟผ๋ฆฌ ๋ฌธ์ž์—ด ์ด๋ฆ„์€ ๋Œ€/์†Œ๋ฌธ์ž๋ฅผ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. API Gateway ์˜ˆ๋ฅผ ๋“ค์–ด ์—ฌ๋Ÿฌ ๊ฐ’์„ ์‰ผํ‘œ๋กœ ๊ฒฐํ•ฉ "querystring1": "Value1,Value2"

    ๊ฒฝ๋กœ ๋งค๊ฐœ๋ณ€์ˆ˜

    $request.path.name

    ์š”์ฒญ ์—์„œ ๊ฒฝ๋กœ ๋งค๊ฐœ ๋ณ€์ˆ˜์˜ ๊ฐ’. ์˜ˆ) ๊ฒฝ๋กœ๊ฐ€ /pets/{petId}์„(๋ฅผ) ๋งคํ•‘๊ฐ€๋Šฅ. petId ์š”์ฒญ์˜ ๋งค๊ฐœ ๋ณ€์ˆ˜ $request.path.petId.

    ๋ฐ”๋”” ํŒจ์Šค ์š”์ฒญ

    $request.body

    API Gateway ๋ฅผ ํ†ตํ•ด ์ „์ฒด ์š”์ฒญ ๋ณธ์ฒด๋ฅผ ์ „๋‹ฌ

    ์š”์ฒญ ๋ณธ๋ฌธ

    $request.body.name

    A JSON ๊ฒฝ๋กœ ํ‘œํ˜„. ์žฌ๋ฐœ์„ฑ ํ•˜๊ฐ•($request.body..name) ๋ฐ ํ•„ํ„ฐ ํ‘œํ˜„์‹(?(expression))์„(๋ฅผ) ์ง€์›ํ•˜์ง€ ์•Š์Œ

    ์ปจํ…์Šคใ…‘ํŠธ ๋ณ€์ˆ˜

    contextvariableName

    ์ง€์›๋˜๋Š” ์ปจํ…์ŠคํŠธ ๋ณ€์ˆ˜

    ๋‹จ๊ณ„ ๋ณ€์ˆ˜

    $stagevariables.variableName

    ๋‹จ๊ณ„ ๋ณ€์ˆ˜

    ์ •์  ๊ฐ’

    string

    ์ผ์ •ํ•œ ๊ฐ’.

ํ†ตํ•ฉ ํ•˜์œ„ ์œ ํ˜• ์ฐธ์กฐ
* EventBridge-PutEvents
* SQS-SendMessage
* SQS-ReceiveMessage
* SQS-DeleteMessage
* SQS-PurgeQueue
* AppConfig-GetConfiguration
* Kinesis-PutRecord
* StepFunctions-StartExecution
* StepFunctions-StopExecution  

๊ฐ ์„œ๋น„์Šค API๋ณ„ ํ•„์š”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ฐ’์ด ๋‹ค๋ฅด๋ฏ€๋กœ ์ž์„ธํ•œ ์‚ฌํ•ญ์€ ๋‹ค์Œ ๊ฒฝ๋กœ ์ฐธ๊ณ   
https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-aws-services-reference.html
  1. ํ”„๋ผ์ด๋น— ํ”„๋ผ์ด๋น— ํ†ตํ•ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด VPC์˜ ํ”„๋ผ์ด๋น— ๋ฆฌ์†Œ์Šค(์˜ˆ: Application Load Balancer ๋˜๋Š” Amazon ECS ์ปจํ…Œ์ด๋„ˆ ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์™€์˜ API ํ†ตํ•ฉ์„ ์ƒ์„ฑ ๊ฐ€๋Šฅ ํ”„๋ผ์ด๋น— ํ†ตํ•ฉ์„ ์ƒ์„ฑํ•˜๋ ค๋ฉด ๋จผ์ € VPC ๋งํฌ๊ฐ€ ํ•„์š”ํ•จ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ”„๋ผ์ด๋น— ํ†ตํ•ฉ ํŠธ๋ž˜ํ”ฝ์€ HTTP ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, tlsConfig๋ฅผ ์ง€์ •ํ•˜์—ฌ HTTPS๋ฅผ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์Œ

    1. Application Load Balancer ๋˜๋Š” Network Load Balancer๋ฅผ ์‚ฌ์šฉ

    2. AWS Cloud Map ์„œ๋น„์Šค ๊ฒ€์ƒ‰์„ ์‚ฌ์šฉ Amazon ECS๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ AWS Cloud Map์—์„œ ํ•ญ๋ชฉ์„ ์ฑ„์šฐ๋Š” ๊ฒฝ์šฐ, SRV ๋ ˆ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก Amazon ECS ์ž‘์—…์„ ๊ตฌ์„ฑํ•ด์•ผ ํ•˜๋ฉฐ, โ€œAโ€ ๋ ˆ์ฝ”๋“œ๋Š” ์ง€์›๋˜์ง€ ์•Š์Œ

CORS(Cross-Origin Resource Sharing)

๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ ์ค‘์ธ ์Šคํฌ๋ฆฝํŠธ์—์„œ ์‹œ์ž‘๋˜๋Š” HTTP ์š”์ฒญ์„ ์ œํ•œํ•˜๋Š” ๋ธŒ๋ผ์šฐ์ € ๋ณด์•ˆ ๊ธฐ๋Šฅ CORS๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์ด๋‚˜ ์˜ค๋ฆฌ์ง„์— ํ˜ธ์ŠคํŒ…๋œ API์— ์•ก์„ธ์Šคํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋นŒ๋“œํ•˜๋Š” ๋ฐ ํ•„์š” CORS๋ฅผ ํ™œ์„ฑํ™”ํ•˜์—ฌ ๋‹ค๋ฅธ ๋„๋ฉ”์ธ์— ํ˜ธ์ŠคํŒ…๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ API์— ๋Œ€ํ•œ ์š”์ฒญ์„ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Œ ์˜ˆ) API๊ฐ€ https://{api_id}.execute-api.{region}.amazonaws.com/์— ํ˜ธ์ŠคํŒ…๋˜๊ณ  example.com์— ํ˜ธ์ŠคํŒ…๋œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ API๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋Š” ๊ฒฝ์šฐ API๊ฐ€ CORS๋ฅผ ์ง€์›ํ•ด์•ผ ํ•จ

CORS ์š”์ฒญ์˜ ๊ฒฝ์šฐ API Gateway๋Š” ๊ตฌ์„ฑ๋œ CORS ํ—ค๋”๋ฅผ ํ†ตํ•ฉ์˜ ์‘๋‹ต์— ์ถ”๊ฐ€ํ•˜๊ฒŒ ๋˜๋ฉฐ, CORS ๊ตฌ์„ฑ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Œ

CORS ํ—ค๋”

CORS ๊ตฌ์„ฑ ์†์„ฑ

์˜ˆ์ œ ๊ฐ’

Access-Control-Allow-Origin

allowOrigins

https://www.example.com *( ๋ชจ๋“  ์˜ค๋ฆฌ์ง„ ํ—ˆ์šฉ) https://*( https://๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฆฌ์ง„ ํ—ˆ์šฉ) http://*( http://๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ์˜ค๋ฆฌ์ง„ ํ—ˆ์šฉ)

Access-Control-Allow-Credentials

allowCredentials

TRUE

Access-Control-Expose-Headers

exposeHeaders

Date, x-api-id

Access-Control-Max-Age

maxAge

300

Access-Control-Allow-Methods

allowMethods

GET, POST, DELETE, *

Access-Control-Allow-Headers

allowHeaders

Authorization, *

Publish

์Šคํ…Œ์ด์ง€ ๋ฐ ์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก API๋ฅผ ๊ฒŒ์‹œํ•˜๊ฒŒ ๋จ

Stages

API ๋‹จ๊ณ„๋Š” API์˜ ์ˆ˜๋ช… ์ฃผ๊ธฐ ์ƒํƒœ์— ๋Œ€ํ•œ ๋…ผ๋ฆฌ์  ์ฐธ์กฐ์ž„ (์˜ˆ: dev, prod, beta, v2)

์‚ฌ์šฉ์ž ์ง€์ • ๋„๋ฉ”์ธ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜์—ฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ธฐ๋ณธ URL์ธ https://api-id.execute-api.region.amazonaws.com/stage ๋ณด๋‹ค ๋” ๊ฐ„๋‹จํ•˜๊ณ  ์ง๊ด€์ ์ธ URL์„ ์‚ฌ์šฉํ• ์ˆ˜ ์žˆ์Œ

๋ฐฐํฌ๋Š” API ๊ตฌ์„ฑ์˜ ์Šค๋ƒ…์ƒท์œผ๋กœ ๋‹จ๊ณ„์— API๋ฅผ ๋ฐฐํฌํ•œ ํ›„์—๋Š” ํด๋ผ์ด์–ธํŠธ๊ฐ€ API๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ

๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ ์šฉํ•˜๋ ค๋ฉด API๋ฅผ ๋ฐฐํฌํ•ด์•ผ ํ•˜๊ณ , ์ž๋™ ๋ฐฐํฌ๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋ฉด API์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ž๋™์œผ๋กœ ๋ฆด๋ฆฌ์Šค๋˜๊ฒŒ ๋จ

๋‹จ๊ณ„ ๋ณ€์ˆ˜

๋‹จ๊ณ„ ๋ณ€์ˆ˜๋Š” HTTP API์˜ ๋‹จ๊ณ„์— ๋Œ€ํ•ด ์ •์˜ํ•  ์ˆ˜ ์žˆ๋Š” ํ‚ค-๊ฐ’ ํŽ˜์–ด ํ™˜๊ฒฝ ๋ณ€์ˆ˜์™€ ๋น„์Šทํ•œ ์—ญํ• ์„ ํ•˜๋ฉฐ, API ์„ค์ •์— ์‚ฌ์šฉํ•˜๊ฒŒ ๋จ

Protect

๋„ˆ๋ฌด ๋งŽ์€ ์š”์ฒญ์œผ๋กœ ์ธํ•ด API๊ฐ€ ๊ฐ€๋“ ์ฐจ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด Amazon API Gateway์—์„œ๋Š” ํ† ํฐ ๋ฒ„ํ‚ท ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์‚ฌ์šฉํ•˜์—ฌ API์— ๋Œ€ํ•œ ์š”์ฒญ์„ ์กฐ์ ˆ API Gateway์—์„œ ํ•œ๋„ ์ดˆ๊ณผ ์š”์ฒญ์„ ์‹คํŒจํ•˜๊ณ  429 Too Many Requests ์˜ค๋ฅ˜ ์‘๋‹ต์„ ํด๋ผ์ด์–ธํŠธ์— ๋ฐ˜ํ™˜ํ•˜๊ฒŒ ๋จ

๊ณ„์ • ์ˆ˜์ค€ ์กฐ์ ˆ

๊ธฐ๋ณธ์ ์œผ๋กœ API Gateway์—์„œ๋Š” ์•ˆ์ •์ ์ธ ์ƒํƒœ์˜ ์š”์ฒญ ์†๋„๋ฅผ 10,000rps(์ดˆ๋‹น ์š”์ฒญ ์ˆ˜)๋กœ ์ œํ•œ, AWS ๊ณ„์ • ๋‚ด ๋ชจ๋“  API์— ๋Œ€ํ•ด ๋ฒ„์ŠคํŠธ(์ฆ‰, ์ตœ๋Œ€ ๋ฒ„ํ‚ท ํฌ๊ธฐ)๋ฅผ 5,000 ์š”์ฒญ์œผ๋กœ ์ œํ•œ

๋ผ์šฐํŒ… ์ˆ˜์ค€ ์กฐ์ ˆ

API์˜ ํŠน์ • ๋‹จ๊ณ„ ๋˜๋Š” ๊ฐœ๋ณ„ ๋ผ์šฐํŒ…์— ๋Œ€ํ•ด ๊ณ„์ • ์ˆ˜์ค€ ์š”์ฒญ ์Šค๋กœํ‹€ ํ•œ๋„๋ฅผ ์žฌ์ •์˜ ๊ณ„์ • ์ˆ˜์ค€ ์กฐ์ ˆ์„ ๋„˜์–ด๊ฐˆ์ˆ˜๋Š” ์—†์Œ

REST API

To Be Continued

Websocket API

To Be Continued

Last updated

Was this helpful?