AWS Lambda 是一種無伺服器、事件推動的運算服務,而 Amazon API Gateway 可以讓開發人員輕鬆地建立、發佈、維護、監控和保護任何規模的 API,使用 API Gateway 可以建立 RESTful API 和 WebSocket API,以啟用即時雙向通訊應用程式。本篇就是介紹如何結合這兩個 AWS 服務,透過 Amazon API Gateway 來推動 AWS Lambda。
步驟 1. 進入 AWS Lambda 控制台
登錄 AWS 控制台畫面後選擇進入 AWS Lambda 控制台,單擊左邊功能導覽列中的函式,會進入函式畫面,注意所在區域,本範例以東京區域為例,如下圖所示,單擊建立函式按鈕。
AWS Lambda 函式控制台畫面
步驟 2. 建立 Lambda 函式
在建立函式畫面中,設定如下:
配置完畢後單擊右下方的建立函式即可,如下圖所示。
建立 Lambda 函式配置
步驟 3. 新增觸發條件
進入 Lambda 函式的編輯畫面後,首先先單擊 +新增觸發 按鈕,用來指定 API Gateway 觸發這個 Lambda 函式,配置選項如下:
將 API Gateway 新增至 Lambda 函數,以建立可叫用函數的 HTTP 端點,而 API Gateway支援兩種類型的 RESTful API︰HTTP API 和 REST API。HTTP API 是輕量級、低延遲的 RESTful API,較新推出並內建於 API Gateway version 2 API;REST API 是可以高度客製化的 RESTful API。
CORS 需要從不在相同網域託管的網頁叫用您的 API。勾選跨原始資源共用 (CORS) 選項可在所有回應中新增 Access-Control-Allow-Origin 標頭,以啟用任何網域的跨原始資源共用 (CORS)。此外,Lambda 會增加 Amazon API Gateway 的必要權限,以便用這個觸發條件叫用您的 Lambda 函式。這點可以透過檢視 IAM 來觀察增加的權限。
配置完畢後單擊 新增 按鈕,如下圖所示。
新增 API Gateway 觸發條件配置
步驟 4. 修改程式碼
修改 Lambda 程式碼以便於後續觀察 API Gateway 是如何傳遞 HTTP 的請求,所以以下代碼將傳入參數 event 顯示出來,修改完程式碼後記得單擊 Deploy 按鈕,這才會把這代碼佈署到雲端,如下圖所示。
import json
def lambda_handler(event, context):
# TODO implement
return {
'statusCode': 200,
'body': json.dumps(event, indent=4, default=str)
}
修改 Lambda 程式碼
步驟 5. 透過 API Gateway 觸發 Lambda 函式
單擊上圖的 API Gateway 或是 組態 頁籤後選擇 觸發 功能畫面,會看到步驟 3 所建立的 API Gateway端點,單擊 API 終端節點 就可以透過 API Gateway 觸發 Lambda 函式,如下圖所示。
API 終端節點觸發 Lambda 函式
下圖顯示呼叫 API Gateway 的結果,因為使用者的請求為 GET ,可以在 ["requestContext"]["http"]這個鍵值中找到使用者的請求內容。
Lambda 函式運行結果
步驟 6. 使用 curl 呼叫 API Gateway
因為 RESTful API 通常都是透過程式調用,所以我們試著用 curl 透過 get 與 post 方法來傳資料給後端的 Lambda 函式,觀察在 API Gateway 後方的Lambda 函式,會接收到怎樣的請求格式。
# GET request
curl "https://j98fukyxs3.execute-api.ap-northeast-1.amazonaws.com/default/lambda2api?say=Hi&to=Mon"
# POST request
curl "https://j98fukyxs3.execute-api.ap-northeast-1.amazonaws.com/default/lambda2api" \
-X POST \
-d "{\"say\":\"Hi\",\"to\":\"Mon\"}" \
-H "content-type: application/json"
當 API Gateway 收到 curl 的 get 請求時,傳過來的資料會在 ["rawQueryString"] 這個欄位中,標頭在 ["requestContext"]["http"] 這個欄位,如下圖所示。
API Gateway 發出 GET 請求
當 API Gateway 收到 curl 的 post 請求時,傳過來的資料會在 ["body"] 這個欄位中,標頭在 ["requestContext"]["http"] 與 ["headers"] 這兩個欄位,如下圖所示。
API Gateway 發出 POST 請求