Fog and S3 multipart uploads
Digging through issues and source code
I was hitting Excon::Errors::SocketError: Broken pipe (Errno::EPIPE)
when trying to upload relatively small file (30MB) to S3. The most common suggestion is to set region when creating Fog’s storage object.
Fog::Storage.new(
provider: 'AWS',
aws_access_key_id: aws_access_key_id,
aws_secret_access_key: aws_secret_access_key,
region: 'us-east-1',
)
Unfortunately this didn’t help.
To allieviate that problem I decided to go route of S3 multipart uploads, which Fog supports. The problem it’s not exposed in any friendly way. To get multipart uploads you need to do two things: make sure body is a file like object (with at least #read
method) and to set multipart_chunk_size
on the file which you want to save.
file = bucket.files.new(
key: filename,
body: StringIO.new(content)
)
file.multipart_chunk_size = 5242880 # 5MB
file.save
When those two conditions are met fog will happily upload file using S3 multipart upload, which in my case eliminated those broken pipe errors.