如何解决 API Gateway REST API 中“Invalid permissions on Lambda function(Lambda 函数的权限无效)”错误?

3 分钟阅读
0

当我使用 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.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xx:function:xxx/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Method completed with status: 500”

使用 Lambda 授权方的 REST API 的 CloudWatch 错误消息

“Sending request to https://lambda.xx.amazonaws.com/2015-03-31/functions/arn:aws:lambda:xx:xxx:function:xx/invocations
Execution failed due to configuration error: Invalid permissions on Lambda function
Execution failed due to configuration error: Authorizer error”

解决方法

要解决这些错误,请执行以下操作之一:

使用本文中介绍的方法之一,将基于资源的 Lambda 调用权限添加到 REST API。

–或者–

配置 AWS Identity and Access Management (IAM) 执行角色,该角色将授予您调用函数的 REST API 权限。

有关更多信息,请参阅调用 API 的 API Gateway 权限模型

注意:

要使用 API Gateway 控制台向具有 Lambda 集成的 REST API 添加 Lambda 调用权限

1.    在 API Gateway 控制台API 窗格中,选择您的 REST API 的名称。

2.    在 Resources (资源) 窗格中,选择已配置的 HTTP 方法。

3.    在 Method Execution (方法执行) 窗格中,选择 Integration Request (集成请求)

4.    对于 Integration type (集成类型),选择 Lambda Function (Lambda 函数)

5.    展开 Lambda Region (Lambda 区域) 下拉列表。然后,选择您的 Lambda 函数所在的 AWS 区域。

6.    选择 Lambda Function (Lambda 函数) 下拉列表。然后,选择您的 Lambda 函数的名称。

7.    出现一个提示,为您提供 Add Permission to Lambda Function (向 Lambda 函数添加权限) 的选项。选择 OK (确定)

8.    选择 Save (保存)。然后,选择 Deploy the API (部署 API) 以将 Lambda 调用权限添加到您的 API。

要使用 CloudFormation 模板向具有 Lambda 集成的 REST API 添加 Lambda 调用权限

将以下代码段添加到 CloudFormation 模板

**重要提示:**将 <api-id> 替换为 apiID。将 FunctionName 值替换为 Lambda 函数的名称。将 SourceArn 值替换为 API 的源 Amazon 资源名称(ARN)。

SampleApiPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/*/<method>/<resource>"

有关如何声明各种 CloudFormation 模板部分的更多信息,请参见模板代码段

要使用 AWS CLI 向具有 Lambda 集成的 REST API 添加 Lambda 调用权限

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

重要提示:function-name 值替换为 Lambda 函数的名称。将 source-arn 值替换为 API 的源 ARN。将 statement-id 值替换为区分同一策略中其他语句的语句标识符。

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

要使用 API Gateway 控制台向具有 Lambda 授权方的 REST API 添加 Lambda 调用权限

1.    为 API Gateway 创建一个 IAM 角色,该角色允许执行“lambda:InvokeFunction”操作。然后,将 IAM 角色 ARN 复制到剪贴板。

2.    在 API Gateway 控制台API 窗格中,选择您的 REST API 的名称。

3.    在 Authorizers (授权方) 窗格中,选择已配置的 Lambda 授权方。然后选择 Edit (编辑)

4.    对于 Lambda Invoke Role (Lambda 调用角色),输入您复制到剪贴板的 IAM 角色 ARN。

5.    选择 Save (保存)。然后选择 Deploy the API (部署 API)

要使用 CloudFormation 模板向具有 Lambda 授权方的 REST API 添加 Lambda 调用权限

将以下代码段添加到 CloudFormation 模板

**重要提示:**将 <api-id> 替换为 apiID。将 FunctionName 值替换为 Lambda 函数的名称。将 <auth-id> 替换为 Lambda 授权方的 authorizerId

SampleApiAuthPermission:
    Type: AWS::Lambda::Permission
    Properties:
      Action: "lambda:InvokeFunction"
      FunctionName: !Ref MyLambdaFnA1
      Principal: "apigateway.amazonaws.com"
      SourceArn: !Sub "arn:aws:execute-api:${AWS::Region}:${AWS::AccountId}:<api-id>/authorizers/<auth-id>"

有关如何声明各种 CloudFormation 模板部分的更多信息,请参见模板代码段

要使用 AWS CLI 向具有 Lambda 授权方的 REST API 添加 Lambda 调用权限

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

**重要提示:**将 function-name 值替换为 Lambda 函数的名称。将 source-arn 值替换为 API 的源 ARN。将 statement-id 值替换为区分同一策略中其他语句的语句标识符。

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 基于资源的策略

如何设置 API Gateway 的访问日志记录?

相关视频

AWS 官方
AWS 官方已更新 2 年前