检查 S3 存储桶中是否有过去两小时内的新文件



我需要创建一个监控工具,用于检查存储桶(每个存储桶有 1000+ 个文件(中是否有在过去两小时内创建的新对象,如果未创建对象,则发送消息。 我的第一个想法是创建一个每 20 分钟运行一次的 lambda 函数。所以我创建了python3 + boto3代码:

import boto3
from datetime import datetime,timedelta
import pytz
import sys
s3 = boto3.resource('s3')
sns = boto3.client('sns')
buckets = ['bucket1', 'bucket2', 'bucket3']
check_fail = []
def check_bucket(event, context):
time_now_UTC = datetime.utcnow().replace(tzinfo=pytz.UTC)
delta_hours = time_now_UTC - timedelta(hours=2)
for bucket_name in buckets:
bucket = s3.Bucket(bucket_name)
for key in bucket.objects.all():
if key.last_modified >= delta_hours:
print("There are new files in the bucket %s" %bucket)
break
else:
check_fail.append(bucket)
if len(check_fail) >= 1:    
sns.publish(
TopicArn='arn:aws:sns:us-east-1:xxxxxxxxxxxxxx:xxxxxx',
Message="The following buckets didn't receive new files for longer than 2 hours: %s" %check_fail,
Subject='AWS Notification Message' )
else: 
print("All buckets have new files")

由于每个存储桶内有大量对象,因此此方法不起作用。通过"key.last_modified"进行检查花费的时间太长。

有人知道我如何实现这一目标吗?

谢谢!

如您所见,S3 经过优化,可以获取您已经知道其路径的对象,而不是列出查询文件。事实上,listObjects API 在迭代期间并不是非常稳定,如果在开始查询之前添加大型文件集,则可能会丢失这些文件。

根据您拥有的存储桶数量,一种方法是对 S3 事件使用 lambda 触发器:

  • S3 自动引发 s3:ObjectCreated 事件并调用 lambda
  • Lambda 在 DynamoDb 中为该存储桶的条目设置"LastUpdate"属性
  • 每隔 20 分钟(左右(查询/扫描一次 Dynamo 表,以查看最新更新的时间。

另一种解决方案是在存储桶上启用 CloudWatch monioring:https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html

然后,您可以将过去两个小时内的PutRequestsPostRequests指标相加(您可以使用 boto3 以编程方式获取 cloudwatch 指标(以获取更新指示(尽管,只有当文件写入一次且从未编辑时,您的计数才可能是准确的(。

Amazon S3可以将事件发布到 Lambda 并通过将 S3 事件数据作为参数传递来调用您的函数。因此,您可以以这样一种方式对其进行配置,即已上传的每个新 s3 对象都将触发您的功能。根本不需要安排它。

最新更新