[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

 

GitHub - jordaneremieff/mangum: AWS Lambda support for ASGI applications

AWS Lambda support for ASGI applications. Contribute to jordaneremieff/mangum development by creating an account on GitHub.

github.com

์šฐ๋ฆฌ๋Š” 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

 

Creating and sharing Lambda layers - AWS Lambda

Each time that you call publish-layer-version, you create a new version of the layer.

docs.aws.amazon.com

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 ์ฝ”๋“œ๋กœ ๊ตฌ์ถ•ํ•˜๋Š” ๊ณผ์ •์„ ์ง„ํ–‰ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜์‘ํ˜•
TAGS.

Tistory Comments