【问题标题】:AWS OpsWorks Environment variables not workingAWS OpsWorks 环境变量不起作用
【发布时间】:2015-04-30 20:35:13
【问题描述】:

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

在 OpsWorks 应用程序面板中,我设置了我的环境变量,例如:

MYKEY: 1234

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

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

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

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

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

【问题讨论】:

  • 如果我 ssh 进入并运行 sudo opsworks-agent-cli get_json 我确实看到了 MYKEY { "deploy": { "server": { "environment": { "MYKEY": "1234" } ..
  • 你找到解决方案了吗?
  • 奇怪的是它在Passenger生产实例中工作,但当我$ bundle exec rails c production作为部署用户时不起作用(这是同一个用户Passenger正在运行)。 Apache 在 www-data 下运行,但如果我以 www-data 或 deploy 身份登录,我看不到任何 env vars 集。所以我在跑步,但我不知道引擎盖下发生了什么。
  • 您是否在应用程序中说您可以访问 ENV 变量?
  • 是的。在 opsworks 门户中运行部署时,我还在输出日志中看到它们(不确定我第一次发布时是否在那里看到它们)

标签: ruby-on-rails aws-opsworks


【解决方案1】:

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

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

我知道 Node.js 配方将所有内容都存储在一个 /srv/www/#{app_name}/shared/app.env 文件中...然后将其引入环境以运行 Node 服务器。这个实现细节也意味着你可以编写 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 或其他。

【讨论】:

  • 非常感谢,这是正确的信息!如果我查看/etc/apache2/sites-enables/myapp.conf,我确实看到了SetEnv "PKTEST" "testing",这就是 OpsWorks 实际写入的位置,以及为什么看不到它正在运行 rails 控制台。
  • 我回答了更多细节和完整的操作指南。请检查并考虑将其标记为正确答案。谢谢。
【解决方案2】:

我(在纽约 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 面板中更新环境变量,请记住重新启动您的实例。

【讨论】:

  • 我试过这个食谱但是没用!我在下面添加了我的答案以及完整详细的操作指南
  • 我做了一点改动
  • 嗯 - 对不起,它对你不起作用。我已经在生产环境中使用这种方法几个月了,没有失败。很高兴您找到了替代解决方案
【解决方案3】:

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

简而言之,我们将 config/secrets.yml 文件与 config/application.yml 文件、Figaro gem 和一个 厨师食谱食谱。 chef cookbook recipe 读取在 OpsWorks 控制台中定义的变量,并让编写 config/application.yml 文件的 Rails 应用程序可以使用它们。

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

这些是我介绍的核心点:

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

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 2014-08-28
    • 1970-01-01
    • 2017-09-04
    • 2021-11-13
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多