具有附加层的 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 的特定用户授予权限。如您所述,如果您需要设置多个帐户,这可能是个问题。
您可以通过多种方式解决此问题。
- 账号B给了账号A的root权限。然后,账户 A 拥有将访问权限委派给任何 IAM 角色/用户的完全权限。这是一个博客 post 包含这种设置方法 https://aws.amazon.com/blogs/compute/cross-account-integration-with-amazon-sns/
- 在账户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-C
和Account-D
订阅Topic-B
Account-B
的所有者不希望修改 Topic-B
的权限以允许这些订阅请求
解决方案
代替Account-C
和Account-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-C
和 Account-D
应该自己将订阅请求发送到 Topic-B
的想法。相反,我建议您向拥有 Topic-B
的团队提供 Queue-C
和 Queue-D
的 ARN,并要求他们将这些队列添加为订阅者。 不需要 对 Topic-B
上的权限策略进行任何更改。
但是,有几点需要注意:
Queue-C
和 Queue-D
需要确认 订阅。最简单的方法是查看订阅主题后发送到队列的初始消息,复制消息中显示的订阅 URL,然后将其粘贴到 Web 浏览器中。这是一次性的过程。
Queue-C
和 Queue-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
.
的新队列使用
我们拥有一个 AWS 账户,即账户 A。我们依靠外部团队向其账户 B 中的 SNS 主题发布消息。我们使用账户 A 中的 SQS 队列订阅中的 SNS 主题帐户 B。帐户 A 已被帐户 B 的所有者列入白名单以订阅 SNS 主题。
现在,我们想为多个(新)帐户订阅帐户 B 中的 SNS 主题。但是,拥有帐户 B 的团队没有能力手动将我们将要创建的许多帐户列入白名单。
我们是否可以通过在账户 A 中创建的 IAM 角色之类的方式,将账户 A 的权限委托或代理给我们正在创建的所有新账户?
问题是帐户 B 正在尝试向帐户 A 的特定用户授予权限。如您所述,如果您需要设置多个帐户,这可能是个问题。
您可以通过多种方式解决此问题。
- 账号B给了账号A的root权限。然后,账户 A 拥有将访问权限委派给任何 IAM 角色/用户的完全权限。这是一个博客 post 包含这种设置方法 https://aws.amazon.com/blogs/compute/cross-account-integration-with-amazon-sns/
- 在账户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-C
和Account-D
订阅Topic-B
Account-B
的所有者不希望修改Topic-B
的权限以允许这些订阅请求
解决方案
代替Account-C
和Account-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-C
和 Account-D
应该自己将订阅请求发送到 Topic-B
的想法。相反,我建议您向拥有 Topic-B
的团队提供 Queue-C
和 Queue-D
的 ARN,并要求他们将这些队列添加为订阅者。 不需要 对 Topic-B
上的权限策略进行任何更改。
但是,有几点需要注意:
Queue-C
和Queue-D
需要确认 订阅。最简单的方法是查看订阅主题后发送到队列的初始消息,复制消息中显示的订阅 URL,然后将其粘贴到 Web 浏览器中。这是一次性的过程。Queue-C
和Queue-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
.