VagrantとAmazon EC2でVagrantファイルを共用する

 2011/11/09
このエントリーをはてなブックマークに追加

誰も興味なさそうな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で共用できるというのはコンセプトとしてはありがたいとは思うので引き続き良い方法を考えてみたい。

 2011/11/09
このエントリーをはてなブックマークに追加

サイト内検索


著作

寄稿

Latest post: