7
votes

ive been trying to get carrierwave to work with amazon s3. instead of

storage :s3

i have

storage :fog

changing it to storage :s3 gives an immediate error

https://stackguides.com/questions/10629827/carrierwave-cant-convert-nil-into-string-typeerror-when-using-s3

so i changed it to storage :fog like the rdoc below says.

http://rubydoc.info/gems/carrierwave/frames

however when i try to upload an image, i get this crazy error. im using the devise gem as well.

my full stack trace is

Excon::Errors::MovedPermanently in RegistrationsController#update

Excon::Errors::MovedPermanently (Expected(200) <=> Actual(301 Moved Permanently)
  request => {:connect_timeout=>60, :headers=>{"Content-Length"=>95472, "Content-Type"=>"image/jpeg", "x-amz-acl"=>"private", "Cache-Control"=>"max-age=315576000", "Date"=>"Thu, 17 May 2012 05:28:55 +0000", "Authorization"=>"AWS AKIAIN6SC3YSGBSUKV4Q:kZOG9mG01jYn48ImFMYbgxAAQRk=", "Host"=>"user.a.777.s3-eu-west-1.amazonaws.com:443"}, :instrumentor_name=>"excon", :mock=>false, :read_timeout=>60, :retry_limit=>4, :ssl_ca_file=>"/Users/sasha/.rvm/gems/ruby-1.9.3-p125/gems/excon-0.13.4/data/cacert.pem", :ssl_verify_peer=>true, :write_timeout=>60, :host=>"user.a.777.s3-eu-west-1.amazonaws.com", :path=>"/uploads%2Fuser%2Fimage%2F59%2Fidea.jpg", :port=>"443", :query=>nil, :scheme=>"https", :body=>#<File:/Users/sasha/Desktop/rails_projects/blue_eyes/public/uploads/tmp/20120516-2228-19160-9893/idea.jpg>, :expects=>200, :idempotent=>true, :method=>"PUT"}
  response => #<Excon::Response:0x007fd72a146820 @body="<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Error><Code>PermanentRedirect</Code><Message>The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.</Message><RequestId>F5F5AF888E837622</RequestId><Bucket>user.a.777</Bucket><HostId>IShK3GIthzCQysLOKXnR+ijJiHmMuUtXBOpFxQM4uCvJgkEHfmFn43LL4oWmpT82</HostId><Endpoint>s3.amazonaws.com</Endpoint></Error>", @headers={"x-amz-request-id"=>"F5F5AF888E837622", "x-amz-id-2"=>"IShK3GIthzCQysLOKXnR+ijJiHmMuUtXBOpFxQM4uCvJgkEHfmFn43LL4oWmpT82", "Content-Type"=>"application/xml", "Transfer-Encoding"=>"chunked", "Date"=>"Thu, 17 May 2012 05:29:00 GMT", "Connection"=>"close", "Server"=>"AmazonS3"}, @status=301>):
  app/controllers/registrations_controller.rb:30:in `update'

i dont know what that even means.

in my initializers/carrierwave.rb i have..

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'somekey',       # required
    :aws_secret_access_key  => 'secretkey',       # required
    :region                 => 'eu-west-1'  # optional, defaults to 'us-east-1'
  }
  config.fog_directory  = 'bucket.name'                     # required
  #config.fog_host       = 'https://s3.amazonaws.com'            # optional, defaults to nil
  config.fog_public     = false                                   # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'}  # optional, defaults to {}
end

and my uploader file has

  #storage :s3
  storage :fog
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

my gem file has

gem 'carrierwave'
gem 'thin'
gem 'fog'

when i boot my server, instead of webrick, it uses thin in development as well.

are my configurations wrong? help would be much appreciated! ive been super stuck on this carrierwave/s3 issue

4

4 Answers

17
votes

I ran into this the earlier today and it was a problem with the region. Just take it out and let it be set by the default.

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',       # required
    :aws_access_key_id      => 'somekey',       # required
    :aws_secret_access_key  => 'secretkey'       # required
  }
  config.fog_directory  = 'bucket.name'                     # required
  #config.fog_host       = 'https://s3.amazonaws.com'       # optional, defaults to nil
  config.fog_public     = false                             # optional, defaults to true
  config.fog_attributes = {'Cache-Control'=>'max-age=315576000'} # optional, defaults to {}
end
2
votes

For me worked this configuration

config.fog_directory  = 'bucket_name'                   
config.fog_host       = 'https://s3-eu-west-1.amazonaws.com/bucket_name'      
2
votes

I had the same problem.

Following the 3 steps below worked for me.

1.Change the default region when creating a bucket

2.Edit my carrierwave.rb file(as shown below)

initializers/carrierwave.rb:

if Rails.env.production?
  CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider              => 'AWS',
      :aws_access_key_id     => ENV['S3_ACCESS_KEY'],
      :aws_secret_access_key => ENV['S3_SECRET_KEY'],
      :region => ENV['S3_REGION']
    }
    config.fog_directory     =  ENV['S3_BUCKET']
  end
end

3.Configure heroku in the command line as in: heroku config:set S3_REGION='your region'

0
votes

Just like @Jason Bynum said, do not specify the region and let it default.

If you still fail, don't worry, At this time, heroku will give hint to you like your region specified is wrong and should be xxx

And you know how to fill the region right now :)

The followings work for me:

CarrierWave.configure do |config|
  config.fog_credentials = {
      provider:              'AWS',                        # required
      aws_access_key_id:     ENV['S3_KEY'],                        # required
      aws_secret_access_key: ENV['S3_SECRET'],                        # required
      region:                'ap-southeast-1',                  # optional, defaults to 'us-east-1'

  }
  config.fog_directory  = 'your_bucket_name'                          # required
  config.fog_public     = false                                        # optional, defaults to true
  config.fog_attributes = { 'Cache-Control' => "max-age=#{365.day.to_i}" } # optional, defaults to {}
end

Gemfile:

gem 'carrierwave', '0.10.0'
gem 'fog', '1.36.0'