VagrantでAWSのEC2を操作する

2014.09.20 Author: Jas

お久しぶりです。
最近、AWSがマイブームのjasです。

本日は、VagrantとAWSを連携し、VagrantからEC2のインスタンスを操作する方法をご紹介します。

【本日の献立】
1. IAMユーザーの作成
2. EC2の準備
3. vagrant-awsプラグインのインストール
4. Vagrantfileの編集
5. Vagrantコマンドの実行

※AWSアカウントの作成とVagrantのインストールは完了している前提で作業を進めます。

早速、AWS側の下準備から始めましょう~!

1.IAMユーザーの作成

まずは、VagrantからAWSに接続をするためのアカウント(IAMユーザー)を作成します。 IAMについては、@ITのこちらの記事に簡単な紹介があります。

AWSにログインし、サービスメニューから「IAM」を選択します。
IAMメニューのUsersから、「Create New Users」を選択し、Vagrant用のアカウントを作成します。
ユーザー名を入力し、「Generate an access key for each user」にチェックをして、ユーザーを作成します。

create_user.jpg

ユーザー作成時に精製したアクセスキーIDとセキュリティアクセスキーは後ほど使用しますのでダウンロードしておくか、メモしておきましょう。

access_key.jpg

作成したユーザーの詳細画面から、IAMポリシーを設定します。
参考:「IAMのポリシーを設定する」 By @IT

Vagrant用には、EC2のインスタンス操作のみを許可すれば問題ありません。
この記事で紹介する範囲なら、以下のようなActionが許可されていれば操作可能です。

{
  "Effect": "Allow",
  "Action": [
    "ec2:DescribeImages",
    "ec2:AttachVolume",
    "ec2:CreateVolume",
    "ec2:*Instances",
    "ec2:DescribeSecurityGroups",
    "ec2:CreateTags"
  ],
  "Resource": [
    "*"
  ]
}

これで、VagrantからAWSにアクセスするアカウントの用意できました。

2.EC2の準備

EC2でインスタンスの操作をするため、鍵とセキュリティグループの作成、AMI(イメージ)の用意をしましょう。

サービスメニューから「EC2」に移動します。
EC2メニューのKey Pairsから、「Create Key Pair」を選択し、SSHの鍵を作成します。
作成した鍵の「Key pair name」が必要になりますので、メモしておきましょう。

次にEC2メニューのSecurity Groupsから、「Create Security Group」を選択し、VagrantからSSH接続を許可するための設定を行います。
セキュリティグループの「Group Name」が必要になりますので、メモしておきましょう。

security_group.jpg

最後にAMIですが、公開されているAMIでもよいですし、お好みのインスタンスからImageを作成してもよいので、Vagrantから起動したいマシンのテンプレートになるものを用意し、そのAMI IDを控えておきましょう。

3.vagrant-awsプラグインのインストール

VagrantとWASの連携には、vagrant-awsというプラグインが公開されています。

vagrant-aws のインストールは簡単!

> vagrant plugin install vagrant-aws

たったこれだけです。

ついでにVagrantの起動に必要なダミーboxを追加します。
(Vagrantの起動にはboxファイルが必ず必要なため)

> vagrant box add aws-dummy https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box

これでプラグインの準備もできました。

4.Vagrantfileの編集

あともう少し! vagrant init をして、Vagrantfileを編集しましょう。
> vagrant init aws-dummy

Vagrantfileファイルの内容はこんな感じです。

VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
# Box setting
config.vm.box = "aws-dummy"
config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"

# AWS Setting
config.vm.provider :aws do |aws, override|
aws.access_key_id = 'IAMのアクセスキーID'
aws.secret_access_key = 'IAMのセキュリティアクセスキー'
aws.keypair_name = 'EC2のKey pair name'
aws.region = 'ap-northeast-1' # リージョンを指定
aws.instance_type = 't1.micro' # インスタンスタイプを指定
aws.ami = 'ami-xxxxxxx' # AMI ID(マシンイメージ)
aws.security_groups = ['セキュリティグループのGroup Name'] # セキュリティグループは複数指定可能
aws.tags = {
'Name' => 'インスタンスのName(255文字以内でご自由に♪)'
}

# Device Mapping
aws.block_device_mapping = [
{
'DeviceName' => '/dev/sda',
'Ebs.DeleteOnTermination' => true # terminate時にEBSを削除する(※)
}
]

override.ssh.username = "sshユーザー名"
override.ssh.private_key_path = 'ローカルに保存してある秘密鍵(pem)のフルパス'
end
end

AWS設定として、1~3で準備したIAMアクセスキー、EC2の鍵やセキュリティグループ、AMI IDなどを指定します。
Device Mappingで指定している'Ebs.DeleteOnTermination'をtrueにしておかないと、Vagrantからインスタンスを終了(terminate)しても、EBSにVolumeだけ残ってしまい、容量に応じて課金されますので注意しましょう。
(私は気づかないうちに大量生産していて、初年度の無料枠をぶっちぎってしまい、ばっちり課金されました・・・)

5.Vagrantコマンドの実行

すべての準備が整ったら、Vagrantコマンドを実行してみましょう。

インスタンスの起動は以下のコマンドで行えます。

> vagrant up --provider=aws

どうですか?
エラーが出ずにインスタンスが作成され、起動したでしょうか!?

その他、インスタンスを操作するコマンドは以下の通りです。

# インスタンスの作成&起動(launch)
> vagrant up --provider=aws

# インスタンス停止(stop)
> vagrant halt

# 作成済みインスタンスの起動(start)
> vagrant up

# インスタンスの再起動
> vagrant reload

# インスタンス終了(terminate)
> vagrant destroy

「vagrant up --provider=aws」でインスタンス起動すると、.vagrantフォルダの中にAWSのインスタンスIDが記述されたファイルが格納されるので、再度「vagrant up --provider=aws」を実行すると既にインスタンスが存在していますのエラーとなります。

作成済みインスタンスの起動はオプションなしの「vagrant up」で行えます。
また、一度「vagrant destroy」すれば、再度「vagrant up --provider=aws」で新しいインスタンスを作成できます。

これで、AWSの管理画面にログインしなくても、Vagrantから楽にインスタンスを起動したり、停止したりできるようになりました。
最初の準備が少し大変ですが、Vagrantの操作を知っていれば、簡単にAWSのインスタンスを操作できるのは、かなりメリットがあるのではないでしょうか?

名古屋のWebシステム開発・ネットワーク構築会社 コネクティボへ