我有一个用例,其中某个进程每 6 小时将一个文件放入 S3 存储桶。这个存储桶中已经有数千个文件,如果在过去 7 小时内没有添加新文件,我想生成一个 sns 警报或其他东西。什么是合理的方法?谢谢
2 回答
有几种可能的方法:
- 每隔几分钟检查一次水桶
- 跟踪最后一个新文件
- 使用 Amazon CloudWatch 警报
每隔几分钟检查一次存储桶
配置 Amazon CloudWatch Events 以每隔几分钟触发一次 AWS Lambda 函数(取决于您希望它报告的速度),该函数获取存储桶列表并检查添加最后一个对象的时间戳。如果超过 7 小时,请发送警报。
这种方法非常简单,但每隔几分钟就会做很多工作,包括在添加对象后的 7 小时内。另外,如果您有很多对象,这可能会消耗大量 Lambda 时间和 API 调用。
跟踪最后一个新文件
- 在 Amazon S3 存储桶上配置一个事件,以在将新文件添加到存储桶时触发 AWS Lambda 函数。将当前时间存储在 DynamoDB 表中(或者,如果您真的想节省成本,请将其存储在 Systems Manager Parameter Store 或另一个存储桶中的 S3 对象中)。每当添加新文件时,这将更新日期。
- 配置 Amazon CloudWatch Events 以每隔几分钟触发一个 AWS Lambda 函数(取决于您希望它报告的速度),该函数检查 DynamoDB(或它的存储位置)中的“最后更新日期”。如果超过 7 小时,则触发警报。
虽然这种方法有更多的组件,但它实际上是一个更简单的解决方案,因为它不需要查看 S3 中的对象列表。相反,它只记得添加最后一个对象的时间。
你可以想出一个更聪明的方法,而不是每隔几分钟检查一次,而是在 7 小时内安排一个警报功能。每当添加新文件时,它都会更改计划以再次将其放置 7 小时。这就像不断推迟牙医预约一样。:)
使用 Amazon CloudWatch 警报
这是一种更简单的方法,它使用 CloudWatch 警报来触发通知。
- 将 S3 存储桶配置为在添加对象时触发 Lambda 函数。Lambda 函数将自定义指标发送到 Amazon CloudWatch。
SUM
创建 CloudWatch 警报以在过去 6 小时内自定义指标为零时触发通知。还将其配置为在警报进入INSUFFICIENT_DATA状态时触发,以便在没有发送数据时正确触发(这比零指标更有可能,因为 Lambda 函数在没有创建对象时不会发送数据)。
唯一的缺点是警报周期只有几个选项。可以设置6小时,但我觉得不能设置7小时。
如何提醒
至于如何提醒某人,向 Amazon SNS 主题发送消息是一个好主意。人们可以通过电子邮件、短信和其他各种方式订阅。
@John Rotenstein 描述的 Amazon CloudWatch 警报方法对于大多数用例来说绝对是最简单的选择,并且效果很好。只需注意一件事:CloudWatch 警报对每个指标有 24 小时的限制(EvaluationPeriods * Period 必须 <= 86400s)。因此,如果您希望您的存储桶每天接收文件少于一次,那么您需要使用不同的方法。