当我尝试将 Lambda 函数订阅到 Amazon SNS 主题时,为什么收到授权错误消息?

上次更新时间:2022 年 3 月 31 日

我尝试将 AWS Lambda 函数订阅到 Amazon Simple Notification Service (Amazon SNS) 主题时收到授权错误消息。如何解决此错误?

简短描述

当您将 Lambda 函数订阅到 SNS 主题时,由于以下原因,您可能会收到授权错误:

  • 您尝试从与您的 Lambda 函数所在账户不同的 AWS 账户创建订阅。
    -或者-
  • 您用于创建订阅的 AWS Identity and Access Management (IAM) 身份没有运行以下 API 操作的权限:
    (Lambda) AddPermission
    (Amazon SNS) Subscribe

要解决此问题,您必须执行以下操作之一,具体取决于导致错误的原因:

  • 确保从您的函数所在的 AWS 账户将 Lambda 函数订阅到 SNS 主题。
    -或者-
  • 确保您正在使用的 IAM 身份有权运行 Lambda AddPermission 和 SNS Subscribe API 操作。

解决方法

根据 Lambda 返回的错误消息验证导致错误的原因

如果您使用与函数所在账户不同的 AWS 账户创建订阅,则 Lambda 将返回以下错误之一:

AWS CLI 错误示例:您尝试从与您的 Lambda 函数所在账户不同的账户创建订阅

An error occurred (AuthorizationError) when calling the Subscribe operation: The account YOUR_AWS_ACCOUNT_ID_1 is not the owner of the endpoint arn:aws:lambda:us-east-1:YOUR_AWS_ACCOUNT_ID_2:function: your_Lambda_function_ARN

AWS 管理控制台错误示例:您尝试从与您的 Lambda 函数所在账户不同的账户创建订阅

Error code: AccessDeniedException - Error message: User: arn:aws:sts::XXXXXXX:XXXXXXX/XXXXX/XXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:us-west-2:XXXXXXX:function:XXXXXXX

如果您使用的是正确的账户,但您的 IAM 身份缺少所需的权限,则 Lambda 或 SNS 会返回以下错误之一:

AWS CLI 错误示例:您用于创建订阅的 IAM 身份没有运行 Lambda AddPermission 操作的权限

An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::XXXXXXX:user/XXXXXXXX is not authorized to perform: lambda:AddPermission on resource: arn:aws:lambda:us-west-2:XXXXXX:function:XXXXXXX because no identity-based policy allows the lambda:AddPermission action

AWS 管理控制台错误示例:您用于创建订阅的 IAM 身份没有运行 Lambda AddPermission 操作的权限

Error code: AccessDeniedException - Error message: User: arn:aws:sts:XXXXXXXX:assumed-role/XXXXXXXX/XXXXX-XXXXXX is not 
authorized to perform: lambda:AddPermission on resource: 
arn:aws:lambda:us-west-2:XXXXXXXXX:function:XXXXXXX because no 
identity-based policy allows the lambda:AddPermission action

当您尝试使用无权运行 SNS Subscribe 操作的 IAM 身份时的 AWS CLI 错误示例

An error occurred (AuthorizationError) when calling the Subscribe operation: User: arn:aws:iam::XXXXXXX:user/XXXXXXXX is not authorized to perform: SNS:Subscribe on resource: arn:aws:sns:us-west-2:XXXXXXXX:XXXXXXX because no resource-based policy allows the SNS:Subscribe action

确保从您的函数所在的 AWS 账户将 Lambda 函数订阅到 SNS 主题

您可以使用 Lambda 控制台或 AWS CLI 将 Lambda 函数订阅至 SNS 主题。

使用 Lambda 控制台将函数订阅到 SNS 主题

注意:当您使用 Lambda 控制台添加 SNS 触发器时,控制台会自动允许来自主体 service:sns.amazonaws.comlambda:InvokeFunction 权限。

1.    在 Lambda 控制台的函数页面上,选择您的函数。

2.    在 Overview(概览)下,选择 Add trigger(添加触发器)。

3.    对于 Trigger configuration (触发配置),选择 Select a trigger (选择触发器),然后选择 SNS

4.    对于 SNS topic (SNS 主题),请从其他 AWS 账户粘贴 SNS 主题 Amazon Resource Name (ARN)。

5.    选中 Enable trigger (启用触发器) 复选框。

6.    选择 Add(添加)。

有关更多信息,请参阅配置 Lambda 函数选项

注意:如果您收到以下错误,则必须向正在使用的 IAM 身份授予 Subscribe API 操作权限。有关故障排除说明,请参阅以下文章:尝试向 Amazon SNS 主题添加订阅者时,如何解决授权错误?

An error occurred (AuthorizationError) when calling the Subscribe operation: User: your_IAM_user_or_role is not authorized to perform: SNS:Subscribe on resource: your_SNS_topic_ARN

使用 AWS CLI 控制台将函数订阅到 SNS 主题

注意:如果您在运行 AWS CLI 命令时遇到错误,请确保使用的是最新版本的 AWS CLI

1.    使用属于您的 Lambda 函数所在的 AWS 账户的 IAM 用户配置 AWS CLI:

aws configure --profile-name your_profile_name

重要提示:确保传递 IAM 用户的 AWS 访问密钥 ID私有密钥

2.    通过添加来自主体 service:sns.amazonaws.comlambda:InvokeFunction 权限允许从 SNS 主题调用 Lambda:

aws lambda add-permission --function-name your_lambda_function_name --statement-id sns_invoke_permission --action lambda:InvokeFunction --principal sns.amazonaws.com --source-arn your_sns_topic_arn

3.    将您的 Lambda 函数订阅到 SNS 主题:

aws sns subscribe --topic-arn your_sns_topic_ARN --protocol lambda --notification-endpoint your_lambda_function_arn --profile your_profile_name_passed_on_#1

注意:如果您收到以下错误,您必须向正在使用的 IAM 身份授予 Subscribe API 操作权限。有关故障排除说明,请参阅以下文章:尝试向 Amazon SNS 主题添加订阅者时,如何解决授权错误?

An error occurred (AuthorizationError) when calling the Subscribe operation: User: your_IAM_user_or_role is not authorized to perform: SNS:Subscribe on resource: your_SNS_topic_ARN

确保您正在使用的 IAM 身份有权运行 Lambda AddPermission 和 SNS Subscribe API 操作

审核您的 IAM 身份的基于身份的策略。确保策略明确允许 IAM 身份运行以下两个操作:
lambda:AddPermission
SNS:Subscribe

如果基于身份的策略未授予所需的权限,则将所需的权限添加到策略。然后,从函数所在的 AWS 账户将您的 Lambda 函数订阅到 SNS 主题。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?