gpt4 book ai didi

amazon-web-services - 在过去两个小时内检查 S3 存储桶中是否有新文件

转载 作者:行者123 更新时间:2023-12-05 04:04:19 25 4
gpt4 key购买 nike

我需要创建一个监控工具,用于检查存储桶(每个存储桶包含 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 监控:https://docs.aws.amazon.com/AmazonS3/latest/dev/cloudwatch-monitoring.html

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

关于amazon-web-services - 在过去两个小时内检查 S3 存储桶中是否有新文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52736803/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com