【问题标题】:"The specified key does not exist" S3 error for really existing object in the bucket“指定的键不存在”存储桶中真正存在的对象的 S3 错误
【发布时间】:2015-10-24 17:01:31
【问题描述】:

在我们的应用程序中,我们必须通过 AWS Java SDK 上传的用户图像在后端下载以进行一些处理操作(调整大小、裁剪等)。有时,我们会收到以下错误:

com.amazonaws.services.s3.model.AmazonS3Exception:指定的键不存在。 (服务:Amazon S3;状态代码:404;错误代码:NoSuchKey;

但是这个键和这个路径保存的对象是存在的。我知道在 AWS 开发人员指南中会出现这种行为:

但是,有关更改的信息可能不会立即在 Amazon S3 中复制,您可能会观察到以下行为: 进程将新对象写入 Amazon S3 并立即尝试读取它。在更改完全传播之前,Amazon S3 可能会报告“密钥不存在”。

但是如何在我的代码中处理这个错误?我试图等待几毫秒,我试图重试下载这个对象 - 我所有的尝试都失败了。

         try
            {
                Download download = s3TransferManager
                        .download(new GetObjectRequest(bucketName, key), new File(tempUrl));
                download.waitForCompletion();
            }
            catch (AmazonS3Exception amazonS3Exception)
            {
                Thread.sleep(1000);
                //retry 3 time.... }

我很高兴听到任何关于在这种情况下如何下载现有文件的建议。谢谢!

【问题讨论】:

    标签: java amazon-web-services amazon-s3 aws-sdk


    【解决方案1】:

    答案实际上取决于您使用的地区。 来自 S3 常见问题解答(此处为 http://aws.amazon.com/s3/faqs/):

    问:Amazon S3 采用什么数据一致性模型?

    所有区域中的 Amazon S3 存储桶提供写后读一致性 新对象的 PUTS 和覆盖 PUTS 的最终一致性 并删除。美国标准区域的 Amazon S3 存储桶仅提供 通过 Northern 访问时的写后读一致性 弗吉尼亚端点 (s3-external-1.amazonaws.com)。

    如果使用美国标准并且不指定端点,您可能会在放置和对象可用之间的边缘情况下遇到很大的延迟(有趣的是,我观察到以小时为单位的延迟)。遵循的模式是执行 put,然后旋转并等待对象。

    直接解决方法是使用美国标准的弗吉尼亚端点(根据常见问题解答),或者放弃美国标准并使用另一个区域(例如 US-West-2)。所有其他区域都有 read-after-write,因此一旦 put 完成,对象就会变得可用。

    【讨论】:

      【解决方案2】:

      如果您的图像处理是后台作业(异步作业),您可以使用S3 Event Notification。因此,只要您的图像刚刚放入存储桶,S3 就可以触发 SNS 通知/SQS 或调用 AWS Lambda 函数。

      【讨论】:

        猜你喜欢
        • 2014-12-16
        • 1970-01-01
        • 2017-11-20
        • 2018-09-29
        • 1970-01-01
        • 2017-12-31
        • 2021-06-10
        • 1970-01-01
        • 2017-10-14
        相关资源
        最近更新 更多