AWS OpsWorks环境变量无效

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

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

MYKEY: 1234 

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

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

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

我试过重启服务器。 我不确定我缺少什么,我一直在其他服务中使用环境变量。

如何追踪这些应该设置的位置?

OpsWorks根据您正在部署的应用程序类型将环境变量存储在不同的位置。 在Rails / Passenger上,它们应该保存在Apache配置文件#{your_app_name}.conf 。 ( 来源 )

这意味着它们在您的正常shell环境中不可用。

我知道Node.js配方将所有内容存储在/srv/www/#{app_name}/shared/app.env文件中……然后获取该文件以/srv/www/#{app_name}/shared/app.env环境以运行节点服务器。 此实现细节还意味着您可以编写shell脚本来获取该app.env文件,然后调用某些Node脚本或其他任何内容。

当然,Rails不是Node。 我不知道环境变量是否也存储在其他地方:快速查看OpsWorks烹饪书中的Rails配方没有发现任何明显的东西,但也许我错过了一些东西。

根据您在OpsWorks手册中进行的修改量,您可以创建一个类似于此的部署配方:

application_environment_file do user deploy[:user] group deploy[:group] path ::File.join(deploy[:deploy_to], "shared") environment_variables deploy[:environment_variables] end

(也许调整路径)

然后运行您的控制台,当您通过SSH连接到服务器时,执行类似的操作

sudo source /srv/www/my_app_name/shared/app.env; bundle exec rails console -e production sudo source /srv/www/my_app_name/shared/app.env; bundle exec rails console -e production或者其他什么。

AWS OpsWorks控制台允许您声明环境变量,但为了让它们可用于我们的Rails应用程序,我们需要使用Chef菜谱配方以及一些预防措施。

简而言之,我们使用config / secrets.yml文件结合config / application.yml文件, Figaro gemChef cookbook配方 。 厨师食谱配方读取OpsWorks控制台中定义的变量,并将它们提供给编写config / application.yml文件的Rails应用程序。

我已经发布了详细的指南来解释它究竟是如何做到的。 链接在这里 。

这些是我所涵盖的核心要点:

  1. 使用config / secrets.yml文件(从Rails 4.1添加)
  2. 使用Figaro gem在环境中加载变量
  3. 在AWS OpsWorks Console中声明环境变量
  4. 使用自定义Chef配方创建一个配置/ application.yml文件,Figaro将使用该文件来提供变量

我(在纽约的AWS PopUp Loft的Bruno的帮助下)在after_restart.rb部署钩子中添加了一些自定义Chef代码,只需将文件夹“deploy”添加到你的apps根目录,然后添加“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面板中的环境变量,请记住重新启动实例。