首页 > 解决方案 > Amazon S3 的 ListObjectsV2 是否在多个页面上保持一致?

问题描述

ListObjectsV2只能返回 1000 个结果,此时您必须返回另一页。

由于 Amazon S3 现在是高度一致的,并且在我列出其内容时,存储桶可能会发生其他更新,那么第二页是否会在与第一页相同的时间点获得更多结果?还是会反映请求第二页时桶的状态?

例如,如果我列出一个存储桶,获取第一页,删除一个本来会出现在第二页上的键,然后再获取第二页,我还会看到现在删除的键吗?

标签: amazon-web-servicesamazon-s3consistency

解决方案


事实上,Amazon S3 现在是强一致性的。这意味着一旦您上传了一个对象,所有阅读该对象的人都可以保证获得该对象的更新版本。这并不意味着保证两个不同的 API 调用处于相同的“状态”。值得注意的是,对于下载,如果在下载时更新了对象,则一次下载可以获得对象的两个版本的一部分。此答案中提供了更多详细信息。

至于您的问题,相同的基本规则适用:S3 从一次调用到下一次调用都是强一致的,一旦您对存储桶或对象进行更改,则保证更新后的任何调用都可以获得更新的数据。这意味着当您翻阅对象列表时,您将看到每个 API 调用获取最新状态时的更改:

import boto3

BUCKET='example-bucket'
PREFIX='so_question'

s3 = boto3.client('s3')

# Create a bunch of items
for i in range(3000):
    s3.put_object(Bucket=BUCKET, Key=f"{PREFIX}/obj_{i:04d}", Body=b'')

args = {'Bucket': BUCKET, 'Prefix': PREFIX + "/",}
result = s3.list_objects_v2(**args)
# This shows objects 0 to 999
print([x['Key'] for x in result['Contents']])

# Delete an object
s3.delete_object(Bucket=BUCKET, Key=f"{PREFIX}/obj_{1100:04d}")

# Request the next "page" of items
args['ContinuationToken'] = result['NextContinuationToken']
result = s3.list_objects_v2(**args)
# This will not show object 1100, showing objects 1000 to 2000
print([x['Key'] for x in result['Contents']])

这样做的好处是无法在一次 API 调用中获取存储桶中所有对象的列表(假设它有 1000 多个项目):我不知道获取存储桶的完整“快照”当然,在任何时候,除非您可以确保在列出对象期间存储桶不会更改。


推荐阅读