我有一个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));
答案 0 :(得分:10)
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对象实例化它来调整客户端使用的重试次数。
答案 1 :(得分:0)
如果您的终端位于VPC后面,它也会默默地出错。您可以在此处为s3
添加新的VPC端点https://aws.amazon.com/blogs/aws/new-vpc-endpoint-for-amazon-s3/
答案 2 :(得分:-1)
我要感谢加百列的回答。 我使用rclone实现了S3的端点,并看到我的错误从100变成了 zero 。 这使得ECS到S3的传输通过其内部网络进行-显着更快,更可靠。 我要补充的唯一一点是,永远不要尝试将网络驱动器备份到S3-那里充满了痛苦。
这条命令(和选项)对我来说整整一整天都在工作: rclone --progress copy / home / sound / effects / $ formatName / $ fileType / $ S3CONFIG:$ S3BUCKET / $ formatName- $ fileType / $ fileType / --contimeout 10m0s --max-backlog 100 --transfers 8