EC2インスタンス起動時にRailsアプリケーションにCapistranoでセルフデプロイする方法
TR;DR
EC2インスタンス(Amazon Linux)起動時にRailsアプリケーションにCapistranoでセルフデプロイする方法を記載しています。
背景
AutoScalingでEC2インスタンスを立ち上げる際に以下の問題がありました。
AutoScalingで起動中のEC2インスタンスがあるとき、Capistranoでデプロイをしてしまうと最新のソースコードが反映されていない。
上記の問題を解決するために、EC2起動時にCapistranoでセルフデプロイをする処理を追加するように試みました。
以下はその方法をメモとして残しています。
前提条件
- EC2にCapistranoでデプロイできる状態であること。
EC2起動時に自動実行する
今回は、デフォルトのec2-user
でなく、deploy_user
という別ユーザーで行うことを想定しています。
まず、EC2が起動する際に任意のシェルスクリプトを実行するようにします。
EC2で任意のシェルスクリプトを実行するためには/etc/init.d
配下にスクリプトを配置する必要があります。
self-deployというスクリプト名で以下を記載しました。
内容はログを吐くようにしたのとcapistranoのデプロイコマンドを実行しています。
#!/bin/sh #chkconfig:2345 85 15 #description:rails self deploy shell # log path LOG_DIR=/home/deploy_user/log LOG_FILE=$LOG_DIR/rails.log # make log directory mkdir -p $LOG_DIR start() { echo "start $NAME" sudo su - deploy_user -c " rm -rf /var/www/<任意のディレクトリ>/shared/tmp rm -rf /var/www/<任意のディレクトリ>/current/tmp cd /var/www/<任意のディレクトリ>/current # 以下はlocal用に作成したcapistranoのデプロイコマンドです。 bundle exec cap production_local deploy " >> "$LOG_FILE" 2>&1 chown deploy_user:deploy_user -R $LOG_DIR } case "$1" in start) start ;; esac
/etc/init.d
配下のシェルスクリプトを起動時に実行するようにする。
/etc/init.d
配下のシェルスクリプトを起動時に実行するために
chkconfig --add <シェルスクリプト名>
を実行します。
$ chkconfig --add self-deploy
以下で確認ができます。
$ chkconfig --list self-deploy self-deploy 0:off 1:off 2:on 3:on 4:on 5:on 6:off
実行権限を付与します。
$ chmod +x /etc/init.d/self-deploy
セルフデプロイの環境設定
<Railsルート>/config/deploy/
配下にcapistranoでデプロイする際に環境別にスクリプトを書くと思います。
上記で実行をしようとしている
bundle exec cap production_local deploy
はconfig/deploy/production_local.rb
に記載していることになります。
server 'localhost', user: 'deploy_user', roles: %w(app db web) set :stage, :production set :rails_env, 'production' set :branch, 'master'
localhostにデプロイするようになっています。
この状態でEC2を起動したところ、以下のようなエラーが発生していました。
Caused by: Net::SSH::AuthenticationFailed: Authentication failed for user deploy_user@localhost
Githubとの接続がうまくいってなかったようです。
capistranoでデプロイする際にGithub上でDeploy keys
を設定したので
それを~/.ssh/authorized_keys
に追加してあげました。
$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
再度、EC2を起動したところ正常にセルフデプロイされ、Unicornが起動されていました。