我将我的 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 API 和 WebSocket 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