Blog

Vagrant1.1を使ってAmazon EC2にCentOSのインスタンスを立ち上げる方法

 2013/03/19
このエントリーをはてなブックマークに追加

  • 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のインスタンスの場合は起動かインスタンスの破棄かどちらかしかできないということです。

実際に動かすとこんな感じで表示されるはずです。

 2013/03/19
このエントリーをはてなブックマークに追加