首页 > 解决方案 > 根据消息组 ID 为 SQS FIFO 队列授予权限?

问题描述

我正在构建一个向外部系统发送命令的系统(全部相同,但位置和 ID 不同)。

命令被发送到 FIFO SQS 队列,外部系统从该队列读取和删除。

目前的计划是为每个外部系统创建一个队列,所以我只需要一个 Lambda 来在系统的数据库表更改时更新队列列表。

但我可以看到 SQS FIFO 支持消息组 ID,所以我想知道我是否应该只有一个队列,所有系统只从自己的消息组 ID 中读取。

我喜欢这个解决方案的简单性 - 但是,我看不到一种方法来限制读取和删除特定消息组的消息的访问权限,这意味着如果一个外部系统受到威胁,它的凭据可以用来劫持共享队列所有外部系统,因此,删除一切。

是否有解决方法,所以我可以以任何方式为特定队列和消息组 ID 设置一些权限?

我还担心缺少仅清除一组消息而不是整个队列的选项。

标签: amazon-sqsamazon-iam

解决方案


您无法从 FIFO 队列中的特定消息组“读取”,并且没有相关权限。

消息组是不透明的标签,它告诉 FIFO 队列是否必须以相对于彼此的严格 FIFO 顺序将任何两条消息传递给消费者。如果两条消息共享同一个消息组,则它们必须严格排序,但两个不同 message-group-id 的消息不需要严格排序。

当存在并行的相同消费者时,此功能允许更快地整体处理消息,因为如果没有此功能,任何时候都只能有一个消费者处理消息,并且队列的整体吞吐量将受限于单个消费者可以处理的速度一条消息(因为只要一条消息在传输中,就不会将任何消息传递给另一个消费者)。

消息组 ID

指定消息属于特定消息组的标记。属于同一消息组的消息始终按照相对于消息组的严格顺序逐一处理(但是,属于不同消息组的消息可能会乱序处理)。

[...]

如果您需要一组有序消息,请为发送到 FIFO 队列的消息提供相同的消息组 ID。

https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html

另请注意,虽然ReceiveMessageAPI允许您要求随每条消息返回 message-group-id,但它没有规定您要从哪个 message-group-id 接收消息,因为这不是此功能。


推荐阅读