在rake任务中调用时未加载的Env变量

时间:2015-04-12 02:49:17

标签: ruby-on-rails amazon-web-services rake env

lib/tasks/sitemap.rake

namespace :sitemap do

  task update: :environment do
    Rake::Task["sitemap:generate"].execute
    key = ENV['AWS_ACCESS_KEY_ID']
    secret = ENV['AWS_SECRET_ACCESS_KEY']
    bucket = ENV['S3_BUCKET']

    s3 = AWS::S3.new(access_key_id: key, secret_access_key: secret)
    s3.buckets[bucket].objects['sitemap.xml'].write(data: File.open(Rails.root.join('tmp','sitemaps','sitemap.xml')), acl: :public_read)
  end

end

在此代码中,如果我手动键入字符串,则进程运行正常。但是一旦我使用ENV,我就会收到以下错误:

rake aborted!
AWS::Errors::MissingCredentialsError: 
Missing Credentials.

如何在不在我的可提交代码库中设置凭据的情况下安全地使用凭据。

1 个答案:

答案 0 :(得分:2)

Foreman在启动Procfile中定义的进程之前加载环境变量。

由于我们在rake任务中使用这些值 - 而不是实际的Web进程,因此您可以运行:

foreman run rake sitemap:update

这将使工头在运行rake任务之前加载值。