如何排查具有 Lambda 集成或 Lambda 授权方的 API Gateway HTTP API 的权限错误?

2 分钟阅读
0

我在尝试使用 API Gateway HTTP API 调用我的 AWS Lambda 函数时,收到了“内部服务器错误”的消息。我在 Amazon CloudWatch Logs 中,看到了“没有权限调用集成”或“没有权限调用 Authorizer”的错误。

简短描述

如果 API Gateway HTTP API 尝试在没有 Lambda 调用权限的情况下调用 Lambda 函数,则 API Gateway 会返回“内部服务器错误”的消息。如果您为 HTTP API 激活了 CloudWatch 日志记录,则 API Gateway 还会在您的访问日志中记录以下错误消息之一:

  • 对于具有 Lambda 集成的 HTTP API:“integrationError”: “在集成或 API Gateway 上配置的 IAM 角色无权调用集成。请检查权限,然后重试。”
  • 对于带有 Lambda 授权方的 HTTP API:“authorizeError”: “在授权方或 API Gateway 上配置的 IAM 角色无权调用授权方。请检查权限,然后重试。”

要解决这些错误,请采取以下操作之一:

使用 API Gateway 控制台或 AWS 命令行界面(AWS CLI)向您的 HTTP API 添加基于资源的 Lambda 调用权限

-或者-

配置 AWS Identity and Access Management(IAM)执行角色,向 HTTP API 授予调用函数的权限。有关详细信息,请参阅用于调用 API 的 API Gateway 权限模型

有关排查 Lambda 集成与 HTTP API 配合使用时出现的错误的详细信息,请参阅 HTTP API Lambda 集成问题疑难解答

解决方法

**注意:**如果您在运行 AWS CLI 命令时收到错误,请确保您使用的是最新的 AWS CLI 版本

使用 API Gateway 控制台将 Lambda 调用权限添加到具有 Lambda 集成的 HTTP API

  1. 打开 API Gateway 控制台
  2. API 窗格中,选择您的 HTTP API 的名称。
  3. 在左侧导航窗格中,选择集成
  4. 选择管理集成
  5. 找到您的 Lambda 集成的名称,然后选择其旁边的编辑按钮。
  6. 对于调用权限,请选择授予 API Gateway 调用您的 Lambda 函数的权限
    或者,提供 IAM 角色 ARN,供 API Gateway 用于调用 Lambda 函数。
  7. 依次选择保存部署 API,将 Lambda 调用权限添加到您的 API 中。

使用 AWS CLI 向具有 Lambda 集成的 HTTP API 添加 Lambda 调用权限

运行以下 add-permission AWS CLI 命令:

aws lambda add-permission \
--function-name "$YOUR_FUNCTION_ARN" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/*/$METHOD/$RESOURCE" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction

**注意:**将 function-name 的值替换为您的 Lambda 函数的 ARN。将 source-arn 的值替换为您的 API 的源 ARN。将 statement-id 的值替换为语句标识符,使该语句与同一策略中的其他语句区分开来。

使用 API Gateway 控制台向具有 Lambda 授权方的 HTTP API 添加 Lambda 调用权限

  1. 打开 API Gateway 控制台
  2. API 窗格中,选择您的 HTTP API 的名称。
  3. 在左侧导航窗格中,选择授权
  4. 选择管理授权
  5. 找到您的 Lambda 授权方的名称,然后选择其旁边的编辑按钮。
  6. 对于调用权限,选择自动授予 API Gateway 调用您的 Lambda 函数的权限
    或者,提供 IAM 角色 ARN,供 API Gateway 用于调用 Lambda 函数。
  7. 依次选择保存部署 API,将 Lambda 调用权限添加到您的 API 中。

使用 AWS CLI 向具有 Lambda 授权方的 HTTP API 添加 Lambda 调用权限

运行以下 add-permission AWS CLI 命令:

aws lambda add-permission \
--function-name "$YOUR_FUNCTION_ARN" \
--source-arn "arn:aws:execute-api:$API_GW_REGION:$YOUR_ACCOUNT:$API_GW_ID/authorizers/$AUTHORIZER_ID" \
--principal apigateway.amazonaws.com \
--statement-id $STATEMENT_ID \
--action lambda:InvokeFunction

**注意:**将 function-name 的值替换为您的 Lambda 函数的 ARN。将 source-arn 的值替换为您的 API 的源 ARN。将 statement-id 的值替换为语句标识符,使该语句与同一策略中的其他语句区分开来。


AWS 官方
AWS 官方已更新 1 年前