Capistrano3でEC2インスタンス新規作成から初期設定までのデプロイ(まとめ)

ここまでAWSのEC2インスタンスを新規作成して、そのインスタンスに対しての初期設定までを、Capistrano3でタスク化することをやって来ました。難儀したものの、ようやくEC2インスタンスの準備が出来て、あとはミドルウェアやアプリケーションをインストールするだけ──というところまでたどり着きました。そこで今回は、これまでのデプロイの流れを一度総括してまとめてみようかと思います。

まず、Capistrano3を稼動させるデプロイサーバの準備から。公式のAmazon Linux環境などのEC2インスタンスをAWSマネージメントコンソール等からラウンチして、ログインしたら、Capistrano3をインストールします1

デプロイサーバにてデプロイプロジェクトを実行するユーザを作成しておきます。デプロイタスクの内容にもよるのですが、対象のユーザはsudo権限を持っていた方が都合が良いかと思います。ユーザを作成したら、そのユーザで再ログインして、ホームディレクトリで、Capistrano3用のプロジェクトを作成します。

次に、デプロイプロジェクト「cap3-project」の設定を行います。
まず、デプロイプロジェクト共通で利用するグローバル設定cap3-project/Capfileの編集します。

Capfile

今回のデプロイではタスクにてrvmやrails等を利用しないので、オプションモジュールのインクルードは不要です。一応、デフォルトのデプロイ環境が「test」であることのみ指定しておきます。

次に、デプロイ環境ファイルcap3-project/config/deploy/test.rbの設定です。

config/deploy/test.rb

今回のデプロイでは、デプロイ環境へのロール設定やSSH設定は、実際のタスク中で都度々動的に行うため、初期設定値は全てコメントアウトしています。

そして、デプロイタスクの実体を設定します。

config/deploy.rb

今回のデプロイでは異なるタスク間で共通的に行われる作成したEC2インスタンスの特定の情報を取得する処理や、SSHアクセス情報を設定する処理などを関数化しています。SSHオプションの設定については初回アクセスと次回以降のアクセスにてroleを変えて設定しています2。また、タスクのafterメソッドを使って、create_instancesタスクを実行するとupdate_packagesタスクまで全自動でデプロイが実行されるようにしてみました3

最後に、EC2インスタンス作成時に利用するキーペアのプライベートキーファイルをデプロイユーザのホームディレクトリにSCP等でアップロードしておきます。
これで、準備完了です。

それでは、実際にデプロイを行ってみます。
デプロイタスクを起動する時は、プロジェクトをインストールしたパスで行います。

デプロイ結果のログは下記の通りです。

デプロイが完了しました。

Capistrano3で新規EC2インスタンスをデプロイした後、特に定常的にデプロイを行わない場合は、デプロイサーバのインスタンスは停止しておくか、AMIを取ってターミネートしておくという運用が良いかと。デプロイサーバはデプロイする時だけ使えれば良いので、このインスタンスに費用が発生するのは無駄になります。


  1. これはRVM経由でインストールする場合の一例です。RubyやCapistrano3などのインストール方法は色んな方法があるので、用途によって変更してください。 
  2. roleを変えずにSSHオプションを定義すると、同roleに異なるユーザとしてのSSHアクセスが追加されて行くため、2回目以降のSSHにもアクセスできなくなった初回SSHの情報が残り、無駄にSSH接続を行いタスクがフリーズしてしまいます。 
  3. 作成したEC2インスタンスの起動チェックのタスクで15秒×30回のウェイト間にインスタンスのステータスが全OKにならなかった場合はそこでタスクは中断します。その場合は、deploy:update_packagesタスクから再デプロイすることでリトライ可能です。 

おすすめ記事