AWS OpsWorks环境变量无法正常工作

10

我正在运行Ubuntu 14.04 LTS 64位Rails应用程序,但无法访问我的App环境变量。

在OpsWorks App面板中,我设置了我的环境变量,例如:

MYKEY: 1234

然后我再次保存并部署我的应用程序以使它们可见。

在我的 Rails 应用程序或控制台中,我得到了 nil :

$ bundle exec rails c production
>ENV["MYKEY"]
=> nil

我已经尝试重新启动服务器了。我不确定自己漏掉了什么,因为我在其他服务中一直在使用环境变量。

我该如何追踪这些环境变量应该在哪里设置?


如果我通过ssh登录并运行sudo opsworks-agent-cli get_json,我确实可以看到MYKEY在这里:{ "deploy": { "server": { "environment": { "MYKEY": "1234" } .. - peterept
你解决这个问题了吗? - loganathan
奇怪的是,在Passenger生产实例中它能够正常工作,但当我以部署用户(与Passenger运行的用户相同)$ bundle exec rails c production时却无法工作。Apache正在以www-data身份运行,但如果我以www-data或deploy身份登录,我看不到任何设置的环境变量。所以我在运行,但我不知道底层发生了什么。 - peterept
好的,我现在会检查。 - loganathan
我回答了更详细的内容,并提供了完整的操作指南。请查看并考虑将其标记为正确答案。谢谢。 - Diego D
显示剩余2条评论
3个回答

4
OpsWorks根据您部署的应用程序类型将环境变量存储在不同的位置。在Rails / Passenger中,它们应该保存在Apache配置文件#{your_app_name}.conf中。(来源
这意味着它们在您的普通shell环境中不可用。
我知道Node.js配方将所有内容存储在/srv/www/#{app_name}/shared/app.env文件中……然后再引用该环境来运行Node服务器。这个实现细节也意味着您可以编写脚本来源该app.env文件,然后调用一些Node脚本或其他东西。
当然,Rails并不是Node。我不知道环境变量是否也存储在其他地方:在OpsWorks cookbooks中查看Rails配方时没有发现任何明显的问题,但也许我错过了什么。
根据您在OpsWorks cookbook中进行的修改数量,您可以创建一个部署配方,做类似于这样的事情: application_environment_file do user deploy[:user] group deploy[:group] path ::File.join(deploy[:deploy_to], "shared") environment_variables deploy[:environment_variables] end (可能需要调整路径)
然后在您连接到服务器时运行控制台,执行: sudo source /srv/www/my_app_name/shared/app.env; bundle exec rails console -e production 或其他操作。

非常感谢,这就是正确的信息!如果我查看 /etc/apache2/sites-enables/myapp.conf,我确实可以在那里看到 SetEnv "PKTEST" "testing",所以显然那是OpsWorks实际写入的位置,也是为什么无法在运行rails控制台时看到它的原因。 - peterept
我提供了更详细的答案,并附上了完整的操作指南。请查看并考虑将其标记为正确答案。谢谢。 - Diego D

3
AWS OpsWorks控制台允许您声明环境变量,但是为了使它们对我们的Rails应用程序可用,我们需要使用Chef cookbook recipe加上一些预防措施。
简而言之,我们使用config/secrets.yml文件结合config/application.yml文件、Figaro gem和Chef cookbook recipe。Chef cookbook recipe读取在OpsWorks控制台中定义的变量,并将它们写入config/application.yml文件,使它们可用于Rails应用程序。
我已经发布了一份详细的指南,以解释如何确切地做到这一点。链接在此处
这些是我涵盖的核心要点:
  1. 使用config/secrets.yml文件(从Rails 4.1开始添加)
  2. 使用Figaro gem在环境中加载变量
  3. 在AWS OpsWorks控制台中声明环境变量
  4. 使用自定义Chef recipe创建一个config/application.yml文件,Figaro将使用它来使变量可用

1

我(在纽约AWS PopUp Loft得到Bruno的帮助)在after_restart.rb部署钩子中添加了一些自定义的Chef代码,只需将文件夹“deploy”添加到您应用程序的根目录中,并在其中添加“after_restart.eb”。其中....

Chef::Log.info("Running deploy/after_restart.rb")

contents = []

node[:deploy].each do |application, deploy|
  deploy[:environment_variables].each do |key, value|
    contents << "export #{key}=\"'#{value}'\""
  end
end


Chef::Log.info("Adding the environment variables to /etc/profile.d/startup_env_config.sh")

bash "create_startup_env_config.sh" do
  user "root"
  cwd  "/etc/profile.d"
  code <<-EOH
    echo \''#{contents.join(" ")}\'' > startup_env_config.sh
    source startup_env_config.sh
    cd #{release_path}

    EOH
  end

就是这样。如果您在OpsWorks面板内更新环境变量,请记得重新启动实例。


我尝试了这个配方,但它没有起作用!我在下面添加了我的答案,并提供了完整详细的操作指南。 - Diego D
我做了一个微小的修改。 - dsieczko
嗯,很抱歉它对你没用。我已经在生产环境中使用这种方法几个月了,从未失败过。很高兴你找到了另一种解决方案。 - dsieczko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接