在python中检查同一个桶中多个s3密钥是否存在的最有效方法是什么?

时间:2018-06-01 07:49:59

标签: python amazon-web-services amazon-s3 boto3

我有一个同一个存储桶my_s3_bucket的S3键列表。

找出aws S3中实际存在哪些密钥的最有效方法是什么。通过高效,我的意思是低延迟,并希望低网络带宽使用率。

注意:密钥不会共享相同的前缀,因此按单个前缀过滤无效

我能想到的两个次优方法:

  1. 检查每个密钥的存在,一个接一个
  2. 列出存储桶中的所有密钥并在本地检查。如果密钥总数很大,这是不好的,因为列出密钥仍然会导致许多网络呼叫。
  3. 还有更好的选择吗?

1 个答案:

答案 0 :(得分:1)

回答您的问题:S3 API没有公开替代方案。

使用多线程或异步I / O是减少实现多个请求所需的实际时间的可靠方法,通过并行执行,如您所述。

可能值得考虑的进一步增强功能是将此逻辑包装在AWS Lambda函数中,您可以使用存储桶名称和对象键列表作为参数进行调用。并行化Lambda函数内的存储桶操作,并将结果返回给已经解析和插入的调用者,并在一个整齐的响应中。这将把功能和S3之间的大部分带宽使用放在该区域内的AWS网络上,这应该是发生它的最快可能的地方。 Lambda函数是抽象出需要多个API请求的任何AWS交互的绝佳方式。

如果需要,这也允许您使用与主项目不同的语言编写Lambda函数,因为语言在该边界内无关紧要 - 它只是JSON跨越两者之间的边界。在我看来,某些AWS交互在某些语言中比在其他语言中更容易(或以复杂的序列/并行方式执行),因此,例如,即使您的项目是用python编写的,您的函数也可以用Node.JS编写,在调用funcrion并使用它生成的响应时,这没什么区别。