I have a rails app running on Heroku. I am using paperclip for some simple image uploads for user avatars and some other things, I have S3 set as my backend and everything seems to be working fine except when trying to push to S3 I get the following error:
The AWS Access Key Id you provided does not exist in our records.
Thinking I mis-pasted my access key and secret key, I tried again, still no luck. Thinking maybe it was just a buggy key I deactivated it and generated a new one. Still no luck.
Now for both keys I have used the S3 browser app on OS X and have been able to connect to each and view my current buckets and add/delete buckets. Is there something I should be looking out for? I have my application’s S3 and paperclip setup like so
development:
bucket: (unique name)
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
test:
bucket: (unique name)
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
production:
bucket: (unique_name)
access_key_id: ENV['S3_KEY']
secret_access_key: ENV['S3_SECRET']
has_attached_file :cover,
:styles => {
:thumb => "50x50"
},
:storage => :s3,
:s3_credentials => "#{RAILS_ROOT}/config/s3.yml",
:path => ":class/:id/:style/:filename"
EDIT NOTE: The ENV[‘S3_KEY’] and ENV[‘S3_SECRET’] are environment variables in heroku which i have tried even using my keys directly and it still doesn’t work
Note: I just added the (unique name) bits, those aren’t actually there–I have also verified bucket names, but I don’t even think this is getting that far. I also have my heroku environment vars setup correctly and have them setup on dev
You aren’t setting a bucket. It’s in your s3.yml file, but you aren’t reading that value from your call to
has_attached_file.Paperclip S3 docs:
http://rubydoc.info/gems/paperclip/Paperclip/Storage/S3#s3_protocol-instance_method
Also, pay attention to those people who are telling you not to use a s3.yml file with Heroku. It’s a waste and just added abstraction that buys you nothing. You already have your ENV set up with the values you need, so use them.
I’ve done this before where I don’t want to push an s3.yml file to Heroku, but I do want to use one for test and development. In an initializer you can do something like this:
Then when you’re setting up Paperclip in your model, you reference the value like this:
Obviously, this means that you do not want to have your s3.yml file in your git repository (which really, you shouldn’t anyway).