我想透過自訂 (非 Proxy) 整合來設定 AWS Lambda 函數,以處理透過我的 Amazon API Gateway API 傳送的自訂標頭。
簡短說明
依預設,Lambda 函數僅處理它從 API Gateway API 請求收到的方法請求主體。若要將自訂標頭從 API Gateway API 傳送給 Lambda 函數,請使用內文映射範本。API 首先將更新的 API 請求傳送到 Lambda 函數來處理標頭。然後,Lambda 函數從原始 API 請求傳回一個或多個標頭值。
解決方法
設定所需的 IAM 權限
依照使用 IAM 權限控制存取 API 中的指示進行操作。
若要測試此程序,請建立 AWS Identity and Access Management (IAM) 角色,然後附加 AmazonAPIGatewayInvokeFullAccess 和 AmazonAPIGatewayPushToCloudWatchLogsAWS 受管政策。如需詳細資訊,請參閱 AWS 受管政策。
建立一個 Lambda 函數來處理來自 API Gateway API 的自訂標頭
請完成下列步驟:
- 開啟 Lambda 主控台。
- 選擇建立函數。建立函數頁面會開啟,並選取從頭開始作者的選項。
- 在基本資訊窗格中,執行下列動作:
對於函數名稱,請輸入描述函數目的的名稱。例如: CustomHeaders。
對於 執行時期,請選擇 Node.js 20.x。
- 在許可下,展開變更預設執行角色。
- 選擇使用現有角色。此時會顯示現有角色的下拉式清單。
- 對於現有角色,選擇您先前建立的 Lambda 執行角色。
- 選擇建立函數。
- 在程式碼來源窗格上,使用下列程式碼取代編輯器窗格中的 index.mjs 程式碼:
export const handler = async (event, context, callback) => {
callback(null, "The custom header " +event.headers["header1"] +" has been processed successfully by AWS Lambda via Amazon API Gateway");
};
選擇部署。
如需詳細資訊,請參閱使用 Node.js 建立 Lambda 函數。
建立 API Gateway REST API
請完成下列步驟:
- 開啟 API Gateway 主控台。
- 選擇建立 API。
-or-
如果這是您第一次使用 API Gateway,則會顯示向您介紹 API Gateway功能的頁面。在 REST API 底下,選擇建置。
- 在建立 REST API 區段中,選擇 API 詳細資訊底下的新增 API。
- 對於 API 名稱,請輸入描述 API 用途的名稱。例如: SendtoLambda。
(選用) 對於說明,請輸入 API 用途的簡短描述。
在端點類型中,選擇區域。
- 選擇建立 API。
設定 API 的整合端點和本體映射範本
請完成下列步驟:
-
開啟 API Gateway 主控台。
-
選擇您先前建立的 API 名稱。您的 API 的資源頁面會開啟。
-
在資源頁面上,選擇建立資源。
-
在建立資源窗格中,執行下列動作:
在資源名稱中,輸入描述資源的名稱。例如: HeadersResource。
選擇建立資源。
-
選擇您建立資源,然後選擇建立方法。
-
在建立方法窗格中,執行下列動作:
對於方法類型,從下拉式選單清單選擇 POST。
對於 Integration type (整合類型),請選擇 Lambda Function (Lambda 函數)。
確認 Lambda proxy 整合已停用。
對於 Lambda 函數,選擇託管函數的 AWS 區域,然後輸入 Lambda 函數的名稱或 Amazon Resource Name (ARN)。
選擇建立方法。此動作會自動授與 API Gateway權限來調用您的 Lambda 函數。
-
為您在上一步驟中建立的資源方法選擇 POST。在方法執行窗格中,選擇 整合請求。
-
在整合請求窗格中,選擇 編輯,然後執行下列動作:
對於請求內文傳遞,請選擇未定義範本時 (建議使用)。
展開窗格底部的映射範本。
選擇新增映射範本。
對於 Content-Type,請輸入 application/json。
-
在範本內文編輯器中,輸入下列項目:
{
"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
}
}
-
選擇儲存。
將 API 部署至新階段
請完成下列步驟:
- 遵循指示以將 REST API 部署至階段。如需詳細資訊,請參閱在 API Gateway 中對於 REST API 設定階段。
- 選擇部署 API 按鈕。
- 在部署 API 彈出式視窗中,輸入階段的新名稱,然後選擇部署。
- 展開階段窗格上的階段,以檢視您在先前步驟中建立的資源和方法。
- 為您的資源方法選擇 POST,然後將調用 URL複製到剪貼簿。
REST API 調用網址範例
https://1a2bc3d456.execute-api.region.amazonaws.com/stageName/resourceName
測試您的設定
若要確認您的 API 和 Lambda 函數正在處理標頭,請執行下列 curl 命令:
curl -H "Content-Type: application/json" -H "header1: value1" -X POST -d "{\"API_body\": \"This is the body\"}" https://restApiId.execute-api.region.amazonaws.com/stageName/resourceName
**注意:**使用您的 API 調用網址取代 **
範例輸出結果
"The custom header value1 has been processed successfully by AWS Lambda via Amazon API Gateway"
**注意:**若要在 Windows 上安裝 curl,請參閱 Git 網站上的下載。如需有關 curl 的詳細資訊,請參閱 curl 專案網站。
相關資訊
在 API Gateway 中設定資料轉換
管理 AWS Lambda 中的權限
使用 IAM 權限控制存取 REST API