使用AWS Opsworks设置环境变量

时间:2013-10-19 05:45:12

标签: ruby-on-rails asset-pipeline chef aws-opsworks

我正在使用AWS Opsworks来托管我的Rails应用程序(Ruby 2.0 / Rails 3.2)。 对于资产编译过程,我使用AssetSync在S3上自动上传编译的资产。我曾经将凭证存储为环境变量。

您是否知道如何使用Chef / Opsworks进行此操作?

感谢。

7 个答案:

答案 0 :(得分:7)

我知道这是一篇较旧的帖子,但是我发帖说这是为了帮助别人。

我发现最简单的方法是使用Chef的部署挂钩(http://docs.opscode.com/resource_deploy.html#deploy-phases)。

在Rails项目根目录中添加名为“deploy”的目录。

在其中添加一个名为before_restart.rb的文件,代码为:

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

# map the environment_variables node to ENV
node[:deploy].each do |application, deploy|
  deploy[:environment_variables].each do |key, value|
    Chef::Log.info("Setting ENV[#{key}] to #{value}")
    ENV[key] = value
  end
end

当您触发OpsWorks部署时,您应该能够看到在Rails App Server实例日志中设置的ENV变量。

答案 1 :(得分:4)

我最终使用https://github.com/joeyAghion/opsworks_custom_env。 它运作得很好。

答案 2 :(得分:2)

我使用了一种稍微不同的方法,使用OpsWorks钩子将JSON复制到application.yml。你可以在这里阅读更多相关信息:http://zaman.io/how-to-import-aws-opsworks-json-into-rails-app/

答案 3 :(得分:2)

环境变量之外的另一个选择是,您可以在部署时生成包含变量的文件。

例如,对于Rails应用程序,config / secrets.yml是放置这些应用程序的合理位置。我创建了一个deploy / before_restart.rb部署钩子,其中包含以下内容:

def create_secrets(secrets, release_path)
  Chef::Log.info("Creating secrets")
  file_path = ::File.join(release_path, 'config/secrets.yml')
  ::File.open(file_path, 'w') do |f|
    f.write("production:\n")
    secrets.each do |k,v|
      f.write("  #{k}: #{v}\n")
    end
  end
end

node[:deploy].each do |application, deploy|
  create_secrets(deploy[:secrets], release_path)
end

然后在你的OpsWorks堆栈Custom JSON中你可以添加你的秘密:

  "deploy": {
    "super_cool_app": {
      "secrets": {
        "some_service_id": "foo",
        "some_password": "bar"
      }
    }

答案 4 :(得分:2)

您可以在应用程序的根目录中创建一个deploy文件夹,在其中创建一个文件before_restart.rb,然后在您的文件中运行预编译任务

run "cd /srv/www/myapp/current && /usr/local/bin/bundle exec rake assets:precompile"

此文件将在每个部署

上运行

来源:

https://www.youtube.com/watch?v=nHu8fCp9GR4&list=WL&index=7

答案 5 :(得分:1)

现在可以根据文档在应用程序配置中直接从AWS控制台完成此操作:http://docs.aws.amazon.com/opsworks/latest/userguide/workingapps-creating.html#workingapps-creating-environment

答案 6 :(得分:0)

我已经在这里回答:AWS OpsWorks Environment variables not working

重要的是要理解,从OpsWorks仪表板我们可以将所有声明的环境变量传递给Chef,然后我们需要使用Chef配方处理这些变量,以便将它们提供给Rails环境。

在这里,您可以找到您要找的内容:https://medium.com/@diego_durante/opsworks-rails-and-environment-variables-30c6a143253c#.696grsgg9