將 FastAPI 部署到 AWS API Gateway 教學(配合 Lambda 使用)

本文將教學如何把寫好的 FastAPI 程式碼,配合 AWS Lambda 部署到 API Gateway 上(包含詳細圖文解說 API Gateway 的設定)

前情提要

這篇文章會使用到 AWS Lambda 的函式,若還不清楚怎麼使用的話,推薦可以先看下面這篇文章再回來,如果正在閱讀文章的你已經會使用,那就可以直接往下看囉!

在 AWS Lambda 上使用 Python 第三方套件教學

流程步驟

  1. 建立 API
  2. 設定 API
    • 建立方法
    • 建立資源
  3. 部署 API
  4. 實際呼叫 API 測試

1. 建立 API

首先要確定自己要建立的區域,建議使用比較近的國家地區,例如:東京、大阪、新加坡或香港,因為這將會嚴重影響 API 的速度,我之前誤闖美國東部 Ohio (us-east-2),導致我在 GET / POST 都慢到懷疑人生,所以請先一定要選擇好!

接著就可以進入 AWS API Gateway 的頁面, API 類型選擇「REST API」並點選「建置」,若是第一次在這個國家地區建立 API 的話,會跳出一個教學視窗,大概看一看就可以按確定把它關掉了。

接下來會進入到以下頁面,此時預設可能是「範本 API」,請改成建立「新 API」,並且設定一個「API 名稱」,因為我的 API 是要來收集 cookie 的,所以我命名為 cookie_api,設定完成就可以按「建立 API」。


2. 設定 API

建立方法 (Create method)

接下來會進入到這個 API 的設定介面,先點擊「操作」選擇「建立方法」

此時在 API 根目錄(/)底下會出現一個下拉式選單,請選擇「ANY」後點選打勾圖示

右邊會出現方法設定,這邊記得要勾選「使用 Lambda 代理整合」,並在「Lambda 函數」中輸入預先設定的 Lambda 函式名稱,我的程式碼叫做 cookie_api_function,只要打第一個字 c 就會出現候選名稱了,選下去就對了!最後就按下「儲存」完成。

不知道什麼是 Lambda 函式?趕快點擊下方文章惡補一下吧!

在 AWS Lambda 上使用 Python 第三方套件教學

建立資源 (Create resource)

再來要在 API 根目錄底下建立新的資源,一樣點選「操作」,這次選擇「建立資源」,右邊就會出現資源設定的頁面,只要勾選「設定為代理資源」底下的資源名稱和路徑就會自動幫我們帶入 proxy 和 {proxy+} 了,不用特地輸入哦!

點選「建立資源」後,會進入到資源的 /{proxy+} ANY 設定,這邊只要像剛剛建立方法一樣,輸入「Lambda 函數」這一格即可按下「儲存」囉!


3. 部署 API

設定完之後,就可以進行我們的 API 部署作業,很簡單,也是一樣點選「操作」選擇「部署 API」

此時會跳出一個視窗,「部署階段」是一個下拉式選單,但沒有部署過的話應該會只有新階段可以選,所以就選擇「新階段」(New Stage) 並輸入「階段名稱」,這個名稱將會成會 API 的網址的一部分,所以可以思考一下如何設定。

我這邊就當作是開發階段的 API,因此命名為 cookie_api_dev,階段說明和部署說明都是選填,可自行依照不同情境去填寫說明,都完成後就可以按下「部署」!


4. 實際呼叫 API 測試

在左側的側欄可以看到,到剛剛的步驟都是在 API: cookie_api 底下的「資源」中操作,部署後會進入到「階段」這一頁,且這頁會顯示我們這支 API 最重要的網址(如下圖紅框的「叫用 API」位置),底下也會有這個 API 的 Rate 限制。

API 的網址結構大概會長這樣:

https://my-api-id.execute-api.region-id.amazonaws.com/cookie_api_dev

紅字的部分會依照每個人有所不同,而藍字就是剛剛部署的 API 階段名稱

GET / POST 的方式也會因人而異,像我收集使用者 cookie 的 FastAPI 程式碼如下:

from fastapi import FastAPI
from bson import json_util
import json
from pymongo import MongoClient
from typing import Optional
from mangum import Mangum
app = FastAPI()
mongo_connect = "<mongoDB_connection_URL>"
client = MongoClient(mongo_connect)
db = client['member_log'] # Database Name
collection = db['cookie'] # Collection Name
@app.get('/members/{member_id}')
def get_data_by_member_id(member_id: str, offset: Optional[str] = '5'):
query = collection.find({'member_id': member_id}).limit(int(offset))
query_serialized = [json.dumps(q, default=json_util.default) for q in query] # Handle the ObjectID
return [json.loads(q) for q in query_serialized]
@app.post('/members/')
async def insert_one_log(payload: dict):
collection.insert_one(payload)
handler = Mangum(app) # Special Handler For AWS Lambda
view raw fastapi_aws.py hosted with ❤ by GitHub

因此我 POST 時使用的網址就會是:

https://my-api-id.execute-api.region-id.amazonaws.com/cookie_api_dev/members/

GET 時使用的網址則是:

https://my-api-id.execute-api.region-id.amazonaws.com/cookie_api_dev/members/{member_id}?offset=5

以上就是將 FastAPI 部署到 AWS API Gateway 的各種設定和呼叫方法的教學。

若覺得文章不錯的話可以訂閱我的部落格,也歡迎追蹤我的 Facebook 粉絲專頁:https://www.facebook.com/jumpingcoder

補充紀錄

這次 POST 的資料是存到 MongoDB 中,所以稍微紀錄一下 Python 連接 MongoDB Database 和 Collection 的部分。

db = client['member_log'] # Database Name
collection = db['cookie'] # Collection Name

上方的 dbcollection 所對應到雲端 MongoDB 的名稱:

廣告

對「將 FastAPI 部署到 AWS API Gateway 教學(配合 Lambda 使用)」的想法

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s