View a markdown version of this page

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

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

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

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

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

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

使用 建立日誌群組 AWS 管理主控台
  1. 在 https://console.aws.amazon.com/cloudwatch/ 開啟 CloudWatch 主控台。

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

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

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

  5. 記下日誌群組的 Amazon Resource Name (ARN)。ARN 格式為 arn:aws:logs:region: account-id:log-group: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. 選擇 View logs in CloudWatch (檢視 CloudWatch 中的日誌)。

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

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

    CloudWatch Logs 日誌項目,顯示來自 Lambda 的整合錯誤訊息。

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

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

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

當您在 API Gateway 主控台中建立 Lambda 整合時,API Gateway 會自動設定叫用 Lambda 函數的許可。當您使用 AWS CLI CloudFormation或 SDK 建立 Lambda 整合時,您必須授予 API Gateway 調用函數的許可。以下 add-permission 命令會對不同的 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 函數的回應。