使用 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 实例的详细监控
AWS OpsWorks - 无法使用 AWS OpsWorks 部署我的应用程序,尤其是无法成功迁移
是否可以在 AWS::OpsWorks::Instance 资源中使用 AWS::CloudFormation::Init 和元数据?