如何透過 API Gateway REST API 將資料傳遞至後端 Lambda 函數或 HTTP 端點?

上次更新日期:2022 年 8 月 26 日

我希望我的 Amazon API Gateway REST API 將資料傳遞至後端 AWS Lambda 函數或 HTTP 端點。該如何進行?

簡短描述

若要設定 REST API 以將資料傳遞至後端 Lambda 函數,請使用 Lambda 自訂整合

若要將查詢字串參數傳遞至 HTTP 端點,請使用 HTTP 自訂整合

重要:請確認輸入資料是以整合請求承載的形式提供。最佳實務為使用映射範本提供有效承載。如需詳細資訊,請參閱在方法與整合之間映射請求和回應承載

解決方案

建立 Lambda 函數以處理 API Gateway API 中的自訂標頭

1.    開啟 Lambda 主控台

2.    選擇 Create function (建立函數)。此時將開啟 Create function (建立函數) 頁面,其中已選取 Author from scratch (從頭編寫) 選項。

3.    在 Basic information (基本資訊) 窗格中,執行下列動作:對於 Function name (函數名稱),輸入描述函數用途的名稱。例如:MapTemplate。針對 Runtime (執行時間),選擇 Python 3.9

4.    針對 Permissions (許可),展開 Change default execution role (變更預設執行角色)。

5.    選擇 Use an existing role (使用現有角色)。此時會顯示現有角色的下拉式清單。

6.    在 Existing role (現有角色) 中,選擇您之前建立的 Lambda 執行角色。

7.    選擇 Create function (建立函數)。

8.    從 Code (程式碼) 索引標籤,在 Code source (程式碼來源) 中,將 lambda_function.py 中的程式碼取代為下列項目:

import json

def lambda_handler(event, context):
    print(event)
    return {
        'statusCode': 200,
        'body': json.dumps(event) # returning the data sent to backend lambda function as API response.
    }

9.    選擇 Deploy (部署)。

如需詳細資訊,請參閱使用 Python 建置 Lambda 函數

將資料傳遞至後端 Lambda 函數或 HTTP 端點

1.    開啟 API Gateway 主控台

2.    選擇 Create API (建立 API)。

-或-

(如果這是您第一次使用 API Gateway) 會顯示一個向您介紹此服務的功能的頁面。在 REST API (REST API),選擇 Build (建置)。出現 Create Example API (建立範例 API) 彈出視窗時,選擇 OK (確定)。

3.    對於 Choose an API type (選擇 API 類型),在 REST API 窗格中選擇 Build (建置)。

4.    在 Create new API (建立新的 API),選擇 New API (新 API)。

5.    在Settings (設定),對於 API name (API 名稱),輸入描述您的 API 用途的名稱。例如:MappingTemplateTutorial。(選用) 對於 Description (描述),輸入 API 用途的簡短描述。例如,Send Data to Backend Lambda function/HTTP endpoint (將資料傳送至後端 Lambda 函數/HTTP 端點)。對於 Endpoint Type (端點類型),請選擇 Regional (區域)。

6.    選擇 Create API (建立 API)。

設定 API 資源、整合點和主體映射範本

1.    在 API Gateway console (API Gateway 主控台) 中,選擇您在上一步中建立的 API 的名稱。您的 API 的 Resources (資源) 頁面隨即開啟。

2.    在 Resources (資源) 頁面中,選擇 Actions (動作)。然後,選擇 Create Resource (建立資源)。

3.    在 New Child Resource (新的子資源) 窗格中,針對Configure as proxy resource (設定為代理資源) 選擇核取記號圖示,然後選擇 Create Resource (建立資源)。

4.    在 /{proxy+} - ANY - Setup 頁面上,執行下列動作:

  • 對於 Integration type (整合類型),選擇 Lambda Function Proxy (Lambda 函數代理)。
  • 對於 Lambda Region (Lambda 區域),請選擇託管您的函數的 AWS 區域。
  • 對於 Lambda Function (Lambda 函數),請輸入函數的名稱 MappingTemplateTutorial

選擇 Save (儲存)。此時會顯示 Add Permission to Lambda Function (向 Lambda 函數新增許可) 彈出視窗,選擇 OK (確定)。

7.    在 / {proxy+} - ANY - Method Execution (/ {proxy+} - ANY - 方法執行) 頁面中,選擇 Integration Request (整合請求)。

8.    在 / {proxy+} - ANY - Integration Request (/ {proxy+} - ANY - 整合請求) 頁面上,執行下列動作:

  • 取消勾選 Use Lambda Proxy integration (使用 Lambda 代理整合) 圖示方塊。會出現 Switch to Lambda integration (切換至 Lambda 整合) 彈出視窗。
  • 在彈出視窗中,選擇 OK (確定)。 此時會顯示 Add Permission to Lambda Function (向 Lambda 函數新增許可) 彈出視窗。在彈出視窗中,選擇 OK (確定)
  • 展開 Mapping Templates (映射範本)。
  • 對於 Request body passthrough (請求主體傳遞),選擇 When there are no templates defined (recommended) (在沒有定義範本時 (建議))。

選擇 Add mapping template (新增映射範本)。對於 Content-Type,輸入 application/json。然後,選擇核取記號圖示。

9.    選擇 Generate template (產生範本) 下拉式清單,然後選擇 Method Request passthrough ( 方法請求傳遞)。

10.    在映射範本編輯器中,輸入下列內容:

##  See http://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-mapping-template-reference.html
#set($allParams = $input.params())
{
"method" : "$context.httpMethod", ## API method
"authcontext" : "$context.authorizer.stringkey", ## Optional output from Lambda Authorizers
## passthrough body
"body-json" : $input.json('$'),
## passthrough headers, querystrings and path parameters
"params" : {
#foreach($type in $allParams.keySet())
    #set($params = $allParams.get($type))
"$type" : {
    #foreach($paramName in $params.keySet())
    "$paramName" : "$util.escapeJavaScript($params.get($paramName))"
        #if($foreach.hasNext),#end
    #end
}
    #if($foreach.hasNext),#end
#end
}
}

11.    選擇 Save (儲存)。

12.    選擇 Method Execution (方法執行) 以返回 / {proxy+} - ANY - Method Execution ( / {proxy+} - ANY - 方法執行) 頁面。

13.    選擇Method Response (方法回應) 以設定有效的方法回應。

14.    在 /{proxy+} - ANY - Method Response (/{proxy+} - ANY - 方法回應 ) 頁面中,選擇 Add Response (新增回應)。

15.    針對 HTTP 狀態碼,請輸入 200。然後,選擇核取記號圖示。

16.    選擇Actions (動作) 以將 Deploy API (API 部署) 到階段。

將您的 API 部署至新階段

1.    依照 Deploy a REST API to a stage (將 REST API 部署至階段) 中的指示進行操作。如需詳細資訊,請參閱使用 API Gateway 主控台設定階段

2.    在 Stage Editor (階段編輯器) 窗格中,將叫用 URL 複製到您的剪貼簿。

REST API 叫用 URL 範例

https://1a2bc3d456.execute-api.us-east-1.amazonaws.com/stage

測試您的設定

若要確認所有資料都是透過 API 傳遞至後端 Lambda 函數或 HTTP 端點,請執行下列 curl 命令:

重要:https://restApiId.execute-api.region.amazonaws.com/stageName 取代為 API 的叫用 URL

curl -i --location --request POST 'https://1a2bc3d456.execute-api.us-east-1.amazonaws.com/stage/path1/path2?query1=querystring1&query2=querystring2' --header 'header1: value1' --header 'header2: value2' --header 'Content-Type: application/json' --data-raw '{"keybody":"valuebody"}'

命令輸出包括後端 Lambda 函數向用戶端接收的所有資料。您可以更新環境的輸出訊息。

注意:若要在 Windows 上安裝 curl,請參閱 Git 網站上的 Downloads (下載)。如需有關 curl 的詳細資訊,請參閱 curl 專案網站