I am new to Ruby on Rails. I have already deployed the project to Aliyun. The pictures of the website are stored by aws s3. In the process, I need to set some secret keys of AWS. I used figaro. My setup is like this:
config/application.yml:
production:
SEND_CLOUD_USER_NAME: xxx
SEND_CLOUD_USER_KEY: xxxxx
secret_key_base: xxxxxxx
AWS_ACCESS_KEY_ID: xxxxxxxx
AWS_SECRET_ACCESS_KEY: hIMMHPxxxxxxx
AWS_REGION: ap-northeast-1
AWS_BUCKET_NAME: xxxxx
development:
SEND_CLOUD_USER_NAME: xxx
SEND_CLOUD_USER_KEY: xxxxx
secret_key_base: xxxxxxx
AWS_ACCESS_KEY_ID: xxxxxxxx
AWS_SECRET_ACCESS_KEY: hIMMHPxxxxxxx
AWS_REGION: ap-northeast-1
AWS_BUCKET_NAME: xxxxx
config/initializers/carrierwave.rb:
CarrierWave.configure do |config|
if Rails.env.production?
config.fog_provider = 'fog'
config.fog_credentials = {
provider: 'AWS',
aws_access_key_id: ENV["AWS_ACCESS_KEY_ID"],
aws_secret_access_key: ENV["AWS_SECRET_ACCESS_KEY"],
region: ENV["AWS_REGION"]
}
config.fog_directory = ENV["AWS_BUCKET_NAME"]
else
config.storage :file
end
end
uploaders/house_image_uploader.rb:
if Rails.env.development?
storage :file
elsif Rails.env.production
storage :fog
end
Then executecap production deploy
An error will be reported and the error prompt is:
00:22 deploy:assets:precompile
01 bundle exec rake assets:precompile
01 rake aborted!
01 ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
01 /home/deploy/homey/shared/bundle/ruby/2.4.0/gems/fog-core-1.45.0/lib/fog/core/service.rb:244:in `validate…
01 /home/deploy/homey/shared/bundle/ruby/2.4.0/gems/fog-core-1.45.0/lib/fog/core/service.rb:268:in `handle_s…
01 /home/deploy/homey/shared/bundle/ruby/2.4.0/gems/fog-core-1.45.0/lib/fog/core/service.rb:98:in `new'
01 /home/deploy/homey/shared/bundle/ruby/2.4.0/gems/fog-core-1.45.0/lib/fog/core/services_mixin.rb:16:in `ne…
01 /home/deploy/homey/shared/bundle/ruby/2.4.0/gems/fog-core-1.45.0/lib/fog/storage.rb:27:in `new'
...
...
It is suggested that AWS _ ACCESS _ KEY _ ID and AWS _ SECRET _ ACCESS _ KEY are missing. I can see from figaro github that one statement is:
Other Hosts
If you're not deploying to Heroku, you have two options:
Generate a remote configuration file
Set ENV variables directly
Generating a remote configuration file is preferred because of:
familiarity – Management of config/application.yml is like that of config/database.yml.
isolation – Multiple applications on the same server will not produce configuration key collisions.
So I logged in to the remote host and created it under /appname/shared/config and /appname/current/configapplication.yml
And add content:
production:
SEND_CLOUD_USER_NAME: xxx
SEND_CLOUD_USER_KEY: xxxxx
secret_key_base: xxxxxxx
AWS_ACCESS_KEY_ID: xxxxxxxx
AWS_SECRET_ACCESS_KEY: hIMMHPxxxxxxx
AWS_REGION: ap-northeast-1
AWS_BUCKET_NAME: xxxxx
development:
SEND_CLOUD_USER_NAME: xxx
SEND_CLOUD_USER_KEY: xxxxx
secret_key_base: xxxxxxx
AWS_ACCESS_KEY_ID: xxxxxxxx
AWS_SECRET_ACCESS_KEY: hIMMHPxxxxxxx
AWS_REGION: ap-northeast-1
AWS_BUCKET_NAME: xxxxx
This is still wrong, orArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
I have searched in Stack Overflow and tried some methods, but the problem remains the same. Who can help me and how to solve this problem? Thank you!
Solve it by yourself, when looking for relevant information, I saw:
And finally if we deploy application with Capistrano we have to deploy it properly. We should put local_env.yml to the Capistrano shared folder on the server and change config/deploy.rb like this:before 'deploy:assets:precompile', :symlink_config_files desc "Link shared files" task :symlink_config_files do symlinks = { "#{shared_path}/config/database.yml" => "#{release_path}/config/database.yml", "#{shared_path}/config/local_env.yml" => "#{release_path}/config/local_env.yml" } run symlinks.map{|from, to| "ln -nfs #{from} #{to}"}.join(" && ") end
So I found it in my rails application
config/deploy.rb
, there is a line is:append :linked_files, "config/database.yml", "config/secrets.yml"
So I tried to add application.yml to the back and tried to deploy successfully again.