はじめに
この記事は、JAWS-UG KOBE の勉強会 秋のデプロイ祭り の発表資料です。
AWS のデプロイメントサービスである OpsWorks を使って、Rails アプリを短時間でデプロイしてみたいと思います。
それでは、早速いってみましょう!
プロジェクトを作成してGitHubにアップ!
プロジェクトの作成
Rails プロジェクトを作成します。
rails new sample_app -d mysql (-T)
- -Tはお好みで。
- sample_app は自分のプロジェクト名を。
- dbは RDSに接続することも考えて、mysql のほうが無難。(今回はEC2上のMySQLです)
GemFile
今回の構成用に GemFileを修正します。
コメントアウト
gem 'unicorn'
gem 'therubyracer', platforms: :ruby
追加
gem 'execjs'
適当にデータを入れてローカルで確認。
今回は、お友達リストを作りました。
rails g scaffold friend name:string age:integer address:string mail:string
rake db:create
rake db:migrate
rails s
ふむ。
asset precompile 設定
Railsをデプロイするには、asset precompileして、jsやCSSなどを固めておく必要があります。
Railsのデプロイフックという機能を利用して、デプロイ時にassetをビルドします。
- deploy/before_migrate.rb というファイルを作成し、以下のコードを記述。
Chef::Log.info("Running deploy/before_migrate.rb")
env = node[:deploy][:sample_app][:rails_env]
current_release = release_path
execute "rake assets:precompile" do
cwd current_release
command "bundle exec rake assets:precompile"
environment "RAILS_ENV" => env
end
このエントリが参考になります。
http://interu.hatenablog.com/entry/2013/08/01/214258
GitHubにPUSH
この構成でGitHubにPUSHします。以下のリポジトリの構成を目指します。
https://github.com/jaws-ug-kobe/2016-10-19-deploy-fes
OpsWorksの設定
スタック
- ビルトインレシピが利用できるChef 11.10 のスタックタイプを利用
- デプロイ失敗したときに、失敗したマシンにログインしたいときがあるので、Default SSH key は設定しておくほうが何かと便利
- Custom JSON にデータベースの接続設定を書いておく。(Railsのdatabase.ymlがこの情報で上書きされます)
{
"deploy": {
"sample_app": {
"database": {
"adapter": "mysql2",
"username": "root",
"password": "XXXXXX",
"database": "XXXXXXXXX"
}
}
}
}
Custom JSONに関してはこちらが参考になります。
https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/customizing-rds-connect-customize.html
レイヤー
先ほど作ったスタックにDBのレイヤーとApplicationレイヤーを追加します。
Rails App Server レイヤー
webサーバーにはnginx、rackサーバーには Unicorn を利用します。
- Rails stack は、 nginx and Unicorn を選択
MySQL レイヤー
- ルートパスワードは適宜かえてください。
インスタンスを追加
レイヤーを追加したら、それぞれのレイヤーでインスタンスをデプロイします。
MySQLも同様に追加します。
Appsの設定
デプロイするアプリケーションの設定をします。
- Name は Railsで作ったプロジェクト名と同じにする。(同じにしないとデプロイできません。)
- Data Sources は、OpsWorks を選択。 RDSレイヤーのインスタンスを選択。データベースは、Custom JSONで指定したものを。
- Application Sourceは、GitHub のリポジトリを指定。
- Environment Variables に、 Railsが利用するSECRET_KEY_BASEを設定。(OpsWorksコンソール上で見えるのが嫌な人は、Protected Value にチェック)
Application Source として、private リポジトリを設定する場合は、 Repository SSH Keyを設定します。
https://docs.aws.amazon.com/ja_jp/opsworks/latest/userguide/workingapps-deploykeys.html
SECRET_KEY_BASE は rake コマンドで生成します。
rake secret
デプロイメント
ふむ。
ロードバランサー
複数のインスタンスと高負荷のときにだけ起動するインスタンスを作り、フロントにロードバランサーを配置して、信頼性を高めます。
- ロードバランサーはEC2のダッシュボードから作成
- 現状OpsWorksで対応しているのは標準ロードバランサーのみ
- セキュリティグループはAWS-OpsWorks-LB-Serverを選択(ポート80,22,443のインバウンドを許可します)
- ヘルスチェックの対象ページは、/friendsを指定。(friendsモデルを作ったので)
- OpsWorksで作成したRails App Serverレイヤーのインスタンスを選択
EC2ダッシュボードでの操作
OpsWorksダッシュボードでの操作
- Layers の Rails App Server の Setting->Network の順に進み、ロードバランサーを選択
- ELBがデプロイされ、ヘルスチェックが疎通すれば、Health の欄が緑色になる。(デプロイされるまでは赤色)
ふむ。
常時起動インスタンスと高負荷時のみ起動するインスタンスを追加
- 常時起動インスタンスは、最初にインスタンスを追加した要領でOK
- 高負荷時起動インスタンスは、Load-Based インスタンスを選択
- Load-Based Configuration を有効にすること。(デフォルトはOFF)
まとめ
- Custom JSONとデプロイフックだけきちんとする。