如何为指定S3存储桶配置CloudWatch指标过滤规则
配置目标
- 基于CloudWatch指标过滤器实现S3存储桶上传行为监控,当指定存储桶连续24小时无对象上传时自动发送告警通知
- 不采用S3事件通知结合DynamoDB的替代方案,全程通过CloudWatch能力完成配置
当前问题
现有过滤器规则会扫描捕获所有存储桶的S3上传操作日志,无法限定仅统计单个目标存储桶的事件,当前使用的过滤规则如下:
{ ($.eventSource = s3.amazonaws.com) && (($.eventName = CopyObject) || ($.eventName = CompleteMultipartUpload) || ($.eventName = PutObject) || ($.eventName = PostObject)) }
对应捕获到的目标存储桶CloudTrail日志片段如下,可见存储桶名称存储在requestParameters嵌套字段下:
"eventTime": "2022-07-05T06:50:46Z", "eventSource": "s3.amazonaws.com", "eventName": "PutObject", "awsRegion": "eu-west-1", "sourceIPAddress": "cloudtrail.amazonaws.com", "userAgent": "cloudtrail.amazonaws.com", "requestParameters": { "bucketName": "my-test-s3-bucket", "x-amz-acl": "bucket-owner-full-control", "x-amz-server-side-encryption-context": }
调整方法
原有规则缺少对嵌套字段requestParameters.bucketName的精确匹配条件,直接在规则中追加该字段的判断即可,调整后的过滤规则如下(将my-test-s3-bucket替换为你实际需要监控的存储桶名称):
{ ($.eventSource = s3.amazonaws.com) && ($.requestParameters.bucketName = "my-test-s3-bucket") && ( ($.eventName = CopyObject) || ($.eventName = CompleteMultipartUpload) || ($.eventName = PutObject) || ($.eventName = PostObject) ) }
配置校验与注意事项
- CloudWatch指标过滤器匹配JSON嵌套字段时必须写全层级路径,直接写
$.bucketName会因为字段路径不匹配导致规则不生效 - 存储桶名称为精确字符串匹配,必须用双引号包裹,大小写与实际桶名完全一致
- 规则保存前可使用CloudWatch控制台内置的过滤器测试功能,分别粘贴目标桶、其他桶的S3事件日志验证匹配结果,确认仅目标桶的上传事件会被命中
- 后续创建告警规则时,选择该过滤器生成的自定义指标,设置告警条件为连续24小时窗口内指标累计值小于1,即可实现24小时无上传触发告警的需求
内容的提问来源于stack exchange,提问作者jarral rajput
相关产品推荐
相关产品推荐

