对 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. 选择 Log groups (日志组)

  3. 选择 Create log group (创建日志组)

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

  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. 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. 通过以下网址登录到 Amazon API Gateway 控制台:https://console.aws.amazon.com/apigateway

  3. 选择您的 HTTP API。

  4. Monitor (监控) 下,选择 Logging (日志记录)

  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 函数。使用、或软件开发工具包创建 Lambda 集成时 Amazon CLI Amazon CloudFormation,必须向 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 函数的响应。