首页 > 解决方案 > AWS S3 上传的文件未显示

问题描述

我正在使用 golang sdk 将文件上传到亚马逊 S3 上的存储桶。响应没有错误,文件上传成功。我的问题是当我在上传新.jpg文件的同一区域中列出存储桶的对象时。我得到相同的文件列表,但没有将新文件添加到存储桶中。我不知道我做错了什么。这是我用来列出存储桶内对象的代码。

input := &s3.ListObjectsInput{
    Bucket: aws.String("Bucket Name"),
}
result2, err := svc.ListObjects(input)
if err != nil {
    if aerr, ok := err.(awserr.Error); ok {
        switch aerr.Code() {
        case s3.ErrCodeNoSuchBucket:
            fmt.Println(s3.ErrCodeNoSuchBucket, aerr.Error())
        default:
            fmt.Println(aerr.Error())
        }
    } else {
        // Print the error, cast err to awserr.Error to get the Code and
        // Message from an error.
        fmt.Println(err.Error())
    }
    return
}
log.Println("Bucket List", result2)

标签: amazon-web-servicesgoamazon-s3

解决方案


s3 最终是一致的,并且可能不会显示最近写入列表中的对象,即使来自同一区域:

Amazon S3 通过在 Amazon 数据中心内的多台服务器之间复制数据来实现高可用性。如果 PUT 请求成功,您的数据将被安全存储。但是,有关更改的信息必须在 Amazon S3 中复制,这可能需要一些时间,因此您可能会观察到以下行为:

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

进程替换现有对象并立即尝试读取它。在更改完全传播之前,Amazon S3 可能会返回先前的数据。

进程删除现有对象并立即尝试读取它。在完全传播删除之前,Amazon S3 可能会返回已删除的数据。

进程删除现有对象并立即列出其存储桶中的键。在完全传播删除之前,Amazon S3 可能会列出已删除的对象。

请参阅S3 开发人员指南

有一个轮询 Go AWS API 调用“func (*S3) WaitUntilObjectExists”,它一直在寻找文件,直到它出现或发生超时

由于@Tensiba 指出了这一点,更新s3 现在非常一致!

Amazon S3 在所有 AWS 区域中为您的 Amazon S3 存储桶中的对象的 PUT 和 DELETE 请求提供强大的先读后写一致性。此行为适用于对新对象的写入以及覆盖现有对象的 PUT 请求和 DELETE 请求。此外,对 Amazon S3 Select、Amazon S3 访问控制列表 (ACL)、Amazon S3 对象标签和对象元数据(例如,HEAD 对象)的读取操作是高度一致的。


推荐阅读