AWS OpsWorks环境变量无效

时间:2015-02-28 00:54:12

标签: ruby-on-rails aws-opsworks

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

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

MYKEY: 1234

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

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

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

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

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

3 个答案:

答案 0 :(得分:4)

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

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

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

当然,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或其他什么。

答案 1 :(得分:3)

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

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

我已经发布了详细的指南来解释它究竟是如何做到的。 Link here

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

  1. 使用config / secrets.yml文件(从Rails 4.1添加)
  2. 使用Figaro gem在环境中加载变量
  3. 在AWS OpsWorks控制台中声明环境变量
  4. 使用自定义Chef配方创建一个Figaro将用于让变量可用的config / application.yml文件

答案 2 :(得分:1)

我(在纽约的AWS PopUp Loft的Bruno帮助下)在after_restart.rb部署挂钩中添加了一些自定义Chef代码,只需添加文件夹&#34; deploy&#34;到您的应用程序根目录和内部添加&#34; after_restart.eb。&#34;在它....

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面板中的环境变量,请记住重新启动实例。

相关问题