【问题标题】:S3 Key Not Present Immediatly After Listing上市后不立即存在 S3 密钥
【发布时间】:2016-09-21 01:56:27
【问题描述】:

我正在使用 Python 和 boto3 来处理 S3。

我列出了一个 S3 存储桶并按前缀过滤:

bucket = s3.Bucket(config.S3_BUCKET)
for s3_object in bucket.objects.filter(Prefix="0000-00-00/", Delimiter="/"):

这给了我一个可迭代的 S3 对象。

如果我打印我看到的对象:

s3.ObjectSummary(bucket_name='validation', key=u'0000-00-00/1463665359.Vfc01I205aeM627249')

当我去取尸体时,虽然我得到了一个例外:

content = s3_object.get()["Body"].read()

botocore.exceptions.ClientError: 发生错误 (NoSuchKey) 时 调用 GetObject 操作:指定的键不存在。

所以boto只是给了我钥匙,然后它说它不存在?

这不会发生在所有的键上。一些。如果我在 AWS 控制台中搜索无效密钥,它不会找到它。

【问题讨论】:

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


    【解决方案1】:

    假设您使用的是“标准”端点是安全的。所有这些主要适用于它,而不是区域端点。 S3 是原子的,eventually consistentThe documentation gives several examples,包括这个:

    一个进程将一个新对象写入 Amazon S3 并立即列出其存储桶中的键。在更改完全传播之前,对象可能不会出现在列表中

    偶尔会看到manyhours 的延迟,我的轶事数据同意this statement 99% 以上的数据存在于 2 秒内。

    您可以通过将端点从 s3.amazonaws.com 更改为 s3-external-1.amazonaws.com 来启用写后读一致性,从而“修复”此问题:

    s3client = boto3.client('s3', endpoint_url='s3-external-1.amazonaws.com')
    

    【讨论】:

    • 感谢写后读一致性的提示,这正好解决了我的问题。
    • 酷。这是深奥的。
    • 值得注意的是,最近版本的 boto3/botocore 还支持s3-external-1 作为区域名称,因此您可以使用boto3.client('s3', region_name='s3-external-1'),或通常的AWS_DEFAULT_REGION,配置文件中的区域等.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多