如何从外部 SQS 队列活动触发 AWS Lambda 函数

Posted

技术标签:

【中文标题】如何从外部 SQS 队列活动触发 AWS Lambda 函数【英文标题】:How to Trigger an AWS Lambda Function from External SQS Queue Activity 【发布时间】:2020-01-14 22:22:15 【问题描述】:

我正在尝试配置一个 lambda 函数以从我已被授予读取和删除权限的 SQS 队列中使用,但我不拥有/拥有该队列的配置。有没有办法为我的 AWS 账户中不存在的队列使用 lambda 的 SQS 触发器功能?

如果不是,有哪些替代方案不包括检查预定事件的队列。

【问题讨论】:

【参考方案1】:

如果 SQS 队列的所有者为您提供了必要的权限(请参阅 the setup docs 了解这些权限是什么),您可以执行此操作。但是,你不应该

订阅其他人的 SQS 队列是一种反模式。 这是因为队列代表工作的积压,而隐含的功能是所有进入的内容最终都会出现。队列所做的只是将输入流与输出流分开(数据流入的速度可能快于流出的速度)。

然而,这种流动的想法意味着当有东西出来时,它不再在队列中。 (这里警告:有解决方法,但它们通常不是首选)。然而,消费者的目标始终是处理队列中的所有内容。这可能是由一个消费者控制下的多个线程完成的,但最终的结果仍然是一切都处理完毕。如果有多个消费者,那么它们必然会相互竞争,并且它们都无法处理队列中的所有内容。

我们如何确保没有多个消费者?很简单:消费者拥有队列。没有其他消费者被授予读取权限。很可能是消费者以外的其他人控制队列的填充(接收写入权限) - AWS 对此有完美的解决方案:

SNS 主题: An SNS topic is a source of data。实际上,它是一个发布者。当其他人希望您访问他们的数据时,他们允许您成为他们主题的订阅者。当新消息发布到 SNS 主题时,订阅该主题的每个人都会获得一份副本。该副本会发生什么由订户决定:可以直接对其进行操作,存储以供以后操作,或间接操作,例如通过被放置在队列中。这是Pub-Sub model。它将一个实体(发布者)创建消息并将其发送给许多其他实体的详细信息与每个接收者(订阅者)关于如何使用这些消息的个人决定分开。


TL;DR:让当前拥有队列的人改为发布到 SNS 主题,然后设置一个订阅该主题的队列(或任何你喜欢的)。

【讨论】:

这很有意义。我认为另一方构建他们的解决方案的方式并没有将 SNS 作为一种向第三方发布数据的方式。 alayacare.github.io/external-integration-docs/img/… 我相信在这种情况下我是这个特定队列的唯一消费者,但我认为我没有能力说服他们为我的情况配置 SNS 主题。是否有一种机制可以让他们的队列通知我控制并填充以供我使用的 SNS 主题?这将使我的 lambda 函数在我自己的生态系统中触发。

以上是关于如何从外部 SQS 队列活动触发 AWS Lambda 函数的主要内容,如果未能解决你的问题,请参考以下文章

AWS SAM 模板 - 定义由 API Gateway 触发的 SQS 队列

AWS SQS - CDK - 如何创建主题过滤器

消息发布到 SQS 时如何触发 lambda?

aws sqs fifo队列和标准队列之间的转换

从 AWS Lambda 读取 SQS 队列

AWS SWF和SQS关系是否与Celery和RabbitMQ类似?