具有附加层的 SNS 跨帐户订阅

SNS cross account subscription with additional layer

我们拥有一个 AWS 账户,即账户 A。我们依靠外部团队向其账户 B 中的 SNS 主题发布消息。我们使用账户 A 中的 SQS 队列订阅中的 SNS 主题帐户 B。帐户 A 已被帐户 B 的所有者列入白名单以订阅 SNS 主题。

现在,我们想为多个(新)帐户订阅帐户 B 中的 SNS 主题。但是,拥有帐户 B 的团队没有能力手动将我们将要创建的许多帐户列入白名单。

我们是否可以通过在账户 A 中创建的 IAM 角色之类的方式,将账户 A 的权限委托或代理给我们正在创建的所有新账户?

问题是帐户 B 正在尝试向帐户 A 的特定用户授予权限。如您所述,如果您需要设置多个帐户,这可能是个问题。

您可以通过多种方式解决此问题。

  1. 账号B给了账号A的root权限。然后,账户 A 拥有将访问权限委派给任何 IAM 角色/用户的完全权限。这是一个博客 post 包含这种设置方法 https://aws.amazon.com/blogs/compute/cross-account-integration-with-amazon-sns/
  2. 在账户A中创建一个IAM组,并将用户分配到该组。然后,在帐户 B 中将权限授予帐户 A 的组而不是特定用户。 Here is an example of providing access via groups

请注意,如果您使用解决方案 #1,则账户 A 中的任何 IAM 用户都将能够访问 SNS 资源。如果帐户 A 中有多个应用程序 运行,这可能是个问题。

您目前的情况是:

  • 您拥有的 Account-A 中的 Amazon SQS 队列 (Queue-A)
  • Account-B 中的 Amazon SNS 主题 (Topic-B) 归其他人所有
  • 已向 Topic-B 添加权限,允许 Account-A 订阅 主题

以上方法运行良好。

新要求:

  • 允许Account-CAccount-D订阅Topic-B
  • Account-B 的所有者不希望修改 Topic-B 的权限以允许这些订阅请求

解决方案

代替Account-CAccount-D发送Subscribe()请求,要求Topic-B的所有者直接订阅新队列.

你说"the team that owns account B does not have the capacity to manually whitelist the many accounts we will be creating."

这是基于 Account-CAccount-D 应该自己将订阅请求发送到 Topic-B 的想法。相反,我建议您向拥有 Topic-B 的团队提供 Queue-CQueue-D 的 ARN,并要求他们将这些队列添加为订阅者。 不需要Topic-B 上的权限策略进行任何更改。

但是,有几点需要注意:

  • Queue-CQueue-D 需要确认 订阅。最简单的方法是查看订阅主题后发送到队列的初始消息,复制消息中显示的订阅 URL,然后将其粘贴到 Web 浏览器中。这是一次性的过程。
  • Queue-CQueue-D 将需要添加权限以允许 Topic-B 向其队列发送消息。您可能已经为 Queue-A 做好了准备。该政策如下所示:
{
  "Version": "2012-10-17",
  "Id": "arn:aws:sqs:ap-southeast-2:ccc:my-queue/SQSDefaultPolicy",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "sqs:SendMessage",
      "Resource": "arn:aws:sqs:ap-southeast-2:ccc:my-queue",
      "Condition": {
        "ArnEquals": {
          "aws:SourceArn": "arn:aws:sns:ap-southeast-2:bbb:their-topic"
        }
      }
    }
  ]
}

另请参阅:

如果您不能依靠 Account-B 的所有者为您做任何事情,那么您唯一的选择是:

  • 在您可以管理订阅的帐户 A (Topic-A) 中创建您自己的 SNS 主题
  • 创建一个将消息发送到 Topic-A
  • 的 AWS Lambda 函数
  • 将 Lambda 函数订阅到您现有的 Queue-A,以便发送到 Queue-A 的任何消息都将重新发送到 Topic-A
  • 让所有帐户都使用 Topic-A,就好像它是 Topic-B

这样,您可以将现有的 SQS 队列 (Queue-A) 用作 'relay' 到您控制下的新 SNS 主题 (Topic-A)。您还需要将当前从 Queue-A 使用的应用更改为从订阅 Topic-A.

的新队列使用