amazon-web-services - 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)
解决方案
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 对象)的读取操作是高度一致的。