對 HTTP API Lambda 整合的問題進行疑難排解 - Amazon API 网关

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

對 HTTP API Lambda 整合的問題進行疑難排解

以下建議說明在您將 AWS Lambda 整合 與 HTTP API 搭配使用時,如何疑難排解可能會遇到的錯誤和問題。

問題:具有 Lambda 整合的 API 會傳回 {"message":"Internal Server Error"}

若要對內部伺服器錯誤進行疑難排解,請將 $context.integrationErrorMessage 記錄變數新增至您的日誌格式,然後檢視您 HTTP API 的日誌。若要完成此動作,請執行下列操作:

若要使用建立日誌群組 AWS Management Console
  1. 請在以下位置開啟 CloudWatch 主控台。 https://console.aws.amazon.com/cloudwatch/

  2. 選擇 Log groups (日誌群組)。

  3. 選擇 Create log group (建立日誌群組)。

  4. 輸入日誌群組名稱,然後選擇 Create (建立)。

  5. 記下日誌群組的 Amazon Resource Name (ARN)。ARN 格式為 ARN: AW: 日誌:區域:帳戶 ID: 日誌組:. log-group-name 您需要日誌群組 ARN 才能存取 HTTP API 的記錄功能。

新增 $context.integrationErrorMessage 記錄變數
  1. 在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway

  2. 選擇 HTTP API。

  3. Monitor (監控) 下,選擇 Logging (記錄)。

  4. 選取 API 的階段。

  5. 選擇 Edit (編輯),然後存取記錄。

  6. 針對 Log destination (日誌目的地),輸入您在上一個步驟中建立之日誌群組的 ARN。

  7. Log format (日誌格式) 中,選擇 CLF。API Gateway 會建立範例記錄格式。

  8. $context.integrationErrorMessage 新增至日誌格式的結尾。

  9. 選擇 Save (儲存)。

檢視 API 的日誌
  1. 產生日誌。使用瀏覽器或 curl 來叫用您的 API。

    $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
  2. 在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway

  3. 選擇 HTTP API。

  4. Monitor (監控) 下,選擇 Logging (記錄)。

  5. 選取您啟用記錄功能的 API 階段。

  6. 選擇 [檢視登入] CloudWatch。

  7. 選擇最新的日誌串流來檢視 HTTP API 的日誌。

  8. 您的日誌項目看起來應與下列類似:

    CloudWatch 顯示 Lambda 整合錯誤訊息的記錄項目。

因為我們已將 $context.integrationErrorMessage 新增至日誌格式,所以我們會在摘要問題的日誌中看到錯誤訊息。

您的日誌可能包含不同的錯誤訊息,其中會指出您的 Lambda 函數程式碼發生問題。在這種情況下,請檢查您的 Lambda 函數程式碼,並確認您的 Lambda 函數以所需的格式傳回回應。如果您的日誌未包含錯誤訊息,請將 $context.error.message$context.error.responseType 新增至您的日誌格式,以取得更多有助於疑難排解的資訊。

在這種情況下,日誌會顯示 API Gateway 沒有叫用 Lambda 函式所需的許可。

當您在 API Gateway 主控台中建立 Lambda 整合時,API Gateway 會自動設定叫用 Lambda 函數的許可。當您使用 AWS CLI、 AWS CloudFormation或 SDK 建立 Lambda 整合時,您必須授與 API Gateway 叫用函數的權限。下列範例 AWS CLI 命令會授與不同 HTTP API 路由的權限,以叫用 Lambda 函數。

範例 — 針對 HTTP API 的$default階段和$default路由
aws lambda add-permission \ --function-name my-function \ --statement-id apigateway-invoke-permissions \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/\$default/\$default"
範例 — 針對 HTTP API 的prod階段和test路由
aws lambda add-permission \ --function-name my-function \ --statement-id apigateway-invoke-permissions \ --action lambda:InvokeFunction \ --principal apigateway.amazonaws.com \ --source-arn "arn:aws:execute-api:us-west-2:123456789012:api-id/prod/*/test"

在 Lambda 主控台的 Permissions (許可) 索引標籤中,確認函數政策

嘗試再次叫用您的 API。您應會看見 Lambda 函數的回應。