跳至内容

我使用阶段变量在 API Gateway 中定义了我的 Lambda 集成。为什么我在调用 API 方法时收到 "Internal server error" 和 500 状态代码?

2 分钟阅读
0

我将我的 Amazon API Gateway API 设置为使用阶段变量调用 AWS Lambda 函数。在调用 API 方法时,我的 API 返回 "Internal server error" 和 500 状态代码。

简短描述

如果 Lambda 函数基于资源的策略未包含允许 API 调用该函数的权限,则 API Gateway 会返回 Internal server error(内部服务器错误)消息。

如果您创建阶段变量以通过 API 调用函数,则必须通过执行以下任一操作来添加所需权限:

**注意:**如果使用 API Gateway 控制台构建具有标准 Lambda 集成的 API Gateway API,则控制台会自动添加所需权限。

解决方法

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

查看 Amazon CloudWatch Logs,确认错误是由缺少权限导致的

对于 REST APIWebSocket API

查看 API Gateway 执行日志。如果您看到类似于 Invalid permissions on Lambda function(Lambda 函数权限无效)的错误消息,则缺少权限是导致出现错误的原因。有关详细信息,请参阅“如何启用 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行故障排除?”

对于 HTTP API

查看 API Gateway 访问日志。如果您看到包含 Invalid permissions(权限无效)的错误消息,则缺少权限是导致出现错误的原因。有关详细信息,请参阅配置 HTTP API 的日志记录

注意:integrationErrorMessage 上下文变量 ($context.integrationErrorMessage) 包含可供查看的错误消息。

更新 Lambda 函数基于资源的 IAM 策略为 API Gateway 授予调用权限

Lambda 控制台说明

按照向 AWS 服务授予函数访问权限中的说明进行操作。

以下是向 API Gateway 授予调用权限的基于资源的策略示例:

{
    "Version": "2012-10-17",
    "Id": "default",
    "Statement": [
        {
            "Sid": "ServiceAllowListing",
            "Effect": "Allow",
            "Principal": {
              "Service": "apigateway.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:<AWS_Region>:<AWS_Account_Number>:function:<LambdaFunctionName>",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:execute-api:<AWS_Region>:<AWS_Account_Number>:<API_ID>"
              }
            }
        }
     ]
}

AWS CLI

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

**重要事项:**在运行命令之前替换以下变量:

  • 对于 arn:aws:lambda:region:account-id:function:function-name,输入 Lambda 函数的 Amazon 资源名称 (ARN)
  • 对于 statement-id-guid,输入唯一的语句 ID。例如,api-gateway-invoke
  • 对于 arn:aws:execute-api:region:account-id:api-id/*/GET/lambdasv1,输入调用函数的 API Gateway 资源的 ARN。有关 HTTP API 和 REST API 的 ARN 格式,请参阅 API Gateway 中执行 API 权限的资源格式。有关 WebSocket API 的 ARN 格式,请参阅使用 IAM 授权
aws lambda add-permission --function-name arn:aws:lambda:region:account-id:function:function-name --statement-id statement-id-guid --action lambda:InvokeFunction --source-arn arn:aws:execute-api:region:account-id:api-id/*/GET/lambdasv1

创建 API Gateway 可代入以调用 Lambda 函数的 IAM 角色

按照用于调用 API 的 API Gateway 权限模型中的说明进行操作。

**注意:**有关详细信息,请参阅使用 IAM 权限控制对 API 的访问

相关信息

使用 HTTP API 的阶段

为 REST API 部署设置阶段变量

使用 Amazon API Gateway 阶段变量

使用 API Gateway 阶段变量管理 Lambda 函数

使用 Lambda 集成构建 API Gateway REST API