[FastAPI] 15. FastAPI๋ฅผ Serverless๋ก ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ - Mangum
์ด๋ฒ ํฌ์คํธ์์๋ FastAPI์ Serverless(์๋ฒ๋ฆฌ์ค) ์กฐํฉ์ ๋ํด ์์๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. ์ ๊ฐ ์ด๊ธฐ ์๋ฒ๋ฆฌ์ค๋ฅผ ๋ฐฐ์ ์ ๋๋ AWS์ Lambda๋ผ๋ ์๋น์ค๊ฐ ๋์์ ๋์๋๋ฐ์. ๋น์ ์ฌ์ฉํ ๋๋ ๋ณ๋์ ํ๋ ์์ํฌ ํ์์์ด ํจ์์ ๊ตฌํ๋ง์ผ๋ก API ์๋น์ค๋ฅผ ๋ง๋ค ์ ์๋ Cloud Native(ํด๋ผ์ฐ๋ ๋ค์ดํฐ๋ธ) ๊ฐ๋ฐ ๋ชจ๋ธ์ด์์ต๋๋ค.
Serverless
Serverless(์๋ฒ๋ฆฌ์ค)๋ผ๋ ๋จ์ด๋ฅผ ์ผ๋ฐ์ ์ผ๋ก ํด์ํ๋ฉด '์๋ฒ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ', '์๋ฒ ์๋ ์๋น์ค'๋ผ๋ ๋ป์ด ๋ฉ๋๋ค.
ํ์ง๋ง ์ค์ ๋ก ์๋ฒ๋ฆฌ์ค๋ ์๋ฒ ์์ด ์๋น์ค๋ฅผ ์ด์ํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๊ฒ์ ์๋๋๋ค.
์ค์ ์๋ฒ๋ฆฌ์ค๋ ๊ฐ๋ฐ์๊ฐ ๋ณ๋๋ก ์๋ฒ ๊ด๋ฆฌ๋ผ๋ ๋น์ฉ์์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ๊ณ ์คํํ ์ ์๋๋ก ํ๋ ๊ฐ๋ฐ ๋ชจ๋ธ๋ก์จ ๋ํ์ ์ผ๋ก ์๋์ ํด๋ผ์ฐ๋ ๋ฒค๋ ์๋น์ค๊ฐ ์์ต๋๋ค.
- AWS Lambda
- AWS Fargate
- GCP Functions
์ค์ ๋ก ์ฐ๋ฆฌ๋ API ์ ํ๋ฆฌ์ผ์ด์ ํ๋๋ฅผ ๋ฐฐํฌํ๊ธฐ ์ํด ์ปดํจํ ํ๊ฒฝ ๊ตฌ์ถ(k8s), ๋คํธ์ํฌ ํ๊ฒฝ ๊ตฌ์ถ(istio, gateway) ๋ฑ์ ์๋์ผ๋ก ์งํํด์ผ ํฉ๋๋ค. ํ์ง๋ง Serverless๋ ์ด๋ฌํ ๋ฆฌ์์ค ๊ตฌ์ถ ๋น์ฉ์ ๋ค์ด์ง ์๊ณ ๋ API ์ฝ๋๋ง ๊ฐ์ง๊ณ ์๋ค๋ฉด ์ผ๋ง๋ ์ง API ์๋น์ค๋ฅผ ๋ฐฐํฌํ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ฌ์ฉํ ์ ์๋ ๋ํ์ ์ธ ๋ฐฉ๋ฒ์๋ AWS ECS + AWS Fargate ์กฐํฉ์ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ๋ฐฐํฌ ๋ฐฉ์(CaaS) ์๋ฒ๋ฆฌ์ค์ AWS Lambda + AWS API Gateway ์กฐํฉ์ ์ฝ๋ ๋ฒ ์ด์ค ๋ฐฐํฌ ๋ฐฉ์(FaaS) ์๋ฒ๋ฆฌ์ค๊ฐ ์์ต๋๋ค.
Mangum
์ด๋ฒ ๊ธ์์๋ ์ฝ๋ ๋ฒ ์ด์ค ๋ฐฐํฌ ๋ฐฉ์์ธ AWS Lambda + AWS API Gateway ์กฐํฉ์ผ๋ก FastAPI ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐฐํฌํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ณด๊ฒ ์ต๋๋ค.
Mangum์ AWS API Gateway์์ AWS Lambda์ Python ASGI Application Framework์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ๊ฐ๋ฐ๋ ์ด๋ํฐ๋ก Starlette์ FastAPI ํธํ์ฑ์ด ์ข์ ๋ ์์ ๋๋ค.
https://github.com/jordaneremieff/mangum
์ฐ๋ฆฌ๋ FastAPI + Mangum ์กฐํฉ์ผ๋ก ์ฝ๋ ๋ฐฐํฌ ๋ฐฉ์ ์๋ฒ๋ฆฌ์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํด๋ณด๊ณ ์ ํฉ๋๋ค.
Create Project
๋จผ์ FastAPI ํ๋ก์ ํธ๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์๋์ ๋น๋ ๋๊ตฌ์ ํจํค์ง ๊ด๋ฆฌ ๋๊ตฌ ๋ฑ์ ์ฌ์ฉํ ๊ฒ์ ๋๋ค.
- Poetry
- Virtualenv
- PyCharm
์ด ๊ธ์์๋ PyCharm์ ์ด์ฉํด FastAPI ํ๋ก์ ํธ๋ฅผ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
New Project๋ฅผ ํด๋ฆญํ ํ ์ผ์ชฝ ์ฌ์ด๋๋ฐ์์ FastAPI๋ฅผ ํด๋ฆญํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ Poetry ํ๊ฒฝ์ Python ๋ฒ์ ์ 3.9 ๋ฒ์ ์ ์ฌ์ฉํ๋๋ก ํ๊ฒ ์ต๋๋ค.
๊ทธ๋ฐ ๋ค์ pyproject.toml ํ์ผ์ ์ด๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก uvicorn๊ณผ fastapi ํจํค์ง๊ฐ ์ค์น๋์ด ์๋ ๊ฒ์ ๋ณด์ค ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ Mangum์ ์ถ๊ฐํ ๊ฒ์ ๋๋ค.
$ poetry add mangum
poetry shell์์ ์ ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๋ฉด mangum ํจํค์ง๊ฐ ์ค์น๋ฉ๋๋ค.
Create API
๋ค์์ Serverless(์๋ฒ๋ฆฌ์ค)์ ์ฌ์ฉํ API๋ฅผ ๋ง๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. ์ด๋ฅผ ์ํด ํ๋ก์ ํธ ๊ตฌ์กฐ๋ฅผ ์๋์ ๊ฐ์ด ๊ตฌ์ถํ ๊ฒ์ ๋๋ค.
์์ ํจํค์ง ์ด๋ฆ์ผ๋ก api๋ฅผ ํ ๋ค์ order.py๋ผ๋ ํ์ผ์ ๋ง๋ค์ด์ค๋๋ค. ์ฐ๋ฆฌ๋ Mock Order API๋ฅผ ๋ง๋ค์ด๋ณผ ๊ฒ์ ๋๋ค.
์ค์ ๋ก ์ฐ๋ฆฌ๋ AWS ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์์ API๊ฐ ์ ํธ์ถ๋๋์ง๋ง์ ๋ณด๊ธฐ ์ํ ๊ฒ์ด๋ฏ๋ก ๊ฐ๋จํ JSON ๊ฐ๋ง์ ๋ฐํํ๋ API๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค.
๊ธฐ๋ณธ์ผ๋ก ๋ง๋ค์ด์ก๋ main.py๋ฅผ ์์ ๊ฐ์ด ์์ ํ์ฌ healthcheck API๋ฅผ ๋ง๋ค๊ณ , ์์ ๋ง๋ Order API๋ฅผ api prefix router ๋ด์ ์ถ๊ฐํด์ค๋๋ค.
๊ทธ๋ฐ ๋ค์, Mangum ์ธ์คํด์ค์ FastAPI app์ ์ฃผ์ ํด์ค๋๋ค.
๋จผ์ uvicorn์ ์ด์ฉํด ๋ก์ปฌ์์ API ์๋ฒ๊ฐ ์ ๋์ํ๋์ง ํ์ธํฉ๋๋ค.
Swagger์ ์ ์ํ์ฌ ์ค์ ๋ก API๊ฐ ์๋ํ๋๋ก ๋ฐํํ๋์ง ํ์ธํด์ค์๋ค.
AWS Serverless ํ๊ฒฝ ๋ง๋ค๊ธฐ
์ ์ด์ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋ ์์ฑ์ ๋ชจ๋ ๋๋ฌ์ต๋๋ค. ์ด์ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ฝ๋๋ฅผ ์ ๋ก๋ํ๋ฉด ๋ฐ๋ก ์๋ฒ๊ฐ ๋ฐฐํฌ๋ ์ ์๋๋ก AWS ํ๊ฒฝ์ ๋ง๋ค์ด์ผ ํ๋๋ฐ์. ์ฌ๊ธฐ์ ํ์ํ ํ๊ฒฝ์ ์๋์ ๊ฐ์ต๋๋ค.
- AWS Lambda
- AWS API Gateway
์ด๋ ๊ฒ ๋ ๊ฐ์ง๊ฐ ํ์ํ๋ฐ, AWS Lambda๋ ์ฐ๋ฆฌ๊ฐ ์์ฑํ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ์ฌ๋ฆฌ๋ ๊ณณ์ด๊ณ , API Gateway๋ AWS์์ SaaS ํ๊ฒฝ์ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํ๊ธฐ ์ํ ๊ณณ์ ๋๋ค.
์ฐ๋ฆฌ๋ ๋จผ์ Lambda์ ๋ค์ด๊ฐ์ ์ฝ๋๋ฅผ ์ ๋ก๋ ํ๋๋ก ํ๊ฒ ์ต๋๋ค.
ํจ์ ์ด๋ฆ์ ์ ๋ ฅํ๊ณ , Runtime ํ๊ฒฝ์ ์๊น ๋ง์ท๋ Python 3.9๋ก ๋ง์ถฐ์ฃผ๋๋ก ํฉ๋๋ค.
๊ทธ๋ฐ ๋ค์, Create function์ ํด๋ฆญํด ํจ์๋ฅผ ์์ฑํฉ๋๋ค.
ํจ์๋ฅผ ์์ฑํ์ผ๋ฉด ์ต์๋จ์ ํจ์ ์์ฑ์ ์ฑ๊ณตํ๋ค๋ ๋ฉ์์ง๊ฐ ๋ฑ์ฅํฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๋ ์ฝ๋๋ฅผ ์ ๋ก๋ํ๊ธฐ ์ํด ์๊น ๋ง๋ค์ด๋๋ API ์ฝ๋๋ฅผ zip ํ์ผ๋ก ์์ถ์ํค๋๋ก ํ๊ฒ ์ต๋๋ค.
OS X ํน์ Linux ์ด์์ฒด์ ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ ๋ค๋ฉด ์ ํ๋ฉด์ ๋์จ ๊ฒ์ฒ๋ผ zip ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ ํ๋ก์ ํธ์ ๋ชจ๋ ํ์ผ์ zip์ผ๋ก ์์ถํ ์ ์์ต๋๋ค. Windows ์ด์์ฒด์ ๋ฅผ ์ฌ์ฉํ๊ณ ๊ณ์ ๋ค๋ฉด ๋ฐ๋์ง ๋ฑ์ ์ ํธ๋ฆฌํฐ๋ฅผ ์ด์ฉํ์ ์ ์์ถ์ ์งํํ์๋ฉด ๋ฉ๋๋ค.
์์ถ์ด ๋ชจ๋ ๋๋ฌ๋ค๋ฉด Lambda ํจ์ ํ์ด์ง์์ Upload From ๋ฒํผ์ ํด๋ฆญํ ๋ค, .zip file์ ๋๋ฌ ์์ถํ ํ์ผ์ ์ ๋ก๋ ํด์ค๋๋ค.
๊ทธ๋ฌ๋ฉด ์๊น ๋ง๋ค์ด๋๋ ์ฝ๋๋ค์ด aws lambda ๋ด๋ก ์ ๋ก๋ ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์ด์ API๊ฐ ์ ๋์ํ๋์ง๋ฅผ ํ ์คํธ ํด๋ณด๋๋ก ํ์ฃ . Test ๋ฒํผ ์ค๋ฅธ์ชฝ์ ์๋ ํ์ดํ ์์ด์ฝ์ ํด๋ฆญํด ํ ์คํธ ํ๊ฒฝ์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
Create new event๋ฅผ ์ ํํ์๊ณ , ์ ๋นํ ์ด๋ฒคํธ ์ด๋ฆ์ ์ง์ ํ ๋ค์, Template์ ํด๋ฆญํ์ฌ API Gateway AWS Proxy ํ ํ๋ฆฟ์ ๋ง๋ค์ด์ค๋๋ค.
๊ทธ๋ผ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋๋ฐ์. ์ฌ๊ธฐ์ ๋งจ ์์ชฝ์ ์๋ path๋ฅผ ์ฐ๋ฆฌ๊ฐ ํ ์คํธํ๊ณ ์ ํ๋ URI๋ฅผ ๋ฃ์ต๋๋ค. ์ฌ๊ธฐ์๋ /healthcheck ์๋ํฌ์ธํธ๋ฅผ ํ ์คํธํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค. method๊ฐ GET์ด๋ฏ๋ก method๋ GET์ผ๋ก ์ง์ ํด์ค๋๋ค.
๋ง์ง๋ง์ผ๋ก Runtime settings์์ Edit ๋ฒํผ์ ํด๋ฆญํด Handler ํจ์๋ฅผ lambda_function.py ํ์ผ์ด ์๋ main.py์ ์๋ handler ๊ฐ์ฒด๋ก ๋ฐ๊ฟ์ฃผ์๋ฉด ๋ฉ๋๋ค.
์ ์ด์ Test ๋ฒํผ์ ํด๋ฆญํด๋ณด๋ฉด...
์ด๋ผ...? fastapi ๋ชจ๋์ ์ฐพ์ ์ ์๋ค๋ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ณผ ์ ์์ ๊ฒ์ ๋๋ค.
์ฐ๋ฆฌ๋ ์์ฑํ ์ฝ๋๋ง ๋ฃ์ด์คฌ๊ณ , ๋ชจ๋ ์์น๋ฅผ ์ง์ ํด์ฃผ์ง๋ ์์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก Python์์๋ ํ์ฌ ๊ฒฝ๋ก๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ชจ๋์ ์ฐพ๊ธฐ ๋๋ฌธ์ ์ฐ๋ฆฌ๊ฐ ์์ถ์ ํ๊ธฐ ์ ๋ชจ๋๋ค์ ํด๋น ์์น์ ๋ฃ์ด๋ ๋ค์ ์์ถ์ ํ๋ฉด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
ํ์ง๋ง ๊ทธ๋ ๊ฒ ํ๊ฒ ๋๋ฉด ์ ๋ก๋ ์ฉ๋์ด ๋ง์ด ์ปค์ ธ Lambda ์๋ํฐ์์ ์ฝ๋๋ฅผ ์ฆ์์ผ๋ก ์์ ํ ์๊ฐ ์๋ ๋ถํธํจ์ด ์๊ธฐ๋๋ฐ์. ์ด๋ด ๋๋ Lambda Layer๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์์ต๋๋ค.
AWS Lambda ๋ฉ์ธ ํ์ด์ง๋ก ๋์ด์ ์ผ์ชฝ ์ฌ์ด๋๋ฐ๋ฅผ ๋ณด๋ฉด, Layers๋ผ๋ ํญ๋ชฉ์ ๋ณด์ค ์ ์์ต๋๋ค. ๋ค์ด๊ฐ์ ํ Create Layer ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
Layer ์ด๋ฆ์ ์ ๋ ฅํ๋ฉด .zip ํ์ผ์ ์ ๋ก๋ํ ์ ์๋ ๊ตฌ๊ฐ์ด ๋์ต๋๋ค. ์ด์ PyCharm์ผ๋ก ๋์ด๊ฐ์ ๋ค์ด๋ก๋ ๋ฐ์๋ ๋ชจ๋๋ค์ ์์ถํด ๋ฃ์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
$ cd "`poetry env info -p`"/lib/python3.9
์ฐ๋ฆฌ๋ Python 3.9 ๋ฒ์ ์ ์ฌ์ฉํ์ผ๋ฏ๋ก lib/pythpn3.9 ๊ฒฝ๋ก๋ก ๋ค์ด๊ฐ๋ฉด ๋๊ฒ ์ต๋๋ค. ๋ํ Poetry๋ฅผ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ poetry ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ virtualenv ๊ฒฝ๋ก๋ฅผ ์ฝ๊ฒ ์ ์ํ ์ ์์ต๋๋ค.
AWS Lambda Layers๋ฅผ ๋ง๋ค ๋๋ ์ ํด์ง ํด๋ ์ด๋ฆ์ ์ค์ํด์ผ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ๋ชจ๋์ด ๋ด๊ฒจ์ง ํด๋์ ์ด๋ฆ์ ์๋ ๋งค๋ด์ผ๋๋ก ์งํํด์ผ ํฉ๋๋ค.
https://docs.aws.amazon.com/lambda/latest/dg/configuration-layers.html#configuration-layers-path
AWS ๊ณต์ ๋ฌธ์์ ์ํ๋ฉด Python ํ๊ฒฝ์ ๊ฒฝ์ฐ์๋ python ํด๋๋ฅผ ์์ถ ํ์ผ์ ์ต์์ ๋ฃจํธ ํด๋๋ก ์ง์ ํ๊ณ , ํด๋น ํด๋์ ๋ชจ๋๋ค์ ๋ฃ๋ ๊ฒ์ ๊ถ์ฅํ๊ณ ์์ต๋๋ค.
$ mkdir python && cp -rf site-packages/* ./python
๋ฐ๋ผ์ python ํด๋๋ฅผ ๋จผ์ ์์ฑํด ์ค ๋ค์, site-packages ๋ด์ ์๋ ๋ชจ๋๋ค์ python ํด๋๋ก ๋ณต์ฌํด์ค๋๋ค.
$ zip -r fastapi-serverless.zip python/
๊ทธ๋ฐ ๋ค์ zip ๋ช ๋ น์ด๋ฅผ ์ด์ฉํด์ python ๋๋ ํฐ๋ฆฌ์ ์๋ ๋ชจ๋ ๋ชจ๋๋ค์ zip์ผ๋ก ์์ถํฉ๋๋ค.
์ด๋ ๊ฒ ํด์ ๋ง๋ค์ด์ง ์์ถ ํ์ผ์ ์์ Create Layer์ ์๋ Upload File ๋ฒํผ์ ํตํด ์ ๋ก๋ ์์ผ์ค๋๋ค.
๊ทธ๋ฐ ๋ค์ Compatible runtimes๋ฅผ Python 3.9 ๋ฒ์ ์ผ๋ก ๋ง์ถฐ์ค๋๋ค.
์ ๋ก๋์ ์ฑ๊ณตํ์ผ๋ฉด ์ด๋ ๊ฒ Layer๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ฑ๋์๋ค๋ ๋ฉ์์ง์ ํจ๊ป Version 1์ด ์ถ๊ฐ๋ฉ๋๋ค.
๋ค์ Lambda์ Functions๋ก ๋์ด๊ฐ๋ฉด ๋งจ ์๋์ชฝ์ Layers๋ผ๋ ํญ๋ชฉ์ด ๋ณด์ ๋๋ค. ์ฌ๊ธฐ์ Add a layer๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ฐ๋ฆฌ๋ fastapi-serverless๋ฅผ ์ํ Layer๋ฅผ ๋ณ๋๋ก ๋ง๋ค์์ผ๋ฏ๋ก Custom layers๋ฅผ ํด๋ฆญํด ์๊น ๋ง๋ค์๋ Custom Layers๋ฅผ ์ ํํ ๋ค์ Add๋ฅผ ํด๋ฆญํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ์์์ ๋ง๋ค์๋ fastapi-serverless๋ผ๋ ์ด๋ฆ์ layer๊ฐ ์ถ๊ฐ๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค.
์ ์ด์ Test ๋ฒํผ์ ํด๋ฆญํ๋ฉด... ์ ํ๋ฉด์ฒ๋ผ 200 ์ฝ๋์ ํจ๊ป healthcheck api ์ฝ๋๋ก ์ ์ํ ๊ฒ์ฒ๋ผ message: OK๊ฐ ๋์ค๋ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ์ฑ๊ณต์ ์ผ๋ก ๋์ํ๋ ๊ฒ์ ํ์ธํ์ผ๋ฏ๋ก Deploy ๋ฒํผ๊น์ง ํด๋ฆญํด์ฃผ๋ฉด Lambda ํจ์ ์ ๋ก๋๋ ๋ชจ๋ ๋๋ฉ๋๋ค.
์ด์ ์ฐ๋ฆฌ๊ฐ ๋ง๋ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋๋ฅผ ํน์ API Gateway์ ์ฐ๊ฒฐํด ์ธ๋ถ์์ ํธ์ถํ ์ ์๋๋ก ์ฐ๊ฒฐํด์ฃผ๋ฉด ๋ฉ๋๋ค.
๋จผ์ API Gateway์ ๋ค์ด๊ฐ๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.
Create API๋ฅผ ํด๋ฆญํ๊ฒ ๋๋ฉด ์ ํ๋ฉด์ด ๋ํ๋๋๋ฐ, ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ REST API์ฉ ๊ฒ์ดํธ์จ์ด๋ฅผ ๋ง๋ค ๊ฒ์ ๋๋ค. REST API ํญ๋ชฉ์์ Build๋ฅผ ํด๋ฆญํฉ๋๋ค.
์ ๋นํ API ์ด๋ฆ์ ์ง์ ํ ํ Create API๋ฅผ ํด๋ฆญํฉ๋๋ค.
API๊ฐ ๋ง๋ค์ด์ก์ผ๋ฉด ์๋จ Actions ๋ฒํผ์ ๋๋ฅด๋ฉด ๋ฉ๋ด๊ฐ ๋์ค๋๋ฐ, Create Method๋ฅผ ํด๋ฆญํด ๋ฉ์๋๋ฅผ ์์ฑํฉ๋๋ค.
์ต์์ Path๊ฐ ๋์ค๋ฉด์ ๋ฉ์๋๋ฅผ ์ ํํ ์ ์๋ ๋ชฉ๋ก ๋ฐ์ค๊ฐ ์๊น๋๋ค. ๋ฐ์ค๋ฅผ ๋๋ฅด๋ฉด REST API์ ๊ธฐ๋ณธ ๋ฉ์๋์ธ GET, POST, PUT, PATCH, DELETE, OPTIONS์ ํจ๊ป ์ ์ฒด ๋ฉ์๋์ธ ANY๊ฐ ๋ณด์ ๋๋ค. ์ฐ๋ฆฌ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ฝ๋์ ์๋ ๋ชจ๋ ๋ฉ์๋๋ฅผ ํ ํฌ์ธํธ์ ๋ด์ ๊ฒ์ด๋ฏ๋ก ANY๋ฅผ ์ ํํฉ๋๋ค.
์ด ์๋ํฌ์ธํธ๋ฅผ ํธ์ถํ๋ฉด ์๊น ๊ตฌํํ ์ฝ๋๋ฅผ ์ฝ์ ์ ์๋๋ก ์์ ๊ฐ์ด Lambda Function์ ์ ํํด์ค๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ฐ๋์ ์ด API๋ Lambda Proxy๋ก ๋ถ๋ฌ์ง๋๋ก Use Lambda Proxy Integration์ ์ฒดํฌ ๋ฒํผ์ ํ์ฑํ ํ๋๋ก ํฉ๋๋ค.
์ด๋ ๊ฒ ์์ฑ์ ์๋ํ๊ฒ ๋๋ฉด API Gateway๊ฐ Lambda function์ ์๋ ๋ฆฌ์์ค์ ์ ๊ทผํ๊ธฐ ์ํด ๊ถํ์ ์์ฒญํ๋ ํ๋ฉด์ด ๋์ต๋๋ค. OK ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
ํ์ง๋ง ์ด ์์ ๋ง์ผ๋ก๋ FastAPI๋ก ๋ง๋ ๋ชจ๋ Router๋ฅผ ํธ์ถํ ์๋ ์์ต๋๋ค. ์ด๋ฅผ ์ํด์ API Gateway๊ฐ ์๋ก์ด ์๋ํฌ์ธํธ๋ฅผ ์์ฒญํ์ ๋ ์ด๋ฅผ Lambda ํจ์๋ก ์์ฒญํ ์ ์๋๋ก ๋ฆฌ์์ค๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค.
Actions ๋ฒํผ์ ๋๋ฌ Create Resource๋ฅผ ํด๋ฆญํ๋ฉด ์์ ๊ฐ์ด New Child Resource๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ Configure as proxy resource ๋ฒํผ์ ํ์ฑํ ํ ๋ค์ Create Resource ๋ฒํผ์ ํด๋ฆญํฉ๋๋ค.
์ญ์ Lambda ํจ์๋ฅผ ๋ฃ๊ณ ์ ์ฅํฉ๋๋ค.
API Gateway์ ๋ํ ๋ชจ๋ ์ค์ ์ด ๋๋ฌ์ต๋๋ค. ์ด์ ๋ง์ง๋ง์ผ๋ก ์ด ํ๊ฒฝ์ด ์ธ๋ถ์ ๋ฐฐํฌ๋ ์ ์๋๋ก Actions ๋ฒํผ์ ๋๋ฌ Deploy API๋ฅผ ํด๋ฆญํฉ๋๋ค.
์๋ก์ด ์คํ ์ด์ง๋ฅผ ๋ง๋ค ๊ฒ์ด๋ฏ๋ก Stage name์ v1์ผ๋ก ์ง์ ํ์ฌ version 1 api์์ ๋ช ์ํด์ค ๋ค์ ๋ฐฐํฌ๋ฅผ ์งํํฉ๋๋ค.
๊ทธ๋ฌ๋ฉด ํธ์ถํ ์ ์๋ URL์ด ์๊น๋๋ค. ํด๋น URL์ ์ด์ฉํด ์ ์์ ์๋ํด๋ณด๋ฉด...
์ด๋ ๊ฒ orders API ํธ์ถ์ด ์ฑ๊ณตํ๊ณ ,
healthcheck API๋ ์ ๋์ํ๋ ๋ชจ์ต์ ๋ณผ ์ ์์ต๋๋ค.
๋ง์น๋ฉฐ...
์ฐ๋ค๋ณด๋ ์ด๋ฏธ์ง๊ฐ ์์ฒญ ๋ง์ด ๋ถ์ฌ์ง ๊ธ์ด ๋์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ, ์๋์ ๋ฌ๋ฆฌ AWS์ ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ ๊ตฌ์ถํ๋๋ฐ, ์ฌ์ค์ ์๋ฒ ํ๋๋ฅผ ๋ง๋๋ ๊ฒ๋งํผ ๋๋ ๊ฒ ๊ฐ์๋ฐ์? ๋ผ๋ ๋๋์ ๋ฐ์ผ์ค ์๋ ์์ ๊ฒ์ ๋๋ค.
๋ค์ ํฌ์คํธ์์๋ ์์ FastAPI ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ์ฌ AWS ์๋ฒ๋ฆฌ์ค ํ๊ฒฝ์ Python ์ฝ๋๋ก ๊ตฌ์ถํ๋ ๊ณผ์ ์ ์งํํด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค.