我正在用python编写脚本,需要在存储桶中获取最新的修改文件(使用前缀),但据我所知,我无法直接从python进行查询(至少使用boto3) ,因此我必须检索存储桶中每个对象的信息。
我将不得不查询几千个文件,而且我不想在帐单上感到惊讶。
如果我执行查询以检索存储桶中所有对象的元数据,以便稍后在本地对它们进行排序,那么我将按单个请求收费,还是将其计为每个对象的请求?
提前谢谢大家
答案 0 :(得分:4)
人们常用的一种方法是通过s3api
将每1000个对象的多个调用合并为一个LIST请求,然后使用--query
定义您的过滤操作,例如:
aws s3api list-objects-v2 --bucket your-bucket-name --query 'Contents[?contains(LastModified, `$DATE`)]'
尽管请记住,这不是一个好的解决方案,其原因有两个:
--query
参数不是在服务器端执行的。恰好是此aws-cli命令的功能。为了说明这一点,它是在boto3
中的样子,如您所见,我们仍然需要在客户端进行查询:import boto3
client = boto3.client('s3',region_name='us-east-1')
response = client.list_objects_v2(Bucket='your-bucket-name')
results = sorted(response['Contents'], key=lambda item: item['LastModified'])[-1])
您可能*可能会 *根据您的特定用例来做的事情是利用S3事件通知将事件自动发布到SQS
,这使您有机会轮询所有事件S3对象事件以及它们的元数据信息(更轻量级)。这仍然会花费一些钱,并且如果您已经有一个现有的大型存储桶,那么它将无法正常工作。加上您必须主动轮询消息的事实,因为消息不会持续太久。
在我看来,这听起来像是S3广告资源的好用例。它将为您提供每日文件,该文件由对象列表及其基于您的规范的元数据信息组成。参见https://docs.aws.amazon.com/AmazonS3/latest/user-guide/configure-inventory.html