AWS OpsWorksで持っている値をCustom Chef Recipeの中で使いたい!

2013.05.22

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWS OpsWorksで持っている値

AWS OpsWorks用にrecipeを書くにあたって、AWS OpsWorks内で持っている値を使いたい事があります。
OpsWOrksで選べるLayer 特にLayerのタイプがCustomの時には必要になってきます。
AWS OpsWorksのcookbookの中でよく使われている deploy[:***]が怪しいので、Documentを見てみましたが、それらしいものを見つける事ができませんでした。
それなら、実際にログとして出してみて確かめて見ようとという事で調べてみました。
調べた方法は以下のrecipeをCustom Chef recipeとしてdeploy のタイミングで動かして、ログに出力しました。

node[:deploy].each do |application,deploy|
  deploy.each do |key,value|
    Chef::Log.debug("deploy[:#{key}] = '#{value}'")
  end
end

結果

ログに出力されていたものは以下のような感じです。${APPLICATION_NAME}はアプリケーション名に読み替えてください。
アプリケーションのリポジトリへのアクセス用の秘密鍵(${SSH_PRIVATE_KEY}のところ)なんかもココからとれてしまいます。

deploy[:application] にはアプリケーション名が入っている事がわかりました。

deploy[:application] = '${APPLICATION_NAME}'
deploy[:current_path] = '/srv/www/${APPLICATION_NAME}/current'
deploy[:delete_cached_copy] = 'true'
deploy[:home] = '/home/deploy'
deploy[:auto_bundle_on_deploy] = 'true'
deploy[:absolute_document_root] = '/srv/www/${APPLICATION_NAME}/current/'
deploy[:migrate] = 'false'
deploy[:sleep_before_restart] = '0'
deploy[:scm] = 'revisionmasterrepositorygit@github.com:hogehoge/fugafuga.gitscm_typegitpasswordssh_key${SSH_PRIVATE_KEY}'
deploy[:database] = 'passworddatabase${APPLICATION_NAME}reconnecttrueusernameroothost'
deploy[:symlinks] = ''
deploy[:mounted_at] = ''
deploy[:stack] = 'needs_reloadtrue'
deploy[:ssl_support] = 'false'
deploy[:document_root] = ''
deploy[:ignore_bundler_groups] = 'testdevelopment'
deploy[:rails_env] = 'production'
deploy[:enable_submodules] = 'true'
deploy[:rake] = 'rake'
deploy[:group] = 'apache'
deploy[:symlink_before_migrate] = ''
deploy[:nodejs] = 'restart_commandmonit restart node_web_app_${APPLICATION_NAME}stop_commandmonit stop node_web_app_${APPLICATION_NAME}'
deploy[:restart_command] = 'echo 'restarting app''
deploy[:ssl_certificate_ca] = ''
deploy[:ssl_certificate] = ''
deploy[:application_type] = 'other'
deploy[:shell] = '/bin/bash'
deploy[:memcached] = 'port11211host'
deploy[:domains] = '${APPLICATION_DOMAIN}${APPLICATION_NAME}'
deploy[:migrate_command] = 'if [ -f Gemfile ]; then echo 'OpsWorks: Gemfile found - running migration with bundle exec' && /usr/local/bin/bundle exec rake db:migrate; else echo 'OpsWorks: no Gemfile - running plain migrations' && rake db:migrate; fi'
deploy[:action] = 'deploy'
deploy[:shallow_clone] = 'false'
deploy[:environment] = 'RACK_ENVHOME/home/deployRAILS_ENVRUBYOPT'
deploy[:deploy_to] = '/srv/www/${APPLICATION_NAME}'
deploy[:release] = '20130522080819'
deploy[:user] = 'deploy'
deploy[:auto_npm_install_on_deploy] = 'true'
deploy[:ssl_certificate_key] = ''
deploy[:release_path] = '/srv/www/${APPLICATION_NAME}/releases/20130522080819'

ひとこと

ココを使えば一つのrecipeで本番用とテスト環境用とで、処理を切り替えることができそうです。
例えば本番用とテスト環境用とで、コンフィグファイルを切り替えたい時には

node[:deploy].each do |application,deploy|
  if deploy[:application] == "本番用のアプリケーション名"
    #本番用の処理
  elsif deploy[:application] == "テスト用のアプリケーション名"
    #テスト用の処理
  end
end

といったように処理を変える事が出来そうです。
本当はApplicationの値だけでなくて、LayerとかStackで決めた値も取れるかなと期待していたのですが、今回見つける事ができませんでした。
もしかしたら他のところにあるかもしれないので、見つけ次第追記します。

追記!

コメントで教えてもらえました!
こちらの方法で、Stack名とかも確認出来ています。ありがとうございます!
[chef]nodeのアトリビュートをファイルにダンプするレシピ、OpsWorksも対応