如何解决 API Gateway REST API 中的“Invalid permissions on Lambda function”(Lambda 函数权限无效)错误?
当我从 Amazon API Gateway REST API 调用 AWS Lambda 函数时,收到“Invalid permissions on Lambda function”(Lambda 函数权限无效)错误。
简短描述
如果您的 API Gateway REST API 在没有 Lambda 调用权限的情况下调用您的 Lambda 函数,则 API Gateway 会返回错误“Invalid permissions on Lambda function”(Lambda 函数的权限无效)。
如果您为 REST API 设置了 CloudWatch 日志记录,则 API Gateway 还会记录以下错误消息之一:
- 具有 Lambda 集成的 REST API 的 CloudWatch 错误消息示例:
"Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Method completed with status: 500" - 具有 Lambda Authorizer 的 REST API 的 CloudWatch 错误消息示例:
"Sending request to https://lambda.region.amazonaws.com/2015-03-31/functions/arn:aws:lambda:region:############:function:example-function/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Execution failed due to configuration error: Authorizer error"
解决方法
要解决这些错误,请执行以下操作之一:
- 通过本文中描述的方法之一向您的 REST API 添加基于资源的 Lambda 调用权限。
- 配置 AWS Identity and Access Management (IAM) 执行角色,向 REST API 授予调用函数的权限。
有关详细信息,请参阅用于调用 API 的 API Gateway 权限模型。
**注意:**如果您收到 401 Unauthorized(401 未授权)错误,请按照为什么在创建 Lambda Authorizer 后出现 API Gateway“401 Unauthorized”(401 未授权)错误?中的说明进行操作
解决 Lambda 集成错误
通过 API Gateway 控制台将 Lambda 调用权限添加到具有 Lambda 集成的 REST API
完成以下步骤:
- 打开 API Gateway 控制台。
- 在 API 窗格中,选择您的 REST API 的名称。
- 在 Resources(资源)窗格上,选择已配置的 HTTP 方法。
- 在 Method Execution(方法执行)窗格上,选择 Integration Request(集成请求)。
- 对于 Integration type(集成类型),选择 Lambda Function(Lambda 函数)。
- 展开 Lambda Region(Lambda 区域)下拉列表。然后,选择您的 Lambda 函数所在的 AWS 区域。
- 选择 Lambda Function(Lambda 函数)下拉列表。然后,选择您的 Lambda 函数的名称。
- 选择 Save(保存)。然后选择 Deploy the API(部署 API),将 Lambda 调用权限添加到您的 API 中。
通过 CloudFormation 模板向具有 Lambda 集成的 REST API 添加 Lambda 调用权限
将以下代码片段添加到您的 CloudFormation 模板中:
SampleApiPermission: Type: AWS::Lambda::Permission Properties: Action: "lambda:InvokeFunction" FunctionName: !Ref ExampleLambdaFunction Principal: "apigateway.amazonaws.com" SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:example-api-id/*/example-method/example-resource"
**注意:**替换前面模板中的以下内容:
带有 Lambda 函数名称的 FunctionName 值
带有您的 API 的源 Amazon 资源名称 (ARN) 的 SourceArn 值
在 SourceArn 值中,将 example-api-id 替换为您的 apiID
有关如何声明各种 CloudFormation 模板部分的详细信息,请参阅模板片段。
通过 AWS CLI 向具有 Lambda 集成的 REST API 添加 Lambda 调用权限
**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI。
运行以下 add-permission AWS CLI 命令:
aws lambda add-permission \ --function-name "$FUNCTION_NAME" \ --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
**注意:**替换前面命令中的以下内容:
带有 Lambda 函数名称的 function-name 值
将 source-arn 的值替换为您的 API 的源 ARN
带有唯一标识语句的语句标识符的 statement-id 值
解决 Lambda Authorizer 错误
通过 API Gateway 控制台向具有 Lambda Authorizer 的 REST API 添加 Lambda 调用权限
完成以下步骤:
- [为 API Gateway 创建允许 lambda:InvokeFunction 操作的 IAM 角色](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html#api-gateway-control-access-iam-permissions-model-for-calling-api)。然后,将 IAM 角色 ARN 复制到剪贴板。
- 打开 API Gateway 控制台。
- 在 API 窗格中,选择您的 REST API 的名称。
- 在 Authorizer 窗格上,选择已配置的 Lambda Authorizer。然后,选择 Edit(编辑)。
- 对于 Lambda Invoke Role(Lambda 调用角色),输入复制到剪贴板的 IAM 角色 ARN。
- 选择 Save(保存)。然后,选择 Deploy the API(部署 API)。
通过 CloudFormation 模板向具有 Lambda Authorizer 的 REST API 添加 Lambda 调用权限
将以下代码片段添加到您的 CloudFormation 模板中:
SampleApiAuthPermission: Type: AWS::Lambda::Permission Properties: Action: "lambda:InvokeFunction" FunctionName: !Ref ExampleLambdaFunction Principal: "apigateway.amazonaws.com" SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:example-api-id/authorizers/example-auth-id"
**注意:**替换前面模板中的以下内容:
带有 Lambda 函数名称的 FunctionName 值
在 SourceArn 值中,将 example-api-id 替换为您的 apiID
在 SourceArn 值中,将 example-auth-id 替换为您的 Lambda Authorizer 的 authorizerId
通过 AWS CLI 向具有 Lambda Authorizer 的 REST API 添加 Lambda 调用权限
运行以下 add-permission AWS CLI 命令:
aws lambda add-permission \ --function-name "$FUNCTION_NAME" \ --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
**注意:**替换前面命令中的以下内容:
带有 Lambda 函数名称的 function-name 值
将 source-arn 值替换为您的 API 的源 ARN
带有唯一标识语句的语句标识符的 statement-id 值
相关信息
相关内容
- AWS 官方已更新 6 个月前
- AWS 官方已更新 2 年前
- AWS 官方已更新 2 个月前
- AWS 官方已更新 2 年前