AWS OpsWorks 环境变量不起作用

AWS OpsWorks Environment variables not working

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

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

MYKEY: 1234

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

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

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

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

我如何追踪这些设置的位置?

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

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

我知道 Node.js 配方将所有内容都存储在 /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 或其他。

我(在纽约 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 面板内的环境变量,记得重启您的实例。

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

简而言之,我们使用 config/secrets.yml 文件结合 config/application.yml 文件, Figaro gemChef 食谱。 Chef 食谱食谱读取 OpsWorks 控制台中定义的变量,并让 Rails 编写 config/application.yml 文件的应用程序可以使用它们。

我已经发布了一份详细的指南来解释具体如何操作。 Link here.

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

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