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๋ฅผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์๋ ๋ค์๊ณผ ๊ฐ์
API ๊ฐ๋ฐ์
API๋ฅผ ์์ฑํ๊ณ ๋ฐฐํฌํ์ฌ API Gateway์์ ํ์ํ ๊ธฐ๋ฅ์ ๊ตฌํ
API ๊ฐ๋ฐ์๋ AWS ๊ณ์ ๋ด์์ API๋ฅผ ์์ ํ IAM ์ฌ์ฉ์์ฌ์ผ ํจ
์ฑ ๊ฐ๋ฐ์
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 ์ข
๋ฅ
HTTP API
REST API๋ณด๋ค ๋๊ธฐ ์๊ฐ์ด ์งง๊ณ ๋น์ฉ์ด ์ ๋ ดํ๊ฒ RESTful API๋ฅผ ๊ตฌ์ฑ ๊ฐ๋ฅ
AWS Lambda ํจ์ ๋๋ ๊ณต๊ฐ ๋ผ์ฐํ
์ด ๊ฐ๋ฅํ HTTP ์๋ํฌ์ธํธ์ ์์ฒญ์ ์ ์กํ ์ ์์
HTTP API๋ OpenID Connect ๋ฐ OAuth 2.0 ๊ถํ ๋ถ์ฌ๋ฅผ ์ง์
๋ํ CORS(Cross-Origin Resource Sharing) ๋ฐ ์๋ ๋ฐฐํฌ๊ฐ ๊ธฐ๋ณธ์ ์ผ๋ก ์ง์๋จ
REST API
API Gateway REST API๋ ๋ฆฌ์์ค์ ๋ฉ์๋๋ก ๊ตฌ์ฑ
๋ฆฌ์์ค๋ ์ฑ์ด ๋ฆฌ์์ค ๊ฒฝ๋ก๋ฅผ ํตํด ์ก์ธ์คํ ์ ์๋ ๋
ผ๋ฆฌ์ ์ํฐํฐ
๋ฉ์๋๋ API ์ฌ์ฉ์๊ฐ ์ ์ถํ REST API ์์ฒญ ๋ฐ ์ฌ์ฉ์์๊ฒ ๋ฐํ๋๋ ์๋ต
์ฑ์ ๋ฐฑ์๋์์ ์์ฒญ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ๊ฐ์ ธ์ค๋ ์์น๋ฅผ ์ ํ์๊ฐ ์์ผ๋ฉฐ,
API Gateway REST API์์ ํ๋ฐํธ์๋๋ ๋ฉ์๋ ์์ฒญ ๋ฐ ๋ฉ์๋ ์๋ต์ผ๋ก ์บก์ํ๋๊ณ API๋ integration requests(ํตํฉ ์์ฒญ) ๋ฐ integration responses(ํตํฉ ์๋ต)์ ์ด์ฉํด ๋ฐฑ์๋์ ํต์ ํ๊ฒ ๋จ
ํตํฉ ์๋ต์ ํด๋ผ์ด์ธํธ์ ๋ํ (ํด๋น HTTP ์ํ ์ฝ๋์) ์ ์ ํ ๋ฉ์๋ ์๋ต์ผ๋ก ๋ผ์ฐํ
ํ๋ ค๋ฉด, ํตํฉ์์ ๋ฉ์๋๋ก ํ์ํ ์๋ต ํ๋ผ๋ฏธํฐ๋ฅผ ๋งคํํ๋๋ก ํตํฉ ์๋ต์ ๊ตฌ์ฑํ๋ฉด ๋จ
๊ทธ๋ฐ ๋ค์, ํ์์ ๋ฐ๋ผ ๋ฐฑ์๋์ ์ถ๋ ฅ ๋ฐ์ดํฐ ํ์์ ํ๋ฐํธ์๋์ ํ์์ผ๋ก ๋ณํ
API Gateway๋ฅผ ์ฌ์ฉํ๋ฉด ํ์ด๋ก๋์ ์คํค๋ง๋ ๋ชจ๋ธ์ ์ ์ํ์ฌ ๋ณธ๋ฌธ ๋งคํ ํ
ํ๋ฆฟ์ ์์ฝ๊ฒ ์ค์ ๊ฐ๋ฅ
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 ์์ฒญ ๋ฐ ์๋ต์ ์์ ํ ์ ์ด๊ฐ ๊ฐ๋ฅ
* Amazon Cognito๋ฅผ JWT ๋ฐ๊ธ์๋ก ์ฌ์ฉ
์ฌ์ฉ์ ์ง์ ๋๋ฉ์ธ ์ด๋ฆ
* HTTP API TLS 1.0 ์ง์ ์๋จ
ํด๋ผ์ด์ธํธ ์ธ์ฆ์
Amazon CloudWatch Logs์ ๋ํ ์ก์ธ์ค ๋ก๊ทธ
Amazon Kinesis Data Firehose์ ๋ํ ์ก์ธ์ค ๋ก๊ทธ
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 ๋ฉ์๋์ ๋ณต์กํ ๊ฒฝ๋ก ๋ณ์๊ฐ ์๋ ๋ผ์ฐํ
ํฌ์ฐฉ
ANY ๋ฉ์๋๋ ๋ผ์ฐํ
์ ๋ํด ์ ์ํ์ง ์์ ๋ชจ๋ ๋ฉ์๋์ ์ผ์นํจ. ๋ณต์กํ ๊ฒฝ๋ก ๋ณ์๊ฐ ์๋ ๋ผ์ฐํ
์ $default ๋ผ์ฐํ
๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๊ฒ ๋จ
์ก์ธ์ค ์ ์ด
JWT(JSON Web Token)๋ฅผ OIDC(OpenID Connect) ๋ฐ OAuth 2.0 ํ๋ ์์ํฌ์ ์ผ๋ถ๋ก ์ฌ์ฉํ์ฌ API์ ๋ํ ํด๋ผ์ด์ธํธ ์ก์ธ์ค๋ฅผ ์ ํ
API์ ๊ฒฝ๋ก์ ๋ํด JWT ๊ถํ ๋ถ์ฌ์๋ฅผ ๊ตฌ์ฑํ๋ฉด API Gateway๋ ํด๋ผ์ด์ธํธ๊ฐ API ์์ฒญ๊ณผ ํจ๊ป ์ ์ถํ๋ JWT๋ฅผ ๊ฒ์ฆ
API ์์ฒญ ๊ถํ ๋ถ์ฌ
API Gateway๋ ๋ค์๊ณผ ๊ฐ์ ์ผ๋ฐ ์ํฌํ๋ก์ฐ
ํ ํฐ์ ๋ํ identitySource๋ฅผ ํ์ธ
identitySource์๋ ํ ํฐ๋ง ํฌํจํ๊ฑฐ๋ Bearer ์ ๋์ฌ๊ฐ ๋ถ์ ํ ํฐ๋ง ํฌํจ๋ ์ ์์
๋ฐํ์์ jwks_uri์์ ๊ฐ์ ธ์จ ํผ๋ธ๋ฆญ ํค๋ฅผ ์ฌ์ฉํ์ฌ ํ ํฐ์ ์๊ณ ๋ฆฌ์ฆ๊ณผ ์๋ช
์ ํ์ธ
ํ์ฌ RSA ๊ธฐ๋ฐ ์๊ณ ๋ฆฌ์ฆ๋ง ์ง์
ํด๋ ์์ ๊ฒ์ฆ
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 ํ๋ก์ ํตํฉ ์ง์
HTTP
API ๋ผ์ฐํ
์ ๊ณต๊ฐ์ ์ผ๋ก ๋ผ์ฐํ
ํ ์ ์๋ HTTP ์๋ํฌ์ธํธ์ ์ฐ๊ฒฐํ ์ ์์
API Gateway์ด ํ๋ฐํธ ์๋์ ๋ฐฑ์๋ ์ฌ์ด์ ์ ์ฒด ์์ฒญ ๋ฐ ์๋ต์ ์ ๋ฌ
๊ฒฝ๋ก ๋ณ์์์ HTTP ํ๋ก์ ํตํฉ HTTP API ๋ผ์ฐํ
์์ ๊ฒฝ๋ก ๋ณ์๋ฅผ ์ฌ์ฉ
์) ๋ผ์ฐํ
/pets/{petID}
์ /pets/6
์ ๋ํ ์์ฒญ์ ํฌ์ฐฉ
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¶meter1=value2¶meter2=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๋ฅผ ๋ฐํํ์ง ์์ผ๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ํ๊ฒ ๋จ
content-type = application/json
body์ ํจ์์ ์๋ต
{
"cookies" : ["cookie1", "cookie2"],
"isBase64Encoded": true|false,
"statusCode": httpStatusCode,
"headers": { "headerName": "headerValue", ... },
"body": "Hello from Lambda!"
}
AWS ์๋น์ค
ํด๋ผ์ด์ธํธ๊ฐ ์ผ๋ฅ ํตํฉ(first-class intergration)์ผ๋ก ๋ท๋ฐ์นจ๋๋ ๊ฒฝ๋ก๋ฅผ ํธ์ถํ๋ ๊ฒฝ์ฐ, API Gateway ํธ์ถ์ AWS ์๋น์ค API๋ฅผ ์ ๊ณต
๋งคํ ์์ฒญ ๋งค๊ฐ ๋ณ์
ํค๋ ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํ์ง ์์. API Gateway ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ํค๋ ๊ฐ์ ์ผํ๋ก ๊ฒฐํฉ. "header1": "value1,value2".
$request.querystring.name
์ฟผ๋ฆฌ ๋ฌธ์์ด ์ด๋ฆ์ ๋/์๋ฌธ์๋ฅผ ๊ตฌ๋ถํฉ๋๋ค. API Gateway ์๋ฅผ ๋ค์ด ์ฌ๋ฌ ๊ฐ์ ์ผํ๋ก ๊ฒฐํฉ "querystring1": "Value1,Value2"
์์ฒญ ์์ ๊ฒฝ๋ก ๋งค๊ฐ ๋ณ์์ ๊ฐ. ์) ๊ฒฝ๋ก๊ฐ /pets/{petId}์(๋ฅผ) ๋งคํ๊ฐ๋ฅ. petId ์์ฒญ์ ๋งค๊ฐ ๋ณ์ $request.path.petId.
API Gateway ๋ฅผ ํตํด ์ ์ฒด ์์ฒญ ๋ณธ์ฒด๋ฅผ ์ ๋ฌ
A JSON ๊ฒฝ๋ก ํํ. ์ฌ๋ฐ์ฑ ํ๊ฐ($request.body..name) ๋ฐ ํํฐ ํํ์(?(expression))์(๋ฅผ) ์ง์ํ์ง ์์
์ง์๋๋ ์ปจํ
์คํธ ๋ณ์
$stagevariables.variableName
ํตํฉ ํ์ ์ ํ ์ฐธ์กฐ
* 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
ํ๋ผ์ด๋น
ํ๋ผ์ด๋น ํตํฉ์ ์ฌ์ฉํ๋ฉด VPC์ ํ๋ผ์ด๋น ๋ฆฌ์์ค(์: Application Load Balancer ๋๋ Amazon ECS ์ปจํ
์ด๋ ๊ธฐ๋ฐ ์ ํ๋ฆฌ์ผ์ด์
)์์ API ํตํฉ์ ์์ฑ ๊ฐ๋ฅ ํ๋ผ์ด๋น ํตํฉ์ ์์ฑํ๋ ค๋ฉด ๋จผ์ VPC ๋งํฌ๊ฐ ํ์ํจ
๊ธฐ๋ณธ์ ์ผ๋ก ํ๋ผ์ด๋น ํตํฉ ํธ๋ํฝ์ HTTP ํ๋กํ ์ฝ์ ์ฌ์ฉํ๋ฉฐ, tlsConfig
๋ฅผ ์ง์ ํ์ฌ HTTPS๋ฅผ ์ฌ์ฉํ ์ ์์
Application Load Balancer ๋๋ Network Load Balancer๋ฅผ ์ฌ์ฉ
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 ๊ตฌ์ฑ์์ ๋ค์๊ณผ ๊ฐ์ ๋งค๊ฐ ๋ณ์๋ฅผ ์ง์ ํ ์ ์์
Access-Control-Allow-Origin
Access-Control-Allow-Credentials
Access-Control-Expose-Headers
Access-Control-Allow-Methods
Access-Control-Allow-Headers
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