【OpsWorks(Chef11)】複数のRailsレイヤーで簡単にマイクロサービスアーキテクチャ環境を構築する5つの設定
前田です。
今ちょうどAWSサミットが開催されていますね。
昨年のようにYouTubeにアップされると思いますので、また時間がある時に見てみようかと思っています。
さてブログですが、前回の続きの「Chef12に対応したAWS OpsWorksにRailsアプリをデプロイする」の第3回目をやろうかと思いましたが、少し変えて、「OpsWorks Chef11版に、複数のRailsアプリをデプロイできるマイクロサービス環境を構築する」という内容で書きたいと思います。
Chef11版のOpsWorksには、デフォルトでRailsレイヤーがセットされているので、Railsアプリケーションをデプロイするのは簡単です。
しかしChef11版では、スタック内には1つのRailsレイヤーしか作成出来ないようになっており、スタック内で2つ以上のRailsアプリが必要となった場合、自分で用意しなければなりません。
今回はスタック内に、いくつも作ることが出来るCustomレイヤーを使って、複数のカスタムRailsレイヤーを作成し、各レイヤーにRailsアプリをデプロイするOpsWorks環境を構築してみました。
ゴール図
準備
必要なもの
VPC(デフォルトでも良い), EC2用セキュリティグループ, EC2キーペア, RDS(MySQL 5.6.27), Railsアプリケーション(Rails 4.2.6, ruby 2.2.5, bundler 1.12.4, GitHubかBitBucketにアップロードされている状態), Custom Chef Cookbooksレポジトリ
OpsWorks準備
OpsWorksのStackを作成し、Customレイヤーの作成、RDSの設定、アプリケーションの設定などを済ませておきます。
Custom LayerにRailsアプリをデプロイする5つの設定
1. OpsWorks StackにCustomJSONをセット
デプロイ時にmigrationする為の設定です。
{
"deploy": {
"アプリケーション名": {
"migrate": true
}
}
}
2. Custom LayerにCustomJSONをセット
StackのCustomJSONに設定しても良いのですが、Stack内に様々なレイヤーが存在する場合にRailsレイヤーにだけCustomJSONをセットしたいので、レイヤーにセットします。
ruby_version 2.2
となっていますが、ノードには2.2の最新のバージョンがインストールされます。(2016/6/3現在は2.2.5)
{
"opsworks": {
"rails_stack": {
"name": "nginx_unicorn"
},
"ruby_version": "2.2"
},
"languages": {
"ruby": {
"ruby_bin": "/usr/bin/ruby"
}
},
"rails": {
"max_pool_size": 2
},
"unicorn": {
},
"opsworks_bundler": {
"version": "1.12.4",
"manage_package": true
}
}
3. レイヤーにレシピをセット
OpsWorksで用意されているレシピを使います。
4. デプロイレシピを用意し、deploy.rbを修正
OpsWorks Chef 11.10: release-chef-11.10 (2016/6/3現在)をダウンロードして、deploy
レシピをディレクトリごと自分のカスタムCookbooksに持って行き、下記コードだけ編集してgit push
します。
deploy/definition/opsworks_deploy.rb
81行目あたり
# 変更前 if deploy[:application_type] == 'rails' && node[:opsworks][:instance][:layers].include?('rails-app')
if deploy[:application_type] == 'rails' && deploy[:application] == 'アプリケーション名'
restart_command "sleep #{deploy[:sleep_before_restart]} && #{node[:opsworks][:rails_stack][:restart_command]}"
end
174行目あたり
# 変更前 if deploy[:application_type] == 'rails' && node[:opsworks][:instance][:layers].include?('rails-app')
if deploy[:application_type] == 'rails' && deploy[:application] == 'アプリケーション名'
case node[:opsworks][:rails_stack][:name]
171行目あたりはUnicornの再起動設定、174行目あたりはNginxのUnicorn設定です。
5. RailsアプリのGemfileにunicornを記入する
Gemfile
group :staging, :production do
gem 'unicorn'
end
手っ取り早く実装したい方は、上記実装だけでいけるかと思いますのでお試しください。
デバッグなどで上記設定にたどり着いた経緯などを書きたかったのですが、力尽きました。。
本当はそっちのほうが大事かもしれません。
弊社はAWSによるスケーラブルで素早いサービス構築を得意としておりますので、いつもでご相談くださいませ!