我有一个 IoT 工作流程,其中各种设备将数据发送到 S3 存储桶,这会触发 Lambda。 Lambda 处理数据并可能触发警报(例如,由于 DeviceX 的温度高于 Y)。我希望当新设备遇到此类警报时收到电子邮件警报,每台设备每天最多收到一封电子邮件。
我希望实现的解决方案是设置 SNS 编写器为 SNS 主题端点输出电子邮件正文,其中包括设备 ID(在我的设备中全局唯一)、警报 ID 和日期。
在 SNS 设置中,我希望我的订阅者能够在第一次发生此类事件时收到电子邮件。但由于同一设备 ID 每小时可能会多次触发 Lambda,因此即使警报条件仍然为真,他们也不应该为每次此类调用收到新电子邮件。如果另一台设备遇到警报,仍然应该触发一封新的单独电子邮件 - 同样,如果第一台设备第二天继续处于警报状态,则会发送一封新电子邮件,因为现在日期发生了变化。
我相信这可能与订阅过滤器或重复数据删除有关,但我尚未找到合适的解决方案。
SNS 消息过滤功能对此用例没有帮助。 SNS 重复数据删除功能仅在 5 分钟时间窗口内起作用。如果您关心 24 小时的时间段,则不能指望 SNS 为您处理此问题。您需要在 Lambda 函数中添加代码来确定它是否确实需要将消息发送到 SNS,或者最近是否已发送相同的消息。
处理此问题的最佳方法是创建一个 DynamoDB 表,您的 Lambda 函数在发送消息之前将其存储在其中。在发送消息之前,它会检查该消息是否已存在于 DynamoDB 表中,如果存在,它将跳过将消息发送到 SNS。
您可以在 DynamoDB 消息上配置 TTL 过期时间,以便它们在 24 小时后自动从表中删除。