Vagrant1.1を使ってAmazon EC2にCentOSのインスタンスを立ち上げる方法
- 2013/5更新:最新のvagrant-awsの仕様にあわせて修正
- 2013/6更新:最新のvagrant-awsの仕様にあわせて修正
Vagrant 1.1になって、VirtualBoxだけでなく、Amazon EC2やVMware Fusionのインスタンスを作れるようになったのはご存知のとおりだと思いますが、今回は、Amazon EC2上にVagrantを使ってインスタンスを作ってプロビジョニングする方法を紹介します。
AMIの準備
なにはともあれ、Vagrantから起動するためのAMIを作ります。 昨日紹介した方法で自前のAMIを使っても、CentOSが公式に提供するAMIを使ってもよいですが、そのままではVagrantでは便利に使えないので、それらをベースにしてさらにAMIを作ります。AMIの元となるインスタンスの準備
上記のとおりなので雛形とするAMIを使ってインスタンスをコンソールなどから起動します。 起動したらsshでログインします。 そしてvisudo
コマンドを実行します。画面に色々表示されるので
Defaults requiretty
の箇所をコメントアウトしてください。これをしておかないと、Chefなどを使ったProvisioningがうまくいきません。 もしくは、Vagrantからの操作用にユーザーを作成して、sudoできるようにしても大丈夫です。
次に必要なパッケージ群をインストールします(CentOSの公式AMIを使っている場合は必要です)。openssh-clientsは、Vagrantがインスタンスにファイルを転送するのにSCPを使うので必要になります。その他はrvmをインストールするのに必要です。
yum install -y wget gcc automake autoconf make patch zlib-devel openssh-clients
yum clean all
次にiptablesは無効にしておきます。
rm /etc/{rc2.d,rc3.d,rc4.d,rc5.d}/S08iptables
ここまでできたらrvmをインストールします。
bash -s stable < <(curl -s https://raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer )
を実行してください。以下のように表示されます。
Downloading RVM from wayneeseguin branch stable
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 1615k 100 1615k 0 0 73681 0 0:00:22 0:00:22 --:--:-- 88394
Installing RVM to /usr/local/rvm/
Creating group 'rvm'
# RVM: Shell scripts enabling management of multiple ruby environments.
# RTFM: https://rvm.io/
# HELP: http://webchat.freenode.net/?channels=rvm (#rvm on irc.freenode.net)
# Cheatsheet: http://cheat.errtheblog.com/s/rvm/
# Screencast: http://screencasts.org/episodes/how-to-use-rvm
# In case of any issues read output of 'rvm requirements' and/or 'rvm notes'
Installation of RVM in /usr/local/rvm/ is almost complete:
* First you need to add all users that will be using rvm to 'rvm' group,
and logout - login again, anyone using rvm will be operating with `umask u=rwx,g=rwx,o=rx`.
* To start using RVM you need to run `source /etc/profile.d/rvm.sh`
in all your open shell windows, in rare cases you need to reopen all shell windows.
# root,
#
# Thank you for using RVM!
# I sincerely hope that RVM helps to make your life easier and
# more enjoyable!!!
#
# ~Wayne
この説明にしたがって
source /etc/profile.d/rvm.sh
を実行します。その上で
rvm pkg install readline
rvm pkg install zlib --verify-downloads 1
rvm pkg install openssl
rvm install ruby-1.9.3
としてrubyをインストールします。 それが終わったらchefをインストールします。
gem install chef --no-ri --no-rdoc
最後に、このベースとなるマシンには既に公開鍵がインポートされてしまっていて、このままAMIを作ると、この公開鍵が既に存在するために、インスタンス起動時に自動で公開鍵がインポートされなくなってしまいます。それを防ぐために
rm /root/.ssh/authorized_keys
とします。これで準備は完了です。 インスタンスを停止し、このインスタンスを元にしてEBS AMIを作成してください。
Vagrantでインスタンスを起動する
VagrantでEC2のインスタンスを起動するためにはVagrantfileを編集する必要があります。 EC2を使う場合でもboxの指定が必要なので、まず最初にvagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
としてダミーのboxを追加します。
あとは、vagrant initしてできたファイルを以下のように修正します。 僕の場合は、AWS関連の共通の情報は環境変数に設定していますので、そちらを読み込むようにしています。こういう箇所をハードコーディングするとバージョン管理しにくくなってしまうので外だしをオススメします。
# -*- mode: ruby -*-
# vi: set ft=ruby :
Vagrant.configure("2") do |config|
# EC2使う時も指定が必要なのでダミーを.
config.vm.box = "dummy"
config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
config.vm.provider :aws do |aws, override|
aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
aws.keypair_name = ENV['AWS_KEYPAIR_NAME']
# インスタンスの中で使うユーザー名(指定しないとvagrantが使われてしまいユーザーがないと言われます)
override.ssh.username = "root"
override.ssh.private_key_path = ENV['AWS_PRIVATE_KEY_PATH']
# タグを指定します(任意)
aws.tags = { "Name" => "test", "env" => "dev"}
# リージョンを設定します
aws.region = "ap-northeast-1"
# アベイラビリティゾーンを設定する必要がある場合
aws.availability_zone = "ap-northeast-1c"
# この記事の冒頭で紹介した方法で作ったAMIのIDを指定します
# 当たり前ですが、起動したいリージョンにあるAMIでないといけません
aws.ami = "ami-a5fb7ba4"
# インスタンスタイプを設定します
aws.instance_type = "t1.micro"
# セキュリティグループを設定します。
aws.security_groups = ["web"]
end
# 以下はChef Serverと連携する場合の設定です。
# プロビジョニングの設定をしない場合は、インスタンスの起動だけが行われます。
config.vm.provision :chef_client do |chef|
# 自分のChef ServerのURLを指定します。EC2からアクセスできないといけません
chef.chef_server_url = "http://chef.ryuzee.com:4000"
chef.validation_key_path = "~/.chef/validation.pem"
chef.environment = "development"
chef.validation_client_name = "chef-validator"
chef.client_key_path = "/etc/chef/client.pem"
# 摘要するレシピかロールを指定します
chef.add_recipe "apache_mysql_php"
end
end
VagrantによるEC2のインスタンスの操作
インスタンスの起動(provisioningも可能な場合は行う)vagrant up --provider=aws
インスタンスの起動(provisioningはしない)
vagrant up --provider=aws --no-provision
インスタンスの起動状態の確認(通常のVagrantの操作と同じです)
vagrant status
インスタンスの破棄(通常のVagrantの操作と同じです)
vagrant destroy
インスタンスへのSSHログイン(通常のVagrantの操作と同じです)
vagrant ssh
なお、VirtualBoxの場合に提供されている
vagrant halt
は実装されていません。EC2のインスタンスの場合は起動かインスタンスの破棄かどちらかしかできないということです。
実際に動かすとこんな感じで表示されるはずです。
アジャイルコーチングやトレーニングを提供しています
株式会社アトラクタでは、アジャイル開発に取り組むチーム向けのコーチングや、認定スクラムマスター研修などの各種トレーニングを提供しています。ぜひお気軽にご相談ください。
詳細はこちら