[AWS][DevOps] VagrantでEC2インスタンスを作成

By |7月 23, 2013|AWS, DevOps, |


夏までにDevOps!という勝手なキャッチフレーズで今回から3回ほど段階的にDevOpsで有効なツールを解説します。まず始めはこれまでのエントリで結構手軽さは伝わっていると思うVagrantです。今回は、これまでのエントリで利用する立場でしか使ってこなかったVagrantfileを自分で作ってvagrant upをするとEC2にインスタンスが作成される、いった内容をやっていきます。

まず、Vagrantをインストールします。Vagrant Downloadsからプラットフォーム合ったパッケージをダウンロードしてインストールしてください(Vagrantは本来VirtualBoxのフロントエンドツールなんですが、バージョン1.1からEC2にも使えるようになったという経緯がありますので、本来のVirtualBoxでの利用方法を知りたい人は、ドット・インストールさんにVagrant入門という動画で解りやすい解説がありましたのでご覧ください)

Vagrantのインストールが終わったらコマンドを叩いて確認してみましょう。

[html]
# vagrant -v
Vagrant version 1.2.4
[/html]

続いてVagrantでEC2を扱うためのプラグインをインストールします。

[html]
# vagrant plugin install vagrant-aws
[/html]

VagrantでVirtualBoxのインスタンスを作成する際はboxというバーチャルマシンをパッケージしたものが必要になります。ただ、VagrantでEC2インスタンスを作成する際はEC2のAMIの利用が今のところ必須なようなのでboxは必要ないのですが、今のところダミーのboxを利用するという方法しかないようです。

[html]
# vagrant box add dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box
# vagrant box list
dummy (aws)
[/html]

これで準備は整いました。それではEC2へインスタンスを作成するテストワークスペースを作ります。といっても任意の場所にディレクトリを掘るだけです。場所を作成したらディレクトリに入りましょう。

[html]
# mkdir aws-dummy
# cd aws-dummy
[/html]

そして、ついにVagrantの設定を行います。作成したワークスペース内でvagrant initするとVagrantfileが作成されますので作成されたファイルを編集する為に開きましょう。

[html]
# vagrant init
# vi Vagrantfile
[/html]

Vagrantfileには以下のように入力し保存します。

AWSのアクセスキーとシークレットはローカルの環境変数に設定し読込んでいます。タグ、keypair_nameやsecurity_groups、regionやamiは任意のものを必ず設定します。設定しなくてもデフォルト値が入ったりしますがデフォルトのセキュリティーグループが勝手に入ってsshで接続できなくてハマったり良い事ないので、最初に試す時は変なところで無駄にハマらないよう、ちゃんと手でLaunch及び運用が間違いなく動いた設定及びAMIで試しましょう。

AMIは既存のものでも良いですし、今回のテスト用に新しく作成しても良いかと思います。ちなみにinstance_typeはインスタンスの落とし忘れとかあった場合、経済的打撃を押さえる為に上記設定例のようにmicroにしておいた方が良いです。環境変数やAMIの作成などの解説は他へ譲りますので自身で調査してください。

これでvagrant upすればEC2にインスタンスが立ち上がるわけですが、デフォルトではVirtualBoxへインスタンスを立たせに行ってしまいますので以下のようにオプションでAWSを指定します。その後、以下のように最後までログが続けばOKです。

[html]
# vagrant up –provider=aws
Bringing machine ‘default’ up with ‘aws’ provider…
[default] Warning! The AWS provider doesn’t support any of the Vagrant
high-level network configurations (`config.vm.network`). They
will be silently ignored.
[default] Launching an instance with the following settings…
[default] — Type: t1.micro
[default] — AMI: ami-45a93e44
[default] — Region: ap-northeast-1
[default] — Keypair: artsnet
[default] — Security Groups: ["artsnet"]
[default] Waiting for instance to become "ready"…
[default] Waiting for SSH to become available…
[default] Machine is booted and ready for use!
[default] Rsyncing folder: /Users/kojo/Documents/workspace/aws-dummy/ => /vagrant
[/html]

試しにAWSのWebコンソールで見てみましょう。おぉ〜インスタンスが立ち上がってます。

AWS Webコンソール

このまま、おもむろにvagrant sshとすると作成されたEC2インスタンスへsshログインできます。パブリックDNSとか知る必要なし!

[html]
# vagrant ssh
Last login: Thu Jul 18 06:24:53 2013 from xxx

__| __|_ )
_| ( / Amazon Linux AMI
___|\___|___|

https://aws.amazon.com/amazon-linux-ami/2013.03-release-notes/
There are 6 security update(s) out of 11 total update(s) available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-134-142-217 ~]$
[/html]

ここまでテストしたらインスタンスを消します。

[html]
[ec2-user@ip-10-134-142-217 ~]$ exit
logout
Connection to ec2-54-250-106-146.ap-northeast-1.compute.amazonaws.com closed.
# vagrant destroy
[default] Terminating the instance…
[/html]

また作成したければvagrant up –provider=awsするだけです。なんて気軽な。

気をつけなければいけないのがVagrantのバージョンによって書き方が異なる点です。バージョン1.1からEC2へ対応されましたが今回テストで利用した1.2でsshの設定を以下のように書いてしまうと、sshの設定は無視されVagrantのデフォルトのユーザでsshアクセスされることになり結果的に”[default] Waiting for SSH to become available…”で止まり失敗します。

[html]
aws.ssh_username = "ec2-user"
aws.ssh_private_key_path = "~/.ssh/artsnet.pem"
[/html]

また、どうしてもうまく行かない場合はログを吐いてデバッグしましょう。以下のようにすると細かいログが吐かれますので原因はすぐわかると思います。

[html]
# export VAGRANT_LOG=debug
# vagrant up –provider=aws
[/html]

VagrantでEC2インスタンスを作成できて何が嬉しいのか?手でやるのと何が違うのか?それは動かしてみて実感することをお勧めします。コード化できれば複数のインスタンスをまとめて作成したり削除したりを色々と制御できます。これだけでも充分便利かと思いますが、次回以降Vagrantと他のツールを合わせて使っていく事で、もっと具体的に利便性を感じてください。