VagrantとAmazon EC2でVagrantファイルを共用する
みなさんこんにちは。@ryuzeeです。
誰も興味なさそうなVagrantシリーズの第四弾。
さて昨日まではVagrantとChef Soloを組み合わせるパターンについて説明を行ったわけだが、せっかくローカルの環境構築を自動化できたので、これらの設定ファイルを利用してAmazon EC2上にも同じように環境を構築できるようにしよう。結構手順は長いが既にAmazon EC2を使っている人は色々飛ばせる手順がある。 なお今回の話は母艦がMacOS XもしくはLinux系OSで、かつ作成するインスタンスがUbuntuの場合のみ適用可能だ。インスタンスが他のLinux系OSの場合はbootstrapを書き換える必要がある。
EC2 API Toolsの設定
EC2 APIのダウンロード
EC2 API ToolsはAmazon EC2をコマンドラインから操作できる便利ツールだ。 2011/11/9時点の最新バージョンは1.4.4.3でこちらから入手できる。
ec2-api-tools.zipのダウンロードが完了したら適当な場所に解凍して配置しよう。
キーペアの入手と設定
https://aws-portal.amazon.com/gp/aws/developer/account/index.html から証明書を取得できる。
環境編集を設定するために自分の設定ファイル(僕はMacなので~/.bash_profile)に以下を追加し、sourceコマンドで反映する。
###### Amazon EC2 API Tools ######
export EC2_HOME=/path/to/ec2-api-tools-1.4.4.3
export PATH=$PATH:$EC2_HOME/bin
export EC2_CERT=/somewhere/cert-xxxxxxx.pem
export EC2_PRIVATE_KEY=/somewhere/pk-xxxxxxx.pem
export JAVA_HOME=/Library/Java/Home
※なおMacOSの場合なのでJAVA_HOMEが特殊になっている。またキーペアについては自分の環境やファイル名にあわせること。
EC2 API Toolsの動作確認
まずはここまででec2-api-toolsの動作確認を行う。 コマンドラインで
ec2-describe-regions
と打ってみる。以下のように表示されればOKだ。
REGION eu-west-1 ec2.eu-west-1.amazonaws.comREGION us-east-1 ec2.us-east-1.amazonaws.com
REGION ap-northeast-1 ec2.ap-northeast-1.amazonaws.com
REGION us-west-2 ec2.us-west-2.amazonaws.com
REGION us-west-1 ec2.us-west-1.amazonaws.com
REGION ap-southeast-1 ec2.ap-southeast-1.amazonaws.com
デフォルトリージョンの設定
さらにデフォルトで利用するリージョンの設定を行う。 先ほどの環境変数にさらに以下を追加する。
export EC2_URL=https://ec2.us-east-1.amazonaws.com
※US東海岸を利用した場合。設定したら同じようにsourceコマンド等で反映する。
ここまでできたら登録済のインスタンスを以下のコマンドで表示してみる。
ec2-describe-instances
結果以下のように表示される。(登録済のインスタンスがなければ当たり前だが出てこない)
RESERVATION r-d4d71db9 211322666729 quick-start-1
INSTANCE i-xxxxxxx ami-76f0061f ec2-xx-xx-xxx-xxx.compute-1.amazonaws.com ip-yy-yyy-yyy-yyy.ec2.internal running ryuzee 0 t1.micro 2011-02-11T12:38:18+0000 us-east-1d aki-xxxxxx monitoring-disabled 50.16.x.x 10.112.x.x ebs paravirtual xen sg-cab834a3 default
(以下略。一部伏字)
Vagrant-EC2の準備
インストール
まずはライブラリをインストールする 本家のライブラリは https://github.com/lynaghk/vagrant-ec2.gitにあるがバグがあったりMacで動かなかったのでForkして修正したものを用意しておいた。
git clone https://github.com/ryuzee/vagrant-ec2.git
さらにVagrant-EC2用に環境変数を設定しておく。
export EC2_SSH_PRIVATE_KEY=あなたの秘密鍵のフルパス
※上記同様にsourceコマンドで食わせる
Vagrantファイルの修正
Vagrantの定義ファイルを共有するためにVagrantファイルの一部修正が必要だ(既存の動作には影響はない)。Vagrantファイルを開き、以下を追加しておく。(Chef Soloの定義の末尾に足す。本家サイトに書いてある記述から変更してある)
require 'json'open('dna.json', 'w') do |f|
chef.json[:run_list] = chef.run_list
f.write chef.json.to_json
end
open('.cookbooks_path.json', 'w') do |f|
f.puts JSON.generate([chef.cookbooks_path].flatten.map{|x| x})
end
Vagrant-EC2の起動
EC2のインスタンスの起動
いよいよ動作に入るわけだが、動作させるためにはEC2のインスタンスが存在していなければならないので、以下のようなコマンドにてEC2のインスタンスを起動する
ec2-run-instances ami-67aa630e \
--instance-type t1.micro \
--key ryuzee \
--user-data-file /Users/ryuzee/dev/tools/vagrant-ec2/bootstrap.sh
※利用しているAMIファイルはhttp://uec-images.ubuntu.com/lucid/current/に記載のあるもので、ubuntu-images/ubuntu-lucid-10.04-i386-server-20110930になる。
無事起動できると以下のように表示される。
RESERVATION r-a65c00c8 211322666729 default
INSTANCE i-xxxxxxxx ami-67aa630e pending ryuzee 0 t1.micro 2011-11-09T06:46:07+0000 us-east-1d aki-xxxxxxxxxx monitoring-disabled ebs paravirtual xen sg-40b83429 default
再度ec2-describe-instancesを実行してIPアドレスを特定して控えておく
ec2-describe-instances
Vagrantコマンドを動かす前にSSHのポートとHTTPのポートをあけておく。
ec2-authorize default -p 22
ec2-authorize default -p 80
※この時点で作成したサーバにSSHでログインできるはずだ。
ssh ubuntu@ec2-xx-xx-xx-xx.compute-1.amazonaws.com
※この時に鍵を要求されるようなら~/.ssh/configに鍵のパスを追加しておこう。
Vagrant-EC2の起動
さてこれで準備が整ったのでVagrant-EC2を動かそう
cd /path/to/vagrant-ec2
./setup.sh <ip address> your_vagrant_dir_name/
の形式でコマンドを実行する。例としては
./setup.sh 107.22.xx.yy /Users/ryuzee/vagrant_lucid32
すると以下のように表示される。

上記では、keybordの配列を日本語キーボードにするRecipeを流しているが、その結果が表示され正しく実行されたことが分かる。もちろん他のRecipeでも同様に表示されるし、複数のRecipeを指定していれば当然全てが実行される。
以上、最後に遊び終わったら(必要なら)インスタンスは落としておこう。
ec2-terminate-instances i-xxxxxxx
まとめ
とりあえずVagrant-EC2を動作させるところまでは持っていったが、現状アーキテクチャとしては微妙という気がする。わざわざ面倒にしなくてもIPアドレスが分かればCapistranoを使ってインスタンス側にChef Soloをインストールしローカル側からRecipeを転送してあげてchef-soloを実行すれば良いだけな気もするので・・・。
ただひとつのVagrantファイルをVirtualBoxとEC2で共用できるというのはコンセプトとしてはありがたいとは思うので引き続き良い方法を考えてみたい。