对 HTTP API Lambda 集成的问题进行故障排查 - Amazon API Gateway
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对 HTTP API Lambda 集成的问题进行故障排查

以下内容为您在将 Amazon Lambda 集成 与 HTTP API 结合使用时可能遇到的错误和问题提供故障排除建议。

问题:我的 API 与 Lambda 集成返回 {"message":"Internal Server Error"}

要解决此内部服务器错误,请将$context.integrationErrorMessage日志记录变量添加到日志格式中,然后查看 HTTP API 的日志。为此,请执行以下操作:

要使用 创建日志组Amazon Web Services Management Console
  1. 通过以下网址打开 CloudWatch 控制台:https://console.aws.amazon.com/cloudwatch/

  2. 选择日志组

  3. 选择创建日志组

  4. 输入日志组名称,然后选择创建

  5. 记下您的日志组的 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

  2. 选择您的 HTTP API。

  3. 监控下,选择日志记录

  4. 选择 API 的一个阶段。

  5. 选择编辑,然后启用访问日志记录。

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

  7. 对于日志格式,选择 CLF。API Gateway 创建一个示例日志格式。

  8. $context.integrationErrorMessage 添加到日志格式的末尾。

  9. 选择保存

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

    $curl https://api-id.execute-api.us-west-2.amazonaws.com/route
  2. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  3. 选择您的 HTTP API。

  4. 监控下,选择日志记录

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

  6. 选择查看 CloudWatch 中的日志

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

  8. 您的日志条目应类似于以下内容:

因为我们已将 $context.integrationErrorMessage 添加到日志格式,所以我们在日志中会看到一条总结此问题的错误消息。

您的日志可能包含不同的错误消息,以指示您的 Lambda 函数代码存在问题。在这种情况下,检查您的 Lambda 函数代码,并验证您的 Lambda 函数以所需格式返回响应。如果您的日志不包含错误消息,请在日志格式中添加 $context.error.message$context.error.responseType 以获取更多信息以帮助进行故障排除。

在这种情况下,日志显示 API Gateway 不具备调用 Lambda 函数所需的权限。

当您在 API Gateway 控制台中创建 Lambda 集成时,API Gateway 会自动配置权限以调用 Lambda 函数。当您使用 Amazon CLI、Amazon CloudFormation 或开发工具包创建 Lambda 集成时,您必须授予 API Gateway 调用函数的权限。以下示例 Amazon 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 控制台的权限选项卡中确认函数策略

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