我们拥有一个AWS帐户,帐户A。我们依靠外部团队向他们帐户B中的SNS主题发布消息。我们使用帐户A中的SQS队列订阅帐户B中SNS主题。帐户B的所有者已将帐户A列入白名单,以订阅SNS主题。
现在,我们想为多个(新(帐户订阅帐户B中的SNS主题。然而,拥有帐户B的团队没有能力手动将我们将创建的许多帐户列入白名单。
我们有没有办法通过在账户a中创建的IAM角色等方式,将账户a的权限委派或代理给我们正在创建的所有新账户?
问题是帐户B试图将权限授予帐户a的特定用户。正如您所提到的,如果您需要设置多个帐户,这可能是一个问题。
你可以用多种方法来解决这个问题。
- 帐户B授予帐户A的根权限。然后,帐户A具有将访问权限委派给任何IAM角色/用户的完全权限。这是一篇包含此设置方法的博客文章https://aws.amazon.com/blogs/compute/cross-account-integration-with-amazon-sns/
- 在帐户A中创建IAM组,并将用户分配给该组。然后,在帐户B中,将权限授予帐户A的组,而不是特定用户。以下是通过组提供访问的示例
请注意,如果使用解决方案#1,帐户A中的任何IAM用户都可以访问SNS资源。如果多个应用程序在帐户A中运行,这可能是一个问题。
您当前的情况是:
- 您拥有的
Account-A
中的Amazon SQS队列(Queue-A
( - 其他人拥有的
Account-B
中的亚马逊SNS主题(Topic-B
( - 权限已添加到
Topic-B
,允许Account-A
订阅主题
上述操作效果良好。
新要求:
- 允许
Account-C
和Account-D
订阅Topic-B
Account-B
的所有者不希望修改Topic-B
上的权限以允许这些订阅请求
解决方案
与其让Account-C
和Account-D
发送Subscribe()
请求,不如让Topic-B
的所有者直接订阅新队列。
你说"拥有帐户B的团队没有能力手动将我们将创建的许多帐户列入白名单。">
这是基于Account-C
和Account-D
本身应该向Topic-B
发送Subscribe请求的想法。相反,我建议您将Queue-C
和Queue-D
的ARN提供给拥有Topic-B
的团队,并要求他们将这些队列添加为订阅者。这不需要对Topic-B
上的权限策略进行任何更改。
然而,有几件事需要注意:
Queue-C
和Queue-D
将需要确认订阅。最简单的方法是查看订阅主题后发送到队列的初始消息,复制消息中显示的订阅URL,然后将其粘贴到web浏览器中。这是一个一次性的过程- CCD_ 25和CCD_ 26将需要添加允许CCD_。您可能已经为
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"
}
}
}
]
}
另请参阅:
- 将亚马逊SNS消息发送到其他帐户中的亚马逊SQS队列-亚马逊简单通知服务
- 使用亚马逊SNS进行系统到系统的消息传递,并将亚马逊SQS队列作为订阅者-亚马逊简单通知服务
如果你不能依靠Account-B
的所有者为你做任何事情,那么你唯一的选择就是:
- 在Account-A(
Topic-A
(中创建您自己的SNS主题,您可以在其中管理订阅 - 创建一个将向
Topic-A
发送消息的AWS Lambda函数 - 将Lambda函数订阅到现有的
Queue-A
,这样发送到Queue-A
的任何消息都将重新发送到Topic-A
- 让所有帐户都像使用
Topic-B
一样使用Topic-A
通过这种方式,您可以使用现有的SQS队列(Queue-A
(作为您控制下的新SNS主题(Topic-A
(的"中继"。您还需要将从Queue-A
消费的当前应用程序更改为从订阅了Topic-A
的新队列消费。