如何使用自訂 Lambda 整合,透過 API Gateway 將自訂標頭傳遞至 Lambda 函數?

上次更新日期:2021-07-27

我想設定 AWS Lambda 函數來處理透過 Amazon API Gateway API 傳遞的自訂標頭。該如何設定?

簡短描述

依預設,Lambda 函數僅處理它從 API Gateway API 請求接收的方法請求主體。若要將自訂標頭從 API Gateway API 傳遞給 Lambda 函數,請使用主體映射範本。API 將更新的 API 請求傳送至 Lambda 函數以處理標頭。然後,Lambda 函數從原始 API 請求傳回一或多個標頭值。

解決方案

設定所需的 IAM 許可

依照使用 IAM 許可控制對 API 的存取中的指示操作。

若要測試此程序,您可以建立 IAM 角色並連接下列 AWS 受管政策

  • AmazonAPIGatewayInvokeFullAccess
  • AmazonAPIGatewayPushToCloudWatchLogs

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

1.    開啟 Lambda 主控台

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

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

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

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

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

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

8.    在 Configuration (組態) 窗格的 Function code (函數程式碼) 下,將編輯器窗格中的程式碼 (index.js) 取代為下列程式碼:

exports.handler = (event, context, callback) => {
// TODO implement
callback(null, "This message header was processed by Amazon " +event.headers["header1"]);
};

9.    選擇 Save (儲存)。

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

建立 API Gateway REST API

1.    開啟 API Gateway 主控台

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

-或-

(如果這是您第一次使用 API Gateway) 會顯示一個向您介紹此服務的功能的頁面。在 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 用途的名稱。例如:SendtoLambda
(選用) 對於 Description (描述),輸入 API 用途的簡短描述。
對於 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 (新的子資源) 窗格中,執行下列動作:
對於 Resource Name (資源名稱),輸入描述資源的名稱。例如:HeadersResource
選擇 Create Resource (建立資源)。

4.    選擇 Actions (動作)。然後,選擇 Create Method (建立方法)。

5.    從 /headersresource 下的下拉式清單中,選擇 POST。然後,選擇核取記號圖示。

6.    在 /headersresource – POST – Setup (/headersresource – POST – 設定) 頁面上,執行下列動作:
對於 Integration type (整合類型),選擇 Lambda Function (Lambda 函數)。
對於 Lambda Region (Lambda 區域),請選擇託管您的函數的 AWS 區域。
對於 Lambda Function (Lambda 函數),請輸入函數的名稱。
選擇 Save (儲存)。此時會顯示 Add Permission to Lambda Function (向 Lambda 函數新增許可) 快顯。
在快顯中,選擇 OK (確定)。

7.    在 /headersresource – POST – Method Execution (/headersresource – POST – 方法執行) 頁面中,選擇 Integration Request (整合請求)。

8.    在 /headersresource – POST – Integration Request (/headersresource – POST – 整合請求) 頁面上,執行下列動作:
展開 Mapping Templates (映射範本)。
對於 Request body passthrough (請求主體傳遞),選擇 When there are no templates defined (recommended) (在沒有定義範本時 (建議))。
選擇 Add mapping template (新增映射範本)。
對於 Content-Type,輸入 application/json。然後,選擇核取記號圖示。

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

{
    "method": "$context.httpMethod",
    "body" : $input.json('$'),
    "headers": {
        #foreach($param in $input.params().header.keySet())
        "$param": "$util.escapeJavaScript($input.params().header.get($param))"
        #if($foreach.hasNext),#end
        #end
    }
}

10.    選擇 Save (儲存)。

將您的 API 部署至新階段

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

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

REST API 叫用 URL 範例

https://1a2bc3d456.execute-api.region.amazonaws.com/test

測試您的設定

若要確認您的 API 和 Lambda 函數正在處理訊息標頭,請執行下列 curl 命令:

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

curl -H "Content-Type: application/json" -H "header1: API Gateway and AWS Lambda" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/headersresource

命令輸出範例

"This message header was processed by Amazon API Gateway and AWS Lambda"

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