【问题标题】:Error while doing AWS Lambda Cross Account integration with AWS SNS与 AWS SNS 进行 AWS Lambda 跨账户集成时出错
【发布时间】:2026-02-22 18:40:01
【问题描述】:

我想从 SNS(账户 A)向 Lambda(账户 B)发送通知。按照本教程进行操作,但仍然出现以下错误: https://docs.aws.amazon.com/lambda/latest/dg/with-sns-example.html

错误代码:AccessDeniedException - 错误消息:用户:arn:aws:sts::AccountA:assumed-role/AdministratorAccessRole/A12345 无权执行:lambda:AddPermission on resource:arn:aws:lambda:us-east -1:AccountB:function:TestLambda

在我所做的下面: 1. Account A中,在SNS的Access Policy中添加如下策略:

{
  "Version": "2008-10-17",
  "Id": "__default_policy_ID",
  "Statement": [
    {
      "Sid": "_abc_",
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::AccountB:root"
      },
      "Action": [
        "SNS:Subscribe",
        "SNS:Receive"
      ],
      "Resource": "arn:aws:sns:us-east-1:AccountA:TriggerLambdaB-SNS"
    }
  ]
}

2。在账户 B 中,在 Lambda 的 Resource-Based Policy 中添加以下策略:

    {
  "Version": "2012-10-17",
  "Id": "default",
  "Statement": [
    {
      "Sid": "_abc_",
      "Effect": "Allow",
      "Principal": {
        "Service": "sns.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-1:AccountB:function:TestLambda",
      "Condition": {
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:sns:us-east-1:AccountA:TriggerLambdaB-SNS"
        }
      }
    }
  ]
}

我可以在账户 B 中我的 Lambda 的触发 Lambda 部分下看到 SNS 名称。但是当我尝试在 SNS 下订阅 Lambda 时,出现此错误。请指导我在这里缺少什么。

是因为我在这些帐户中拥有不同类型的角色,例如帐户 A 中的 AdminAccessRole 和帐户 B 中的 FederatedRoleAccess?

【问题讨论】:

  • 您能否澄清一下“发送通知”的含义?您是说您希望 Account-B 的 Lambda 函数订阅 Account-A 中的 SNS 主题,以便发送到 SNS 主题的消息将触发 Lambda 函数的调用?
  • 您提供的链接还说,ListSubscriptionsByTopic 应该用于设置跨账户 lambda 订阅。
  • @Marcin 是的,我现在也添加了。但仍然遇到同样的错误。
  • @JohnRotenstein:是的。
  • KMS 呢?你用它加密一些东西吗?跨账户访问 kms 加密资源需要特殊权限。

标签: amazon-web-services aws-lambda amazon-sns


【解决方案1】:

您需要在 Account-B(使用 Lambda 函数)而不是 Account-A(使用 SNS 函数)中运行 aws sns subscribe

否则,您的设置似乎正确。

当我尝试从 Account-A 运行 subscribe 命令时,它说:

调用订阅操作时发生错误(AuthorizationError):账户 ACCOUNT-A 不是 lambda 函数 arn:aws:lambda:ap-southeast-2:ACCOUNT-B:function:foo 的所有者

虽然此错误与您的不同,但您的命令似乎是从 Account-A(使用 SNS)而不是 Account-B(使用 Lambda)运行的。

旁注:Tutorial: Using AWS Lambda with Amazon Simple Notification Service 文档中似乎存在一个小错误,其中 Lambda 的基于资源的策略(您的问题中的第二个)显示为 SourceArn指的是 Account-B-Lambda,而应该是 Account-A-SNS。但是,您在上面的政策中似乎已经正确理解了这一点。

【讨论】:

    最近更新 更多