跳至内容

如何解决从 API Gateway REST API 收到的“Invalid permissions on Lambda function”错误?

3 分钟阅读
0

我想解决从 Amazon API Gateway REST API 调用 AWS Lambda 函数时收到的“Invalid permissions on Lambda function”错误。

简短描述

当您的 API Gateway REST API 未经许可调用您的 Lambda 函数时,您会收到“Invalid permissions on Lambda function”错误。

如果您为 REST API 设置 CloudWatch 日志记录,则 API Gateway 还会为集成 Lambda 的 REST API 记录以下错误消息:

“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,您会收到以下错误消息:

“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 调用权限。

**注意:**如果您收到“401 Unauthorized”错误,请参阅为什么我在创建 Lambda Authorizer 后收到 API Gateway“401 Unauthorized”错误?

解决方法

**注意:**如果您在运行 AWS 命令行界面 (AWS CLI) 命令时收到错误,请参阅 AWS CLI 错误故障排除。此外,请确保您使用的是最新版本的 AWS CLI

向具有 Lambda 集成的 REST API 添加 Lambda 调用权限

您可以使用 API Gateway 控制台、AWS CloudFormation 模板或 AWS CLI 来添加调用权限。

**注意:**在以下情境下,您还会收到错误消息“Execution failed due to configuration error: Invalid permissions on Lambda function Method completed with status: 500”:

  • 您尝试从 API Gateway 测试控制台调用 API Gateway。
  • 您从与您在调用 URL 中命名的阶段不同的阶段调用 API Gateway。

为防止出现此问题,请在 CloudFormation 模板和 AWS CLI 命令中使用通配符 (*) 作为阶段名称。

使用 API Gateway 控制台

完成以下步骤:

  1. 打开 API Gateway 控制台
  2. 在导航窗格中,选择 API,然后选择您的 REST API。
  3. 选择 Resources(资源),然后选择 HTTP 方法。
  4. 选择 Method execution(方法执行),然后选择 Integration request(集成请求)。
  5. 对于 Integration type(集成类型),选择 Lambda function(Lambda 函数)。
  6. 展开 Lambda Region(Lambda 区域)下拉列表,然后选择您的 Lambda 函数所在的 AWS 区域。
  7. 选择 Lambda function(Lambda 函数)下拉列表,然后选择您的 Lambda 函数。
  8. 选择 Save(保存)。
  9. 选择 Deploy the API(部署 API)。

使用 CloudFormation 模板

将以下代码片段添加到您的 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"

**注意:**将 FunctionName 替换为您的 Lambda 函数的名称,将 SourceArn 替换为您的 API Amazon 资源名称 (ARN),将 example-api-id 替换为您的 API ID

有关详细信息,请参阅 CloudFormation 模板片段

使用 AWS CLI

运行以下 add-permission 命令:

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

**注意:**将 FUNCITON_NAME 替换为您的 Lambda 函数的名称,将示例源 ARN 替换为您的 API ARN,将 STATEMENT_ID 替换为唯一标识语句的语句标识符。

要仅为特定阶段提供权限,请运行以下命令:

--source-arn "arn:aws:execute-api:API_GW_REGION:YOUR_ACCOUNT:API_GW_ID/STAGE_NAME/METHOD/RESOURCE"

**注意:**将示例源 ARN 替换为您的 API ARN,将 STAGE_NAME 替换为您的阶段名称。

使用 Lambda Authorizer 向 REST API 添加 Lambda 调用权限

您可以使用 API Gateway 控制台、CloudFormation 模板或 AWS CLI 命令来添加调用权限。

使用 API Gateway 控制台

完成以下步骤:

  1. 为 API Gateway 创建 IAM 角色,然后创建允许 lambda:InvokeFunction 操作的策略
    **注意:**记下 IAM 角色 ARN,以便在后续步骤中使用。有关策略示例,请参阅用于调用 API 的 API Gateway 权限模型
  2. 打开 API Gateway 控制台
  3. 在导航窗格中,选择 API,然后选择您的 REST API。
  4. 选择 Authorizer,然后选择 Lambda Authorizer。
  5. 选择 Edit(编辑)。
  6. 对于 Lambda Invoke Role(Lambda 调用角色),输入 IAM 角色 ARN。
  7. 选择 Save(保存)。
  8. 选择 Deploy the API(部署 API)。

使用 CloudFormation 模板

将以下代码片段添加到您的 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"

**注意:**将 FunctionName 替换为您的 Lambda 函数的名称,将 example-api-id 替换为您的 API ID,将 example-auth-id 替换为您的 Lambda Authorizer ID。

使用 AWS CLI

运行以下 add-permission 命令:

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

**注意:**将 FUNCITON_NAME 替换为您的 Lambda 函数的名称,将示例源 ARN 替换为您的 API ARN,将 STATEMENT_ID 替换为唯一标识语句的语句标识符。

相关信息

在 Lambda 中查看基于资源的 IAM 策略

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