AWS S3上传的文件未显示

6

我正在使用Golang SDK将文件上传到Amazon 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)

3
AWS控制台上显示了什么? - Charlie Fish
1
请三次检查上传和下载的存储桶名称是否相同。 - Adrian
1
@Himanshu 我认为会抛出一个错误。但是你确定你有权限上传和获取文件吗?有时这些权限可能很奇怪,并且如果您没有正确设置它们,可能会产生意想不到的结果。 - Charlie Fish
1
@CharlieFish 是的,我在上传新对象之前列出了对象,然后再次列出了对象,但是没有看到任何更改。 - Himanshu
我遇到了类似的问题,我上传文件(在我的情况下是从签名URL上传),返回204成功响应,但文件没有出现在存储桶中。事实证明,我的对象键开头有一个正斜杠,而不是像文件系统一样解析它(即从根目录开始),它在根目录的一个名为“/”的文件夹中创建了整个重复的文件夹结构,并将我的文件放在那里。 - Steve Doolan
显示剩余4条评论
1个回答

17

s3是有最终一致性的,即使在同一区域内,也可能不显示最近写入列表中的对象:

Amazon S3通过在其数据中心的多台服务器之间复制数据来实现高可用性。如果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 object)的读操作也具有强一致性。


这是某种权限问题,因为当我尝试将文件上传到另一个存储桶时,它会返回已上传文件的信息,包括在 AWS S3 上的位置。而当我尝试列出该存储桶中的对象时,它会显示更新后的列表,包括新文件。 - Himanshu
但如果您遇到了权限错误,上传脚本肯定会抛出一个错误吧? - Vorsprung
我不知道为什么上传文件时没有出现错误。但是现在我通过使用另一个存储桶解决了我的问题。 - Himanshu
什么是合理的一致性达成时间?严格来说,我想这是某种统计分布,所以没有简单的答案。我发现对象在写入后10-15秒内就不见了,这种情况发生的几率有多大(因为这个原因)? - Jon Burgess
2
仅供参考,自2020年12月起,S3现在是强一致性而不再是最终一致性:https://aws.amazon.com/blogs/aws/amazon-s3-update-strong-read-after-write-consistency/ - Tensibai
@AnthonyOkoth 进行一个概念验证并提出问题。 - Vorsprung

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接