對 HTTP API Lambda 整合的問題進行疑難排解
以下建議說明在您將 AWS Lambda 整合 與 HTTP API 搭配使用時,如何疑難排解可能會遇到的錯誤和問題。
問題:具有 Lambda 整合的 API 會傳回 {"message":"Internal Server Error"}
若要對內部伺服器錯誤進行疑難排解,請將 $context.integrationErrorMessage
記錄變數新增至您的日誌格式,然後檢視您 HTTP API 的日誌。若要完成此動作,請執行下列操作:
若要建立日誌群組,請使用 AWS Management Console
在 https://console.aws.amazon.com/cloudwatch/
開啟 CloudWatch 主控台。 -
選擇 Log groups (日誌群組)。
-
選擇 Create log group (建立日誌群組)。
-
輸入日誌群組名稱,然後選擇 Create (建立)。
-
記下日誌群組的 Amazon Resource Name (ARN)。ARN 格式為 arn:aws:logs:
region
:account-id
:log-group:log-group-name
。您需要日誌群組 ARN 才能存取 HTTP API 的記錄功能。
新增 $context.integrationErrorMessage
記錄變數
在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway
。 -
選擇 HTTP API。
-
在 Monitor (監控) 下,選擇 Logging (記錄)。
-
選取 API 的階段。
-
選擇 Edit (編輯),然後存取記錄。
-
針對 Log destination (日誌目的地),輸入您在上一個步驟中建立之日誌群組的 ARN。
-
在 Log format (日誌格式) 中,選擇 CLF。API Gateway 會建立範例日誌格式。
-
將
$context.integrationErrorMessage
新增至日誌格式的結尾。 -
選擇 Save (儲存)。
檢視 API 的日誌
-
產生日誌。使用瀏覽器或
curl
來叫用您的 API。$
curl https://api-id
.execute-api.us-west-2
.amazonaws.com/route
在以下網址登入 API Gateway 主控台:https://console.aws.amazon.com/apigateway
。 -
選擇 HTTP API。
-
在 Monitor (監控) 下,選擇 Logging (記錄)。
-
選取您啟用記錄功能的 API 階段。
-
選擇 View logs in CloudWatch (檢視 CloudWatch 中的日誌)。
-
選擇最新的日誌串流來檢視 HTTP API 的日誌。
-
您的日誌項目看起來應與下列類似:
因為我們已將 $context.integrationErrorMessage
新增至日誌格式,所以我們會在摘要問題的日誌中看到錯誤訊息。
您的日誌可能包含不同的錯誤訊息,其中會指出您的 Lambda 函數程式碼發生問題。在這種情況下,請檢查您的 Lambda 函數程式碼,並確認您的 Lambda 函數以所需的格式傳回回應。如果您的日誌未包含錯誤訊息,請將 $context.error.message
和 $context.error.responseType
新增至您的日誌格式,以取得更多有助於疑難排解的資訊。
在這種情況下,日誌會顯示 API Gateway 沒有叫用 Lambda 函式所需的許可。
當您在 API Gateway 主控台中建立 Lambda 整合時,API Gateway 會自動設定叫用 Lambda 函數的許可。當您使用 AWS CLI、AWS CloudFormation 或軟體開發套件建立 Lambda 整合時,您必須授予 API Gateway 叫用函數的許可。以下 add-permission 命令會對不同的 HTTP API 路由授予許可,以調用 Lambda 函式。
範例 – 適用於 HTTP API 的 $default
階段和 $default
路由
aws lambda add-permission \ --function-name
my-function
\ --statement-idapigateway-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-idapigateway-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 函數的回應。