使用 AWS OpsWorks 设计 gem 初始化

Posted

技术标签:

【中文标题】使用 AWS OpsWorks 设计 gem 初始化【英文标题】:Devise gem initialization with AWS OpsWorks 【发布时间】:2017-07-01 15:57:17 【问题描述】:

背景信息:我制作了一个 Ruby on Rails 应用程序,它使用了 ruby​​ gem Devise。使用 gem 时,我已在 OpsWorks 控制台中将 gem 的密钥配置为环境变量。

运行before_migrate.rb 部署挂钩时,我运行命令rake assets:precompile。但我在部署日志中收到错误消息。

execute "rake assets:precompile" do
   cwd release_path
   command "bundle exec rake assets:precompile"
   environment "RAILS_ENV" => rails_env
end

在资源 'execute[rake 上执行操作 run 时出错 资产:预编译]' Mixlib::ShellOut::ShellCommandFailed

预期进程以 [0] 退出,但收到 '1' ---- 开始输出 bundle exec rake assets:precompile --trace ---- STDOUT: STDERR:

** 调用资产:预编译(first_time) ** 调用资产:环境(first_time)

** 执行资产:环境

** 调用环境(first_time)

** 执行环境 rake 中止!未设置 Devise.secret_key。请在您的设计初始化程序中添加以下内容:

config.secret_key = '*****'

我知道环境变量最终会被设置,因为在我的before_migrate.rb 文件中,我将环境变量输出到日志中。当我对config.secret_key 进行硬编码时,一切正常。

问题:使用 OpsWorks 时,我的项目中的初始化程序 config/initializers/* 是否会在设置任何环境变量之前运行?没有硬编码密钥或通过 SSH 连接到每个实例,还有其他方法吗?

【问题讨论】:

你不能简单地通过 config.secret_key = ENV[ 'SECRET_KEY_BASE' ] 访问它吗? 没错。我先试过了,还是不行。 【参考方案1】:

你可以access厨师食谱中的环境变量,

node[:deploy]['<YOUR_APP_SHORT_NAME>'][:environment_variables][:SECRET_KEY_BASE]

因此,您可以编写一个配方,将 secrets.yml 或 something.yml 与环境值放在一起。 创建模板,

your_cookbook/templates/default/secret.yml.erb

secret_key: <%= node[:deploy]['<YOUR_APP_SHORT_NAME>'][:environment_variables][:SECRET_KEY_BASE] %>

您可以通过配方将 secret.yml 放在 /data/YOUR_APPLICATION_SLUG_NAME/shared/config 中。

your_cookbook/recipes/default/secret.rb

template "/data/#<YOUR_APP_SLUG_NAME/shared/config/secrets.yml" do
  source "secrets.yml.erb"
  owner 'OWNER'
end

并确保将 shared/config 文件夹中的 secrets.yml 符号链接到部署挂钩中 before_migrate.rb 中的发布路径。

your_code_path/deploy/before_migrate.rb

run "ln -nfs /data/<YOUR_APP_SLUG_NAME>/shared/config/secrets.yml #release_path/config/secrets.yml"

并在您的部署生命周期事件中包含配方your_cookbook::secret

现在您将在代码路径/配置中生成 secrets.yml。您必须加载该 yaml 并将其设置在 config/initializer/devise.rb

config.secret_key = <SECRET KEY FROM THE YML GENERATED>

【讨论】:

感谢您的回答。我会试一试,然后告诉你结果如何。

以上是关于使用 AWS OpsWorks 设计 gem 初始化的主要内容,如果未能解决你的问题,请参考以下文章

Opsworks - 如何从 GitHub 源安装 gem?

AWS+OpsWorks:如何使用 OpsWorks 启用 EC2 实例的详细监控

OpsWorks 中的部署问题

AWS OpsWorks - 无法使用 AWS OpsWorks 部署我的应用程序,尤其是无法成功迁移

Cloudformation + OpsWorks

是否可以在 AWS::OpsWorks::Instance 资源中使用 AWS::CloudFormation::Init 和元数据?