使用python boto3

时间:2018-04-07 18:57:33

标签: python-3.x amazon-web-services amazon-s3 boto3

我正在尝试下载最近24小时添加到S3存储桶的新文件 - 但是,S3存储桶包含大量文件。

根据我的理解,s3桶使用平面结构,其中文件按键名称按字母顺序存储。

我编写了一个脚本来使用线程来存储存储在存储桶中的所有数据。但是,现在我拥有本地系统上的所有文件,我希望每24小时使用已上传到S3的任何新文件更新数据库。

大多数论坛建议使用“上次修改”来搜索正确的文件,然后下载与指定数据匹配的文件。

首先,从s3存储桶下载文件是否会更改“上次修改”?这似乎可能会导致问题。

其次,这似乎是一个非常有效的过程 - 每次搜索整个存储桶中的文件并使用正确的“最后修改”,然后下载...特别是因为存储桶包含大量文件。有没有更好的方法来实现这一目标?

最后,预修复过滤器是否会使此过程更有效?或者这还需要搜索所有文件。

提前致谢!

2 个答案:

答案 0 :(得分:1)

我会用这个答案走另一个方向......你说得对,这个过程效率低下。我不确定您要处理的数据的数量和大小,但您基本上都在谈论您需要批处理作业才能下载新文件。搜索大量密钥是错误的方法,并且在AWS中是一种反模式。在根目录中,您需要在新文件进入时跟踪它们。

解决此问题的最佳方法是使用Lambda函数(python,因为您已经熟悉),当新对象存放在S3存储桶中时会触发该函数。当新文件进入时,该功能会起什么作用?

如果我必须解决这个问题,我会做以下其中一项:

  • 将新文件的密钥与时间戳一起添加到DynamoDB表中。每当有新文件进入时,表格会全天增长。当您运行批处理作业时,请读取该表的内容并下载所有引用的键,从DynamoDB表中删除该行。如果您想获得想象力,可以根据时间戳列进行查询,并且永远不会从表中清除行。
  • 将文件复制到第二个"取件"桶。当您的批处理作业运行时,您只需读取此拾取桶中的所有文件并将其删除。你必须要小心这个。它非常简单,但你必须考虑你存放的文件的大小/数量,这样你就不会遇到Lambda 5min的执行限制。

我不能真正推荐其中一个,因为我不熟悉您的规模,成本偏好等。对于典型的用例,我可能会使用DynamoDB表解决方案。我想你会发现DynamoDB在Python3中与之交互是多么容易。

答案 1 :(得分:1)

此处添加的另一种解决方案..

您可以在S3上启用广告资源,它会为您提供存储桶中所有文件的每日报告,包括元数据,例如CSV格式的日期。

生成CSV时(第一个可能需要48小时),您可以生成一个可以相应下载的新文件列表。之前提到的dynamo lambda选项肯定会为您提供更实时的解决方案。

另外,我认为修改日期仅受PUT和POST操作的影响