Steve Q
Steve Q

Reputation: 395

Heroku S3 Env variables

I'm trying to use carrierwave to upload images to S3. It works locally but when I go to deploy to heroku I get the following error:

   ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_
     access_key

The keys are definitely set because I can see them when I run heroku:config

I've searched every answer I could find on stack and I searched through every answer on the first 3 pages of Google. None of them have worked.

I know the uploading works so it's not the code that's a problem. What settings or variables do I have to set to make this work?

Please help, I can't move forward with my app until this is done (so I can deploy to heroku again without it being stopped because of this error.)

Upvotes: 1

Views: 1065

Answers (2)

Richard Peck
Richard Peck

Reputation: 76784

Some info:


Environment Variables

You've got a problem with the calling of your environment variables in Heroku. ENV vars are basically variables stored in the OS / environment, which means you've got to set them for each environment you attempt to your deploy application

heroku config should should the ENV vars you've set. If you don't see ENV['AWS_ACCESS_KEY'] etc, it means you've not set them correctly, which as explained is as simple as calling the command heroku config:add YOUR_ENV_VAR=VAR


Figaro

I wanted to recommend using Figaro for this

This is a gem which basically stores local ENV vars in config/application.yml. This allows you to store ENV variables locally; but more importantly, allows you to sync them with Heroku using this command:

rake figaro:heroku

This will set your env vars on Heroku, allowing you to use them with Carrierwave as recommended in the other answers

Upvotes: 2

jordelver
jordelver

Reputation: 8432

It sounds like you have set the ENV variables on Heroku, but you need to hook those up to CarrierWave.

In config/initializers/fog.rb

CarrierWave.configure do |config|
  config.fog_credentials = {
    :provider               => 'AWS',
    :aws_access_key_id      => Rails.configuration.s3_access_key_id,
    :aws_secret_access_key  => Rails.configuration.s3_secret_access_key,
  }
end

In your environments/<environment>.rb file

Rails.application.configure do
  config.s3_access_key_id     = ENV['S3_ACCESS_KEY_ID']
  config.s3_secret_access_key = ENV['S3_SECRET_ACCESS_KEY']
end

This sets your Rails config to the ENV variables on Heroku which makes them available as Rails.configuration.<key>

Upvotes: 1

Related Questions