carrierwave, Excon::Errors::MovedPermanently in RegistrationsController#update error
Asked Answered
L

4

7

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://stackoverflow.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

Lacedaemonian answered 17/5, 2012 at 5:42 Comment(0)
C
16

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
Conversazione answered 22/5, 2012 at 4:0 Comment(0)
D
2

For me worked this configuration

config.fog_directory  = 'bucket_name'                   
config.fog_host       = 'https://s3-eu-west-1.amazonaws.com/bucket_name'      
Denticulation answered 11/7, 2012 at 15:38 Comment(0)
L
2

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'

Last answered 26/3, 2016 at 7:26 Comment(0)
M
0

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'
Masera answered 9/10, 2016 at 16:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.