我使用阶段变量在 API Gateway 定义了我的 Lambda 集成。为什么我在调用 API 方法时收到“内部服务器错误”和 500 状态代码?

上次更新时间:2021 年 6 月 21 日

我设置 Amazon API Gateway API 以使用阶段变量调用 AWS Lambda 函数。当我调用 API 方法时,我的 API 返回“内部服务器错误”和 500 状态代码。如何解决此错误?

简短描述

如果 Lambda 函数基于资源的策略不包括供 API 调用此函数的权限,API Gateway 将返回内部服务器错误消息。

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

注意:如果您在 API Gateway 控制台中使用标准的 Lambda 集成构建 API Gateway API,控制台将自动添加所需的权限。

解决方法

注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

查看您的 Amazon CloudWatch Logs 以确认该错误由缺少权限造成

对于 REST APIWebSocket API

查看 API Gateway 执行日志。如果看到类似于对 Lambda 函数的权限无效的错误消息,则表示缺少权限会导致错误。有关更多信息,请参阅如何打开 CloudWatch Logs 以对 API Gateway REST API 或 WebSocket API 进行问题排查?

对于 HTTP API

查看 API Gateway 访问日志。如果看到包含权限无效的错误消息,则表示缺少权限会导致错误。有关更多信息,请参阅为 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 命令:

重要提示:在运行命令之前请替换以下变量:

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

创建一个 IAM 角色,API Gateway 可以代入该角色来调用 Lambda 函数

遵循调用 API 的 API Gateway 权限模型中的说明。

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