Stream a remote file to S3
While attempting to work with my gif collection, I was experimenting with how to capture gifs from the internet and place them into a S3 bucket for later use. I found that it was possible to stream a remote file directly to S3.
Using the aws-sdk gem version 2, and
the open-uri module of the ruby standard
library,
one can link the two IO streams together fairly easily:
require 'aws-sdk'
require 'open-uri'
require 'sequel'
require 'digest/md5'
class RemoteFile
  def initialize(url)
    @url = url
  end
  def s3
    @s3 ||= Aws::S3::Resource.new(region: ENV['AWS_REGION'])
  end
  def md5_hash
    Digest::MD5.hexdigest(@url)
  end
  def obj(bucket_name)
    s3.bucket(bucket_name).object(md5_hash)
  end
  def url
    URI.parse(URI.escape(@url))
  end
  def upload_to_s3(bucket_name:)
    open(url) do |file|
      obj(bucket_name).put(body: file)
    end
  end
end
RemoteFile.new('https://i.imgur.com/DO3Hr4A.gif')
  .upload_to_s3(bucket_name: 'mah_gifs')This code snippet assumes you have ENV['AWS_ACCESS_KEY_ID'] and
ENV['AWS_SECRET_ACCESS_KEY'] set.