[AWS] API Gateway

์•„ํ‚คํ…์ณ ํŒจํ„ด์—์„œ์˜ API Gateway ํŒจํ„ด์„ ๊ตฌํ˜„, ์ œ๊ณตํ•˜๋Š” AWS์˜ ๊ฐ„ํŒ ์„œ๋น„์Šค ์ค‘ ํ•˜๋‚˜๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ์„œ๋ฒ„๋“ค์˜ ์•ž๋‹จ ํ”„๋ก์‹œ ์—ญํ• ์„ ํ•˜๋Š”๋ฐ, ๋กœ๋“œ๋ฐธ๋Ÿฐ์„œ์— ๋น„ํ•˜๋ฉด ๊ธฐ๋Šฅ์ด ์ข€๋” ๋‹ค์–‘ํ•œ ํŽธ์ด๋‹ค.
๊ฒฝ๋กœ๋ฅผ ๋‹ค์–‘ํ•˜๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ์„œ๋ฒ„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ๋Š” Rest API ๋ชจ๋“œ๋ฅผ ์ฃผ๋กœ ๋‹ค๋ฃฌ๋‹ค.
Websocket ๋ชจ๋“œ์— ๋Œ€ํ•ด์„œ๋Š” ์•„๋ž˜ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
https://blog.naver.com/sssang97?Redirect=Log&logNo=222923857318&from=postView

์•„ํ‚คํ…์ณ ํŒจํ„ด์œผ๋กœ์„œ์˜ API Gateway๋Š” ๋‹ค์Œ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
https://blog.naver.com/sssang97/223042627693




๋น„์šฉ

์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ๋น„์šฉ์„ ๋ถ€๊ณผํ•˜๋Š” ์„œ๋ฒ„๋ฆฌ์Šค ์„œ๋น„์Šค๋‹ค.
HTTP ๋ชจ๋“œ๋Š” ๋”ฑ ์‚ฌ์šฉํ•œ ๋งŒํผ๋งŒ ๋น„์šฉ์„ ๋‚ด๊ณ , REST API ๋ชจ๋“œ๋Š” ๊ฑฐ๊ธฐ์— ๋”ํ•ด ์บ์‹ฑ ์‹œ๊ฐ„๋‹น ๋น„์šฉ์ด ์กฐ๊ธˆ ์ถ”๊ฐ€๋œ๋‹ค.
https://aws.amazon.com/ko/api-gateway/pricing/

HTTP API๋Š” ์ด๋ ‡๊ฒŒ ์š”์ฒญ ๋‹จ์œ„๋กœ๋งŒ ์š”๊ธˆ์„ ๋ฌผ๊ณ 

Reist API์€ ์ด๊ฑด ์บ์‹œ๊ฐ€ ๋– ์žˆ๋Š” ์‹œ๊ฐ„ ๋‹จ์œ„๋กœ๋„ ์š”๊ธˆ์„ ๋‚ธ๋‹ค.




ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ

์ผ๋ฐ˜ ์›๋ณธ ์„œ๋ฒ„๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งˆ๋ จํ•ด๋†จ๋‹ค.

์ด๋Ÿฐ๊ฒŒ ์žˆ๋‹ค.




๊ฒŒ์ดํŠธ์›จ์ด ๋งŒ๋“ค๊ธฐ

๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋ฅผ ๊ตฌํ˜„ํ•ด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋‚˜๋Š” ์ด๋ฏธ ์กด์žฌํ•˜๋˜ Lambda Function URL ๊ธฐ๋ฐ˜์˜ ์„œ๋ฒ„๋ฅผ API Gateway๋กœ ํ”„๋ก์‹ฑํ•˜๋ ค๊ณ  ํ•œ๋‹ค.
์ด๋ฅผ ํ†ตํ•ด rate limit๊ณผ ๋„๋ฉ”์ธ ์—ฐ๋™ ๋“ฑ์„ ๋‹ฌ์„ฑํ•˜๋ ค๋Š”๊ฒŒ ๋ชฉ์ ์ด๋‹ค.

์šฐ์„  ๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๋งŒ๋“ ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ์‚ฌ๋ก€์—์„œ๋Š” ์„ธ๋ฒˆ์งธ์˜ Rest API๊ฐ€ ๊ฐ€์žฅ ์ ์ ˆํ•œ ํŽธ์ด๋‹ค.

๊ณ ๋ฅด๊ณ 

์ด๋ฆ„ ์ง“๊ณ , ์ ์ ˆํžˆ ๋งŒ๋“ค์–ด์ค€๋‹ค.

๊ทธ๋ž˜์„œ ์ด๋Ÿฐ์‹์œผ๋กœ ๋œจ๋ฉด ์„ฑ๊ณต์ด๋‹ค.




๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

๊ฒŒ์ดํŠธ์›จ์ด๋ฅผ ๋ง‰ ์ƒ์„ฑํ•œ ์ฐธ์ด๋ผ๋ฉด, ์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฒŒ ์•„๋ฌด๊ฒƒ๋„ ์—†๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ์—†์„ ๊ฒƒ์ด๋‹ค.
๊ฐ€์žฅ ๋จผ์ € "๋ฆฌ์†Œ์Šค" ๋‹จ์œ„๋ฅผ ์ถ”๊ฐ€ํ•ด์ค˜์•ผ ๋‹ค๋ฅธ ์„œ๋ฒ„๋ฅผ ํ”„๋ก์‹ฑํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‚˜๋Š” ๊ธฐ์กด์— ์กด์žฌํ•˜๋˜ ์„œ๋ฒ„๋ฅผ "api/v1" ๊ฒฝ๋กœ์˜ ํ•˜์œ„ URI๋กœ ๋งคํ•‘ํ•˜๊ณ  ์‹ถ๋‹ค.
ํ•œ๋ฒˆ ํ•ด๋ณด๊ฒ ๋‹ค.

"๋ฆฌ์†Œ์Šค ์ƒ์„ฑ"์„ ๋ˆ„๋ฅด๊ณ 

๋จผ์ € ์ƒ์œ„ URI์ธ api๋ฅผ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ทธ ์•„๋ž˜์— ๋˜ v1์„ ์ƒ์„ฑํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์™€์ผ๋“œํŒจํ„ด์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด "proxy" ๋ฆฌ์†Œ์Šค๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ํ•ด์•ผ "/api/v1"๋กœ ์‹œ์ž‘ํ•˜๋Š” ๋ชจ๋“  ํŒจํ„ด์„ ๋งค์นญ์‹œ์ผœ์ค„ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ANY ๋ฉ”์„œ๋“œ๊ฐ€ ์ž๋™์œผ๋กœ ์ƒ๊ธธํ…๋ฐ

์ €๊ธฐ๋‹ค๊ฐ€ ํ”„๋ก์‹ฑํ•  ์›๋ณธ ์„œ๋ฒ„์˜ ๊ฒฝ๋กœ๋ฅผ
"https://๋„๋ฉ”์ธ/{proxy}"์˜ ํ˜•ํƒœ๋กœ ๋„ฃ์–ด์ค€๋‹ค.
์—ฌ๊ธฐ์„œ๋Š” HTTP ํ”„๋ก์‹œ ํƒ€์ž…์œผ๋กœ ํ•ด์„œ URL์„ ๊ทธ๋Œ€๋กœ ๋„ฃ์—ˆ๋Š”๋ฐ, Lambda๋ฅผ ๋ฐ”๋กœ ๊ฐ€๋ฆฌํ‚ค๊ฒŒ ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ๋ž˜์„œ Lambda ๊ธฐ๋ฐ˜์œผ๋กœ ์„œ๋ฒ„๋ฆฌ์Šค ์„œ๋ฒ„๋ฅผ ์šด์šฉํ• ๋•Œ ์ €๊ฑธ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ €๊ฒŒ ๋์ด ์•„๋‹ˆ๋‹ค.
"https://๋„๋ฉ”์ธ/{proxy}" ํ˜•ํƒœ์˜ ํ”„๋ก์‹œ ๋ฆฌ์†Œ์Šค๋Š” "https://๋„๋ฉ”์ธ/foo"๋‚˜ "https://๋„๋ฉ”์ธ/bar" ๊ฐ™์€ ๊ฒƒ์—๋Š” ๋งค์นญ์ด ์ž˜ ๋˜๋Š”๋ฐ, "https://๋„๋ฉ”์ธ/" ๊ฐ™์€ ๋ฃจํŠธ URI์—๋Š” ๋งค์นญ๋˜์ง€ ์•Š๋Š”๋‹ค.
๊ทธ๋ž˜์„œ ์ƒ์œ„ ๋ ˆ๋ฒจ์— ๋ฉ”์„œ๋“œ๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ด๋ฒˆ์—๋Š” ์—”๋“œํฌ์ธํŠธ๋ฅผ ์ €๋ ‡๊ฒŒ "https://๋„๋ฉ”์ธ"์œผ๋กœ๋งŒ ๋„ฃ์–ด์คฌ๋‹ค.


๋๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ ํ•˜๋‚˜์˜ ๊ฒŒ์ดํŠธ์›จ์ด์— ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์„œ๋ฒ„์˜ API๋ฅผ ๋ผ์šฐํŒ…ํ•  ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋ž˜์„œ MSA์—์„œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ค‘์‹ฌ์ถ• ์ค‘ ํ•˜๋‚˜์ด๊ธฐ๋„ ํ•˜๋‹ค. ์„œ๋ฒ„๋ฅผ ์ž˜๊ฒŒ์ž˜๊ฒŒ ์ฐ์–ด์„œ ๊ฒŒ์ดํŠธ์›จ์ด์— ๋ฌผ๋ฆด ์ˆ˜๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




API ๋ฐฐํฌํ•˜๊ธฐ: Stage ๋งŒ๋“ค๊ธฐ

์ €๊ธฐ์„œ ๋ฆฌ์†Œ์Šค๋ฅผ ์ˆ˜์ •ํ•˜๋Š”๊ฑด ์‚ฌ์‹ค ๊ทธ๋ƒฅ ๊ฐœ๋ฐœ์šฉ ํŽธ์ง‘์ฐฝ์ผ ๋ฟ์ด๊ณ , "์Šคํ…Œ์ด์ง€" ๋‹จ์œ„๋กœ ๋ฐฐํฌ๋ฅผ ํ•ด์•ผ ์‹ค์งˆ์ ์ธ ๊ธฐ๋Šฅ์„ ํ•˜๊ธฐ ์‹œ์ž‘ํ•œ๋‹ค.

API ๋ฐฐํฌ๋ฅผ ๋ˆ„๋ฅด๊ณ 


์Šคํ…Œ์ด์ง€ ์ด๋ฆ„์„ ์ ์ ˆํžˆ ๊ณจ๋ผ ๋ฐฐํฌํ•œ๋‹ค.


๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋ฐฐํฌ ์Šคํ…Œ์ด์ง€๊ฐ€ ๋œจ๊ณ 


์ƒ์„ฑ๋œ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋™์ž‘๋„ ํ™•์ธํ•ด๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋‹ค.




๋„๋ฉ”์ธ ๋‹ฌ๊ธฐ

๋„๋ฉ”์ธ ์—ฐ๋™์€ ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
https://blog.naver.com/sssang97/222883393010




canary ๋ฐฐํฌ

API Gateway๋Š” ์•ˆ์ •์ ์ธ ๋ฐฐํฌ๋ฅผ ์œ„ํ•ด canary ๋ฐฐํฌ ์ „๋žต์„ ์ œ๊ณตํ•œ๋‹ค.

๋งŒ์•ฝ API gateway ๋‹จ์œ„์˜ ๋ณ€๊ฒฝ์ด ์ƒ๊ฒจ์„œ ํŠน์ • API๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ์„œ๋ฒ„๋ฅผ ๋ฐ”๊พธ๊ณ  state ๋ฐฐํฌ๋ฅผ ํ•ด์•ผํ•˜๋Š”๋ฐ, ๋ณ€๊ฒฝ์‚ฌํ•ญ์œผ๋กœ ์ธํ•ด์„œ ๊ณผ๋ถ€ํ•˜๋กœ ๋ป—์ง€ ์•Š์„๊นŒ, ์•„๋‹ˆ๋ฉด ์˜ค๋ฅ˜๊ฐ€ ํ„ฐ์ง€์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ๋‹ค.
canary๋Š” ๊ทธ๋Ÿฐ ์Šคํ…Œ์ด์ง€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ์•ˆ์ •์ ์œผ๋กœ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ๋„๊ตฌ๋‹ค.

๋จผ์ € ์Šคํ…Œ์ด์ง€์˜ canary ํƒญ์—์„œ canary ์„ค์ •์„ ํ™œ์„ฑํ™”ํ•œ๋‹ค.

์ด๋ ‡๊ฒŒ ๋œจ๋ฉด ๋œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์Šคํ…Œ์ด์ง€ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋ฐฐํฌํ•˜๋ฉด ๋˜๋Š”๋ฐ

๊ทธ๋Ÿผ ์ด์ œ ์ด๋Ÿฐ์‹์œผ๋กœ canary๋ผ๊ณ  ๋œฐ ๊ฒƒ์ด๋‹ค .

canary๋ฅผ ์ผฐ๊ธฐ ๋•Œ๋ฌธ์—, ์Šคํ…Œ์ด์ง€๋ฅผ ์ƒˆ๋กœ ๋ฐฐํฌํ•˜๋”๋ผ๋„ ์‹ค์ œ ์Šคํ…Œ์ด์ง€์— ๋ฐ”๋กœ ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
๋Œ€์‹  canary ๋ฒ„์ „์—๋งŒ ๋ฐฐํฌ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ €๊ธฐ์„œ

canary๋กœ ๋ชฐ๋ฆฌ๋Š” ํŠธ๋ž˜ํ”ฝ์„ ์กฐ๊ธˆ์”ฉ ๋Š˜๋ ค๋ณด๋ฉด์„œ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•ด๋ณด๊ณ ,

๋ฌธ์ œ์—†๋‹ค๋ฉด canary๋ฅผ ๋๋‚ด๋ฉด ๋œ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์™„์ „ํžˆ ์ ์šฉ์ด ๋๋‚  ๊ฒƒ์ด๋‹ค.




Rate Limit ๊ฑธ๊ธฐ

API Gateway๋Š” ์ž์ฒด์ ์œผ๋กœ API์— ๋Œ€ํ•œ Rate limit ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

์ด๊ฑด ๋ชจ๋“  ์‚ฌ์šฉ์ž์— ๋Œ€ํ•ด ์ „์—ญ์ ์œผ๋กœ ๋™์ž‘ํ•˜๊ณ , ์š”์ฒญ์ž์˜ IP๋ณ„๋กœ rate limit์„ ๊ฑฐ๋Š”๊ฑด ๋”ฐ๋กœ ์—†๋‹ค.
๊ทธ๋Ÿฐ๊ฑธ ์›ํ•œ๋‹ค๋ฉด WAF๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค.

rate limit์€ ๊ฒŒ์ดํŠธ์›จ์ด ์ „์ฒด์— ๋Œ€ํ•ด์„œ ๊ฑธ ์ˆ˜๋„ ์žˆ๊ณ 

ํŠน์ • API ๋‹จ์œ„๋กœ๋„ ๊ฑธ ์ˆ˜ ์žˆ๋‹ค.

์—ฌ๊ธฐ์„œ ๋ฒ„์ŠคํŠธ๋Š” ๋™์‹œ์— ๋ณ‘๋ ฌ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ๋„๊ณ , ์š”์œจ(rate)์€ ์ดˆ๋‹น ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€์น˜๋‹ค.

๋งŒ์•ฝ /health API์— ๋Œ€ํ•ด์„œ๋งŒ rate limit์„ ๋นก์„ธ๊ฒŒ ๊ฑธ๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋Ÿฐ์‹์œผ๋กœ ํ•ด๋ณผ ์ˆ˜ ์žˆ๋‹ค.
๋ฆฌ์†Œ์Šค์™€ ๋ฉ”์„œ๋“œ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ถ”๊ฐ€ํ•œ ๋’ค์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๊ฑธ๋ฉด ๋œ๋‹ค.

์ด๋Ÿฌ๋ฉด 1์ดˆ์— 2๊ฐœ์”ฉ๋งŒ ๋ฐ›์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.

๊ทธ๋ž˜์„œ 1์ดˆ์— 2๋ฒˆ์„ ์ดˆ๊ณผํ•˜๊ฒŒ ๋ฌด์‹ํ•˜๊ฒŒ ์ ‘์†์„ ๋ฐ˜๋ณตํ•ด๋ณด๋ฉด

์ผ์‹œ์ ์œผ๋กœ ์ฐจ๋‹จ์„ ๋จน์ผ ๊ฒƒ์ด๋‹ค.



๋กœ๊ทธ ๊ตฌ์„ฑํ•˜๊ธฐ






๋ฌธ์„œํ™”

์™„์ „ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ, API Gateway๋Š” Swagger์˜ import/export ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค.

๋‚˜๋Š” ๋ฆฌ์†Œ์Šค ์ •์˜๋ฅผ ํ”„๋ก์‹œ๋กœ ๋•Œ๋ ค๋ฐ•์•„์„œ ์“ธ๋งŒํ•œ ๊ตฌ์„ฑ์€ ์•„๋‹ˆ์ง€๋งŒ, ํ•˜๋‚˜ํ•˜๋‚˜ ๋“ฑ๋กํ•œ ๊ฒฝ์šฐ์—๋Š” ์œ ์šฉํ•  ๊ฒƒ ๊ฐ™๋‹ค.




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

API Gateway๋Š” ์ž์ฒด์ ์œผ๋กœ ์ธ์ฆ์— ๋Œ€ํ•œ ๋ถ€๋ถ„๋„ ์ œ์–ด๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.
์ธ์ฆ ์ฒ˜๋ฆฌ์—๋Š” Cognito์™€ Lambda๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์—ฌ๊ธฐ์„œ๋Š” ํ™•์žฅ์„ฑ์ด ๋†’์€ Lambda๋ฅผ ํ™œ์šฉํ•ด์„œ ๊ตฌ์ถ•์„ ํ•ด๋ณด๊ฒ ๋‹ค.

์ด๋Ÿฐ์‹์œผ๋กœ, ์ตœ์ข… ๋ชฉ์ ์ง€ ์„œ๋ฒ„์— ๋„˜๊ธฐ๊ธฐ ์ „์— Lambda๋ฅผ ํ˜ธ์ถœํ•ด์„œ ๋งˆ์ € ์ง„ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

๋จผ์ € ์ € ์šฉ๋„๋กœ ์‚ฌ์šฉํ•  ์ธ์ฆ ํ•จ์ˆ˜๋ฅผ ๊ตฌํ˜„ํ•˜๊ฒ ๋‹ค.

์ด๋ฆ„์€ ์ ๋‹นํžˆ ์ง“๊ณ , ์ฝ”๋“œ๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ˜•ํƒœ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.

export const handler = function(event, context, callback) {
    console.log('Received event:', JSON.stringify(event, null, 2));

    // A simple request-based authorizer example to demonstrate how to use request 
    // parameters to allow or deny a request. In this example, a request is  
    // authorized if the client-supplied headerauth1 header, QueryString1
    // query parameter, and stage variable of StageVar1 all match
    // specified values of 'headerValue1', 'queryValue1', and 'stageValue1',
    // respectively.

    // Retrieve request parameters from the Lambda function input:
    var headers = event.headers;
    var queryStringParameters = event.queryStringParameters;
    var pathParameters = event.pathParameters;
    var stageVariables = event.stageVariables;

    // Parse the input for the parameter values
    var tmp = event.methodArn.split(':');
    var apiGatewayArnTmp = tmp[5].split('/');
    var awsAccountId = tmp[4];
    var region = tmp[3];
    var restApiId = apiGatewayArnTmp[0];
    var stage = apiGatewayArnTmp[1];
    var method = apiGatewayArnTmp[2];
    var resource = '/'; // root resource
    if (apiGatewayArnTmp[3]) {
        resource += apiGatewayArnTmp[3];
    }

    // Perform authorization to return the Allow policy for correct parameters and 
    // the 'Unauthorized' error, otherwise.
    var authResponse = {};
    var condition = {};
    condition.IpAddress = {};

    // ์—ฌ๊ธฐ์„œ ์ธ๊ฐ€ ์—ฌ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•จ!!
    // ์ธ๊ฐ€ ์„ฑ๊ณต
    if (queryStringParameters.key === "q1w2e3r4") {
        callback(null, generateAllow('me', event.methodArn));
    }  
    // ์ธ๊ฐ€ ์‹คํŒจ. 401 ์ƒํƒœ์ฝ”๋“œ ๋ฐ˜ํ™˜
    else {
        callback("Unauthorized");
    }
}

// Help function to generate an IAM policy
var generatePolicy = function(principalId, effect, resource) {
    // Required output:
    var authResponse = {};
    authResponse.principalId = principalId;
    if (effect && resource) {
        var policyDocument = {};
        policyDocument.Version = '2012-10-17'; // default version
        policyDocument.Statement = [];
        var statementOne = {};
        statementOne.Action = 'execute-api:Invoke'; // default action
        statementOne.Effect = effect;
        statementOne.Resource = resource;
        policyDocument.Statement[0] = statementOne;
        authResponse.policyDocument = policyDocument;
    }
    // Optional output with custom properties of the String, Number or Boolean type.
    authResponse.context = {
        "stringKey": "stringval",
        "numberKey": 123,
        "booleanKey": true
    };
    return authResponse;
}

var generateAllow = function(principalId, resource) {
    return generatePolicy(principalId, 'Allow', resource);
}

var generateDeny = function(principalId, resource) {
    return generatePolicy(principalId, 'Deny', resource);
}

์ข€ ๊ธด๋ฐ, ์ค‘๊ฐ„์— ์ด๋ถ€๋ถ„๋งŒ ๋ณด๋ฉด ๋œ๋‹ค.

    // ์—ฌ๊ธฐ์„œ ์ธ๊ฐ€ ์—ฌ๋ถ€๋ฅผ ์ฒ˜๋ฆฌํ•จ!!
    // ์ธ๊ฐ€ ์„ฑ๊ณต
    if (queryStringParameters.key === "q1w2e3r4") {
        callback(null, generateAllow('me', event.methodArn));
    }  
    // ์ธ๊ฐ€ ์‹คํŒจ. 401 ์ƒํƒœ์ฝ”๋“œ ๋ฐ˜ํ™˜
    else {
        callback("Unauthorized");
    }

์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ์— key๋ž€ ๊ฐ’์ด q1w2e3r4์ผ ๋•Œ๋งŒ ํ—ˆ์šฉ์„ ํ•ด์ฃผ๋„๋ก ํ–ˆ๋‹ค.
์˜ˆ์ œ์˜ ๊ฐ„๊ฒฐํ•จ์„ ์œ„ํ•ด์„œ ํ•˜๋“œ์ฝ”๋”ฉ์„ ํ–ˆ์ง€๋งŒ, ์‹ค์ œ๋กœ๋Š” ํ—ค๋”๊ฐ’์„ ์ฃผ๋กœ ์‚ฌ์šฉํ• ํ…Œ๊ณ , ์ €๋Ÿฐ ์ธ์ฆ ๊ด€๋ จ๊ฐ’๋„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋„ฃ๊ณ  ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.

ํ•จ์ˆ˜๋ฅผ ๋ฐฐํฌํ•˜๊ณ , ๋‹ค์‹œ API Gateway๋กœ ๋Œ์•„์™€์„œ "๊ถŒํ•œ ๋ถ€์—ฌ์ž" ํƒญ์œผ๋กœ ์ด๋™, ์ƒ์„ฑ์„ ํ•ด์ค€๋‹ค.

์—ญํ• ์€ ํ•„์š”์—†๊ณ , ํ•จ์ˆ˜๋ฅผ ๊ณ ๋ฅธ๋‹ค.
๊ทธ๋ฆฌ๊ณ  Lambda๋ฅผ ํ˜ธ์ถœํ• ๋•Œ event๋กœ ๋„˜๊ธธ ํ•ญ๋ชฉ์„ ์ •ํ•ด์ค€๋‹ค.
์ด ๊ฒฝ์šฐ์—๋Š” ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ key๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์ž˜ ๋™์ž‘ํ•˜๋Š”์ง€ ํ…Œ์ŠคํŠธํ•ด๋ณธ๋‹ค.

์ด์ƒํ•œ๊ฑธ ๋„ฃ์œผ๋ฉด ํŠ•๊ธฐ๊ณ 


์ž˜ ๋„ฃ์œผ๋ฉด ํ†ต๊ณผ๋˜์–ด์•ผ ํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ์ €๊ฑธ ๋ฆฌ๋กœ์Šค์— ์ ์šฉ๋งŒ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
๋ฆฌ์†Œ์Šค ํŽธ์ง‘์—์„œ ํŠน์ • ๋ฉ”์„œ๋“œ ์ •์˜๋ฅผ ์„ ํƒํ•˜๊ณ  "๋ฉ”์„œ๋“œ ์‹คํ–‰"์œผ๋กœ ์ด๋™

์Šน์ธ์— ๊ทธ๊ฑธ ์ง‘์ด๋„ฃ์–ด์ฃผ๊ณ  ๋ฐฐํฌ๋ฅผ ํ•˜๋ฉด ๋์ด๋‹ค.

๊ทธ๋Ÿฌ๋ฉด

๊ธฐ๋Œ€ํ•œ๋Œ€๋กœ ์ž˜ ๋™์ž‘ํ•  ๊ฒƒ์ด๋‹ค.


์ฐธ์กฐ
https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/set-up-logging.html
https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html