【问题标题】:Rails issue on cap production deploy关于上限生产部署的 Rails 问题
【发布时间】:2016-03-17 10:00:17
【问题描述】:

我的堆栈是 Puma + Nginx + PostgreSQL,在 AWS EC2 上。我正在使用 Capistrano 3.4 部署 Rails 4.2.4 应用程序。我一直在黑暗中试图解决这个问题已经有一段时间了,所以我想看看我是否能得到一些帮助来阐明这个问题。这在概念上并不困难,我只是不知道为什么我尝试过的方法不起作用。

Capistrano 的输出是这样的:

...
DEBUG [f85d7a84] Command: cd /home/deploy/my_app/releases/20151210184710 && ( export RVM_BIN_PATH="~/.rvm/bin" aws_access_key_id="<MY_AWS_ACCESS_KEY_ID>" aws_secret_access_key="<MY_AWS_SECRET_ACCESS_KEY>"  RAILS_ENV="production" ; ~/.rvm/bin/rvm default do bundle exec rake assets:precompile )
DEBUG [f85d7a84]    RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    you can ignore these warnings with 'rvm rvmrc warning ignore /home/deploy/my_app/releases/20151210184710/Gemfile'.
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    rake aborted!
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
...

请注意,在第一行中,有人尝试在 Bash 命令中设置所需的参数,但显然无法在 rake assets:precompile 中访问它们。所以我的问题是如何正确设置“必需参数”aws_access_key_id 和 aws_secret_access_key。

我尝试过的:

1) 在 config/deploy.rb 中设置它们(灵感来自 this

为此,我使用了:

set :default_env, {
  rvm_bin_path: '~/.rvm/bin',
  'aws_access_key_id' => '<MY_AWS_ACCESS_KEY_ID>',
  'aws_secret_access_key' => '<MY_AWS_SECRET_ACCESS_KEY>'
 }

2) 在我的 EC2 服务器上的 shared/secrets.yml 中设置它们:(灵感来自 this

aws_access_key_id: '<MY_AWS_ACCESS_KEY_ID>',
aws_secret_access_key: '<MY_AWS_SECRET_ACCESS_KEY>'

我在 config/deploy.rb 中链接到这些

set :linked_files, %w{config/database.yml config/application.yml secrets.yml}

目前这是我尝试在 config/initializers/carrierwave.rb 中输入键的方式:

CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider              => 'AWS',
      #:aws_access_key_id     => ENV['AWS_ACCESS_KEY_ID'], # I still get the same error when I use these two lines instead
      #:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
      :aws_access_key_id     => Rails.application.secrets.aws_access_key_id,
      :aws_secret_access_key => Rails.application.secrets.aws_secret_access_key
    }
    config.fog_directory    = ENV['AWS_S3_BUCKET']
end

3) 在 config/application.yml 中设置它们(灵感来自this

aws_access_key_id: "<MY_AWS_ACCESS_KEY_ID>"
aws_secret_access_key: "<MY_AWS_SECRET_ACCESS_KEY>"

那么为什么这些方法都不起作用呢?我在设置环境变量方面不是很有经验,更不用说在远程服务器上设置了,但我已经看到了这些似乎都可以工作的线程/博客文章。

感谢大家的帮助。随时提问或了解更多信息!

【问题讨论】:

  • 您是否尝试过在链接中的答案中手动设置,例如 1) 或 2):stackoverflow.com/questions/33457422/…
  • 1) 使用您创建的 IAM 配置文件中的值设置环境变量:AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、AWS_DEFAULT_REGION。
  • 2) 除了 1),您还可以创建 ~/.aws/credentials 文件。您可以在此处添加以下行: [default] aws_access_key_id = YOUR_AWS_ACCESS_KEY_ID aws_secret_access_key = YOUR_AWS_SECRET_ACCESS_KEY aws_default_region = region
  • 如果你在 linux 上运行你的代码。您只需要在 shell 上执行 'export AWS_ACCESS_KEY_ID=value' 即可。为所有 3 个环境变量执行此操作

标签: ruby-on-rails amazon-ec2 capistrano


【解决方案1】:

我可以看到您的选项存在一些问题,我将在下面相应地列出它们:

  1. 环境变量名称区分大小写,这意味着您正在导出例如 aws_access_key_id,但您从您的载波代码中引用 ENV['AWS_ACCESS_KEY_ID']

    阅读更多关于assigning environment variables here的信息。

  2. 您的 capistrano 正在尝试链接 secrets.yml,您实际需要的是 config/secrets.yml,请尝试将该行更改为:

    set :linked_files, %w{config/database.yml config/application.yml config/secrets.yml}

  3. 假设您已经安装了figaro gem,如所提到的帖子中所述,我假设(根据您提供的详细信息)该问题很可能与区分大小写有关(转到 1。)

选择一个,然后再试一次!

【讨论】:

  • 就像你说的 1. 是正确的方法。我很困惑,因为错误以小写形式提及它们,但当然,carrierwave 初始化程序将它们从大写环境变量中带入小写变量中。我以为我已经尝试过将它们大写,但我又试了一次,现在它可以工作了!真的很感激。
猜你喜欢
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-16
  • 1970-01-01
  • 2012-03-22
  • 2014-03-28
相关资源
最近更新 更多