AWS Alert 监控一个key被周期性创建一个bucket

AWS Alert to monitor a key is periodically createded a bucket

我正在使用 AWS Lambda(由 Cloudwatch 规则每小时触发一次)来触发 EMR 集群的创建以执行作业。 EMR 集群完成其步骤后将结果文件写入 S3 存储桶。关键路径是一天中的小时

/bucket/2017/04/28/00/result.txt
/bucket/2017/04/28/01/result.txt
..
/bucket/2017/04/28/23/result.txt

我想发出一些警报,以防 EMR 作业由于某种原因无法创建该小时的 result.txt。

我已经在 Lambda 调用计数和 lambda 错误计数上设置了一些警报,但我没能找到合适的警报来测试 EMR 是否真正正确地完成了它的工作。

请注意,Lambda 每 3 分钟触发一次,大约需要 15 分钟才能完成。一个好的解决方案是创建另一个 Lambda,它每隔 30 分钟触发一次,并检查存储桶中是否存在正确的密钥?如果没有,那么将一些日志写入我可以监控的 cloudwatch 并使用它们来创建我的警报?

还有什么其他方法可以实现此警报?

S3 提供有关每个存储桶对象计数的免费指标,但发布频率不足以满足您的用例。

S3 请求指标上的 CloudWatch 警报

如果需要付费,您可以 enable CloudWatch metrics for S3 requests 启用在 1 分钟内写入数据的请求指标。例如,您可以针对以下 S3 CloudWatch 指标创建相关警报:

  • PutRequests sum <= 0 每小时
  • 4xxErrors sum >= 1 超过 1 分钟
  • 5xxErrors sum >= 1 超过 1 分钟

HTTP 状态代码以更短的间隔发出警报(低至 1 分钟),将在这些故障发生时提供反馈。

关于 Put 事件的 CloudWatch 警报

如果您不想产生 S3 请求指标的成本,您可以改为配置一个事件以将消息发布到 S3 put 上的 SNS 主题。您可以使用 CloudWatch 设置对已发布消息总数(或未发布消息数)的警报。

然后您可以创建基于此主题的 CloudWatch 警报,未能发布消息。

  • 维度: TopicName = YOURSNSTOPIC

  • 命名空间: AWS/SNS

  • 指标名称: NumberOfMessagesPublished

  • 阈值: NumberOfMessagesPublished <= 0 持续 60 分钟(4 个周期)

  • 统计:总和

  • 周期:15分钟

  • 将缺失数据视为:违反

  • 操作: 向另一个单独的 SNS 主题发送通知,向您发送 email/sms,或以其他方式发布到某些警报服务。

讨论

请注意,这两种 CloudWatch 解决方案都有一个警告,即它们不会恰好在整点 30 分钟发出警报,但它们会捕获您的整个监控时间段。

您可以通过调整周期或 how cloudwatch treats missing data 从这些基本示例中进一步配置以获得更好的结果。

在整点过后 30 分钟触发的 lambda (via cron-style scheduling) 来检查 S3 请求指标或 SNS 主题的 "NumberOfMessagesPublished" 指标而不是依赖 CloudWatch 警报也可以实现这一点。如果恰好在整点 30 分钟触发很重要,这可能是更好的选择,因为 CloudWatch 警报的触发时间不会那么精确。

进一步阅读