

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

# 對 HTTP API Lambda 整合的問題進行疑難排解
<a name="http-api-troubleshooting-lambda"></a>

以下建議說明在您將 [AWS Lambda 整合](http-api-develop-integrations-lambda.md) 與 HTTP API 搭配使用時，如何疑難排解可能會遇到的錯誤和問題。

## 問題：具有 Lambda 整合的 API 會傳回 `{"message":"Internal Server Error"}`
<a name="http-api-troubleshooting-lambda-internal-server-error"></a>

若要對內部伺服器錯誤進行疑難排解，請將 `$context.integrationErrorMessage` [記錄變數](http-api-logging-variables.md)新增至您的日誌格式，然後檢視您 HTTP API 的日誌。若要完成此動作，請執行下列操作：

**使用 建立日誌群組 AWS 管理主控台**

1. 在 [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/) 開啟 CloudWatch 主控台。

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

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

1. 輸入日誌群組名稱，然後選擇 **Create** (建立)。

1. 記下日誌群組的 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](https://console.aws.amazon.com/apigateway)。

1. 選擇 HTTP API。

1. 在 **Monitor** (監控) 下，選擇 **Logging** (記錄)。

1. 選取 API 的階段。

1. 選擇 **Edit** (編輯)，然後存取記錄。

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

1. 在 **Log format** (日誌格式) 中，選擇 **CLF**。API Gateway 會建立範例日誌格式。

1. 將 `$context.integrationErrorMessage` 新增至日誌格式的結尾。

1. 選擇 **Save** (儲存)。

**檢視 API 的日誌**

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

   ```
   $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
   ```

1. 在以下網址登入 API Gateway 主控台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 選擇 HTTP API。

1. 在 **Monitor** (監控) 下，選擇 **Logging** (記錄)。

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

1. 選擇 **View logs in CloudWatch** (檢視 CloudWatch 中的日誌)。

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

1. 您的日誌項目看起來應與下列類似：  
![\[CloudWatch Logs 日誌項目，顯示來自 Lambda 的整合錯誤訊息。\]](http://docs.aws.amazon.com/zh_tw/apigateway/latest/developerguide/images/troubleshoot-http-api-logs.png)

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

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

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

當您在 API Gateway 主控台中建立 Lambda 整合時，API Gateway 會自動設定叫用 Lambda 函數的許可。當您使用 AWS CLI CloudFormation或 SDK 建立 Lambda 整合時，您必須授予 API Gateway 調用函數的許可。以下 [add-permission](https://docs.aws.amazon.com/cli/latest/reference/lambda/add-permission.html) 命令會對不同的 HTTP API 路由授予許可，以調用 Lambda 函式。

**Example 範例 – 適用於 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"
```

**Example 範例 – 適用於 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** (許可) 索引標籤中，[確認函數政策](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

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