Vagrant + AWS + Ansible をやってみる



## AWS準備

### AWSアカウントを作成

[AWSクラウドのご利用開始方法](https://aws.amazon.com/jp/getting-started/)にアクセスしてアカウントを作成する。
以降の作業は[AWS Management Console](https://console.aws.amazon.com/console/home?region=ap-northeast-1)で行う。

### リージョンを選択

Tokyoリージョンを選択する。

### グループを追加する

[AWS - IAM Management Console - Group](https://console.aws.amazon.com/iam/home?region=ap-northeast-1#groups)で ``vagrant`` グループを追加する。

* Create New Groupを選択する
* Group Nameに ``vagrant`` を設定する
* Select Policy Templateは ``Power User Access`` 選択する

### ユーザを追加する

[AWS - IAM Management Console - User](https://console.aws.amazon.com/iam/#users)で ``vagrant`` ユーザを追加する。

* Create New Usersを選択する
* Enter User Namesに ``vagrant`` を設定する
* 追加後 ``access_key_id`` と ``secret_access_key`` が表示されるので記録する
	* ``secret_access_key`` は二度と確認できないので注意！

### セキュリティグループを追加する

[AWS - EC2 Management Console - SecurityGroup](https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#SecurityGroups:sort=groupId)で ``vagrant`` セキュリティグループを追加する。

* Create Security Groupを選択する
* 基本情報を設定する
	* GroupName - vagrant
	* Description - sg-vagrant
	* VPC - デフォルトVPC(*がついているもの)
* Security group rulesのInboundに以下を追加する
	* SSH, TCP, 22, 0.0.0.0/0
	* HTTP, TCP, 80, 0.0.0.0/0
	* HTTPS, TCP, 443, 0.0.0.0/0

### キーペアを追加する

[AWS - EC2 Management Console - Key Pairs](https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#KeyPairs:sort=keyName)で ``vagrant`` キーペアを追加する。

* Create Key Pairを選択する
* Key pair nameに ``vagrant`` を設定してCreateを押す

生成後、``vagrant.pem`` がダウンロードできる。
``${HOME}/.ssh/vagrant.pem`` に配置する。


## Vagrant準備

### インストール

[公式サイト](http://www.vagrantup.com/downloads.html)からインストーラをダウンロードしてインストールする。

### Pluginをインストール

以下のコマンドを実行する。

```bash
$ vagrant plugin install vagrant-aws
$ vagrant plugin install dotenv
```


## VagrantでAWSの仮想マシンを立ち上げる

### 作業ディレクトリを作成

どこでもいいので適当に作成する。
以下の作業は、作成したディレクトリで行う。

### .envファイルを追加する

dotenvプラグインを使って環境変数を設定する。

```:.env
AWS_SSH_USERNAME="ec2-user"
AWS_SSH_KEY=${HOME}/.ssh/vagrant.pem
AWS_ACCESS_KEY_ID="置き換える"
AWS_SECRET_ACCESS_KEY="置き換える"
AWS_KEYPAIR_NAME="vagrant"
AWS_SECURITY_GROUP="vagrant"
```

### Vagrantfileを追加する

立ち上げる仮想マシンの情報を設定する。

```:Vagrantfile
# -*- mode: ruby -*-
# vi: set ft=ruby :

Dotenv.load

# change default provider to digital_ocean
ENV['VAGRANT_DEFAULT_PROVIDER'] = "aws"

# Vagrantfile API/syntax version. Don't touch unless you know what you're doing!
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|

  config.vm.provider :aws do |provider, override|
    override.vm.hostname          = "vagrant-test"
    override.vm.box_url           = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
    override.vm.box               = "aws"
    override.ssh.username         = ENV['AWS_SSH_USERNAME']
    override.ssh.private_key_path = ENV['AWS_SSH_KEY']
    override.ssh.pty              = false

    provider.access_key_id        = ENV['AWS_ACCESS_KEY_ID']
    provider.secret_access_key    = ENV['AWS_SECRET_ACCESS_KEY']
    provider.keypair_name         = ENV['AWS_KEYPAIR_NAME']
    provider.region               = "ap-northeast-1"  # Tokyo
    provider.availability_zone    = "ap-northeast-1c" # Tokyo
    provider.ami                  = "ami-c9562fc8"    # Tokyo Amazon Linux AMI 2014.03 (64-bit)
    provider.instance_type        = "t1.micro"
    provider.instance_ready_timeout = 120
    provider.terminate_on_shutdown  = false

    provider.security_groups      = [
                                      ENV['AWS_SECURITY_GROUP'], # sg-vagrant
                                    ]

    provider.tags                 = {
                                      "Name"        => "vagrant-test",
                                      "Description" => "Boot from vagrant-aws",
                                    }

    provider.block_device_mapping = [{
                                      "DeviceName"              => "/dev/sda1",
                                      "VirtualName"             => "VagrantDisk",
                                      "Ebs.VolumeSize"          => "8",
                                      "Ebs.DeleteOnTermination" => true,
                                      "Ebs.VolumeType"          => "standard",
                                     #"Ebs.VolumeType"          => "io1", # only if you choose PIOPS
                                     #"Ebs.Iops"                => 1000,  # only if you choose io1
                                    }]

    # enable these properties only if you plan not to use Default VPC
    #provider.subnet_id            = ENV['AWS_SUBNET_ID']
    #provider.private_ip_address   = "172.31.16.10"
    #provider.elastic_ip           = true

    # enable sudo without tty
    # NOTE: setting [ ssh.pty = true ] causes file provisioner fail
    provider.user_data = <<-USER_DATA
#!/bin/sh
echo "Defaults    !requiretty" > /etc/sudoers.d/vagrant-init
chmod 440 /etc/sudoers.d/vagrant-init
    USER_DATA

    # disable synced_folder:
    override.vm.synced_folder "./", "/vagrant", disabled: true

    # provision
    override.vm.provision "ansible" do |ansible|
      ansible.playbook = "provisioning/playbook.yml"
    end
    # Do whatever you wanna do !!
  end

end
```

### 起動する

``--provider=aws`` は ``ENV['VAGRANT_DEFAULT_PROVIDER'] = "aws"`` を設定してある場合は、省略できる。

```bash
$ vagrant up --provider=aws
```


## 参考

* [vagrantではじめるクラウド開発環境（AWS編）](http://qiita.com/msykiino/items/1a8c8157978abff51229)