2012/01/24

EC2インスタンス管理の極意



タイトルは嘘です。気にしないで下さい。

どうも taka です。はじめまして。
このブログを見てて、縁があってミツバチワークスへ転職してきました。
まさか、このブログを書く日が来るとは…。

今回のネタ

DECOLOGに関係しない事でも良いと言う事なのでAWSのEC2についてです。
現在、ミツバチワークスでは新サービス(iPhoneアプリ)を開発中です。

そのサービスでAWSを使う事になったので、さぁー大変。

社内的にも僕的にもAWSをちゃんと使うのは初めてなのでかなり手探り状態です。

つまり、

『記事にすれば、誰かいい方法を教えてくれるだろう!』

という期待を込めた記事です(笑)

EC2を立ち上げてみて困った事

  • ホスト名長すぎ!
  • プライベートIPをわざわざ管理コンソールで確認するのか…
  • AMI作ってみたけどデプロイする度に作りなおすの?

という事。

インスタンスを起動してみたもののサービスとして運用する為に
どうすればいいかが全くイメージできない状況でした。

ホスト名/プライベートIPの問題

まずは、ホスト名/プライベートIPの問題。

  • 分かりやすい名前を付ける
  • ルールに則って自動で付ける
  • /etc/hostsにホスト名とIPを登録

にしたい。

そこで、タグを使用することにしました。

タグはインスタンスに複数付けられるので他にも活用できそうです。

KeyValue
Nameホスト名

と設定します。

AWSのいい所はAPIを使えば大抵の事がなんとかなる所です。

というわけで、AWS SDK for Rubyを使ってスクリプトを作ります。

流れはこんな感じです。
  1. 起動中のインスタンス一覧を取得
  2. 各インスタンスのタグを取得
  3. ルールに則って新規インスタンス用のタグを決める
    app001, app002, ...という連番をふる
  4. 新規インスタンス起動
  5. タグを設定
  6. sshコネクションが確立するまで待つ
    aws-sdkを使うとプライベートIPが取れるのでNet::SSHを使ってチェック
  7. sshログインして、hostnameコマンドでホスト名を設定
  8. IPアドレスとホスト名の情報を/etc/hostsに書きこむ

■インスタンス起動部分のコード


■hosts生成部分のコード


これで、
ssh user@app002
とかできるようになります。

ソースコードの最新化

これに関しては、gitからソースコードを持ってきて展開すればいいだけですね。
既存サービスだとリポジトリと本番で差分があってできないとか起こりそうですが…。

というわけで、Capistranoを使うことにしました。
ここでも、タグが大活躍です。

KeyValue
Roleapp

というような値を設定しておきます。

先程作ったスクリプトに、タグから
server 'app002', :app
という感じでrbファイルを生成しましょう。

これを使えば、新しいデプロイ先としてCapistranoに追加できます。

deployレシピについて

残念ながら今回のサービスのサーバ側は、Railsではありません。
なので、標準のdeployレシピをそのままでは使えません。
とはいえ、シンボリックリンクを貼る所を少し直せば適用できました。

これで、
cap deploy HOSTS=ホスト名
とやれば、対象サーバに一発で最新のソースコードが展開されます。

cap deploy HOSTS=ホスト名 -S revision=リビジョン番号
と任意のリビジョンを配布することもできます。

このコマンドも先程のスクリプトの最後の部分に貼り付けておきましょう。

まとめ

さて、いかがだったでしょうか?
意外と簡単に操作できそうですね!

コマンド一発ですぐにサービスに投下できるリソースが手に入るのはとても魅力的です。
ここまで来ると、監視システムと連動してインスタンスを増やすとかやりたくなります。

でも、そこまでの仕組みは作っていません。

もし、新サービスが盛り上がってくれればそういったノウハウも公開できると思います。
その為にも、リリースされた際には皆さんも使ってみて下さいね!!(笑)