在列出使用键作为前缀的对象的所有版本的场景中:
import boto3
bucket = 'bucket name'
key = 'key'
s3 = boto3.resource('s3')
versions = s3.Bucket(bucket).object_versions.filter(Prefix=key)
for version in versions:
obj = version.get()
print(obj.get('VersionId'), obj.get('ContentLength'), obj.get('LastModified'))我是否只因为列出与前缀匹配的对象而收取费用?
如果是这样的话,列出的每个对象/版本是否作为单独的列表请求处理?
发布于 2021-11-27 17:40:59
不,列出的每个对象/版本都不被视为单独的列表请求。您只需要支付给S3的API请求(大约每1000个API请求支付0.005美元)。一个API请求将返回许多(最多1000个)对象/版本,这些对象/版本与指定的前缀匹配。前缀过滤本身在S3中发生在服务器端。
对此进行处理的方法是理解AWS调用最终会导致对AWS服务端点(例如S3 API )的API请求。您需要做的是确定SDK客户端请求如何映射到底层API请求,以确定可能发生的事情。
如果您的请求是一个简单的‘在我的桶中的列表对象’,boto3 SDK将执行一个或多个ListObjectsV2 API调用。我说“或更多”是因为SDK可能需要发出多个API请求,因为API请求通常会产生最大数量的结果(例如,ListObjectsV2响应中的1000个对象)。例如,如果桶中有2500个对象,那么需要向ListObjectsV2 API发出三个S3请求。
如果您的请求是“具有给定前缀的存储桶中的列表对象”,那么您需要知道ListObjectsV2 API调用中存在哪些功能。重要的是,prefix是其中的一个参数。这就是您如何知道S3本身正在对您提供的前缀进行筛选(在您的代码中指定了.filter(Prefix=key) )。如果这不是底层S3 API的一个特性,那么您的SDK (boto3等)这将是对前缀进行过滤的方法,而这将是一个成本更高、速度更慢的操作,因为SDK必须列出所有对象,可能会产生更多的列表请求,并在客户端过滤它们。注意: ListObjectVersions API在这方面与ListObjectsV2相似,两者都支持prefix。
另外,请注意,VersionId、Size和LastModifed都是出现在ListObjectVersions响应中的属性,因此不需要进一步的API请求来获取这些信息。
因此,在您的例子中,假设只有不到1000个对象版本与您指定的前缀匹配,我认为这等同于一个S3 API请求到ListObjectVersions (这被认为是一个列表请求,而不是一个GET请求,尽管它是对https://mybucket.s3.amazonaws.com/?versions的GET请求)。
https://stackoverflow.com/questions/70136561
复制相似问题