コンマ

メモ代わりにアウトプットしています。何か不備がありましたら、お気軽にコメント頂けると有り難いです。

EC2インスタンス起動時にRailsアプリケーションにCapistranoでセルフデプロイする方法

TR;DR

EC2インスタンス(Amazon Linux)起動時にRailsアプリケーションにCapistranoでセルフデプロイする方法を記載しています。

背景

AutoScalingでEC2インスタンスを立ち上げる際に以下の問題がありました。

  1. EC2(Nginx + Unicorn + Rails)インスタンスUnicornを手動で起動しなくてはいけない。

  2. 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が起動されていました。