我使用阶段变量在 API Gateway 定义了我的 Lambda 集成。为什么我在调用 API 方法时收到“内部服务器错误”和 500 状态代码?
上次更新时间:2021 年 6 月 21 日
我设置 Amazon API Gateway API 以使用阶段变量调用 AWS Lambda 函数。当我调用 API 方法时,我的 API 返回“内部服务器错误”和 500 状态代码。如何解决此错误?
简短描述
如果 Lambda 函数基于资源的策略不包括供 API 调用此函数的权限,API Gateway 将返回内部服务器错误消息。
如果创建阶段变量以通过 API 调用函数,则必须通过执行以下操作之一添加所需的权限:
- 更新 Lambda 函数的基于资源的 AWS Identity and Access Management (IAM) 策略,以便向 API Gateway 授予调用权限。
-或者- - 创建一个 IAM 角色,API Gateway 可以代入该角色来调用 Lambda 函数。
注意:如果您在 API Gateway 控制台中使用标准的 Lambda 集成构建 API Gateway API,控制台将自动添加所需的权限。
解决方法
注意:如果您在运行 AWS Command Line Interface (AWS CLI) 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI。
查看您的 Amazon CloudWatch Logs 以确认该错误由缺少权限造成
对于 REST API 和 WebSocket 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 授予调用权限
{
"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 Resource Name (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
创建一个 IAM 角色,API Gateway 可以代入该角色来调用 Lambda 函数
遵循调用 API 的 API Gateway 权限模型中的说明。
注意:有关更多信息,请参阅使用 IAM 权限控制对 API 的访问。