12

我有一个 800KB 的 JPG 文件。我尝试上传到 S3 并不断收到超时错误。你能弄清楚什么是错的吗?800KB 对于上传来说是相当小的。

错误消息:您与服务器的套接字连接未在超时期限内读取或写入。空闲连接将被关闭。

HTTP 状态码:400

AWS 错误代码:RequestTimeout

Long contentLength = null;
System.out.println("Uploading a new object to S3 from a file\n");
try {
    byte[] contentBytes = IOUtils.toByteArray(is);
    contentLength = Long.valueOf(contentBytes.length);
} catch (IOException e) {
    System.err.printf("Failed while reading bytes from %s", e.getMessage());
}

ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentLength(contentLength);        
       
s3.putObject(new PutObjectRequest(bucketName, key, is, metadata));
4

3 回答 3

12

是否有可能 IOUtils.toByteArray 正在耗尽您的输入流,以便在进行服务调用时没有更多数据可以从中读取?在这种情况下, stream.reset() 将解决问题。

但是,如果您只是上传一个文件(而不是任意 InputStream),您可以使用更简单的 AmazonS3.putObject() 形式,它接受一个文件,然后您根本不需要计算内容长度。

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#putObject(java.lang.String , java.lang.String, java.io.File)

这将多次自动重试任何此类网络错误。您可以通过使用 ClientConfiguration 对象实例化客户端来调整客户端使用的重试次数。

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html#setMaxErrorRetry(int)

于 2012-10-10T22:58:58.730 回答
1

如果您的终端节点位于 VPC 后面,它也会默默地出错。您可以在此处为 s3 添加新的 VPC 终端节点

https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/

于 2018-03-06T00:58:50.270 回答
-1

我要感谢加布里埃尔的回答。我使用 rclone 实现了 S3 的端点,看到我的错误从 100 到。这使得 ECS 到 S3 的传输通过其内部网络进行 - 这明显更快且更可靠。我要补充的唯一一点是,永远不要尝试将网络驱动器备份到 S3 - 那里有伤害的世界。

这个命令(和选项)对我来说一整天都很完美:rclone --progress copy /home/sound/effects/$formatName/$fileType/ $S3CONFIG:$S3BUCKET/$formatName-$fileType/$fileType/ -- contimeout 10m0s --max-backlog 100 --transfers 8

于 2020-08-25T07:27:58.067 回答