

# 对 HTTP API Lambda 集成的问题进行故障排查
<a name="http-api-troubleshooting-lambda"></a>

以下内容为您在将 [AWS Lambda 集成](http-api-develop-integrations-lambda.md) 与 HTTP API 结合使用时可能遇到的错误和问题提供故障排除建议。

## 问题：我的 API 与 Lambda 集成返回 `{"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. 通过以下网址打开 CloudWatch 控制台：[https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/)。

1. 选择**日志组**。

1. 选择**创建日志组**。

1. 输入日志组名称，然后选择**创建**。

1. 记下您的日志组的 Amazon 资源名称 (ARN)。ARN 格式为 arn:aws:logs:*region*: *account-id*:log-group:*log-group-name*。您需要日志组 ARN 才能为 HTTP API 启用访问日志记录。

**添加 `$context.integrationErrorMessage` 日志记录变量**

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择您的 HTTP API。

1. 在**监控**下，选择**日志记录**。

1. 选择 API 的一个阶段。

1. 选择**编辑**，然后启用访问日志记录。

1. 为**日志目标**输入您在上一步中创建的安全组的 ARN。

1. 对于**日志格式**，选择 **CLF**。API Gateway 创建一个示例日志格式。

1. 将 `$context.integrationErrorMessage` 添加到日志格式的末尾。

1. 选择**保存**。

**查看 API 的日志**

1. 生成日志。使用浏览器或 `curl` 调用您的 API。

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

1. 通过以下网址登录到 Amazon API Gateway 控制台：[https://console.aws.amazon.com/apigateway](https://console.aws.amazon.com/apigateway)。

1. 选择您的 HTTP API。

1. 在**监控**下，选择**日志记录**。

1. 选择您启用了日志记录的 API 阶段。

1. 选择**查看 CloudWatch 中的日志**。

1. 选择最新的日志流以查看 HTTP API 的日志。

1. 您的日志条目应类似于以下内容：  
![\[CloudWatch Logs 日志条目，显示来自 Lambda 的集成错误消息。\]](http://docs.aws.amazon.com/zh_cn/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 或开发工具包创建 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 控制台的**权限**选项卡中[确认函数策略](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html)。

尝试再次调用您的 API。您应该看到 Lambda 函数的响应。