vagrant-awsを使用する際のVagrantファイル詳細



## 使い方

 - vagrant-awsのインストール

```
vagrant plugin install vagrant-aws
```

 - 起動方法

```
vagrant up --provider=aws
```



## Vagrantfileのサンプル

```
VAGRANTFILE_API_VERSION = "2"

$script = <<SCRIPT
# 
echo 'Start ShellScript'
# タイムゾーンを日本に変更
sudo cp -p /usr/share/zoneinfo/Japan /etc/localtime
# AWSのVolumeのリサイズ（デフォルトだと8GBのため）
sudo resize2fs /dev/sda1
SCRIPT

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  # Box名
  config.vm.box = "dummy"
  # 「vagrant box add」をしなくていいように設定
  config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
  # 同期するフォルダを選択（vagrant-awsでは常に同期される訳ではなく、provisionやupなどのコマンド実行時に同期される）
  config.vm.synced_folder "./", "/home/ec2-user/vagrant", disabled: true
  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 = "キーペア名"
    # インスタンスタイプ（http://aws.amazon.com/jp/ec2/pricing/ を参照）
    aws.instance_type = "c3.large"
    # リージョン（東京はap-northeast-1）
    aws.region = "ap-northeast-1"
    # アベイラビリティゾーン
    aws.availability_zone =  "ap-northeast-1c"
    # 使用するAMIのID
    aws.ami = "AMIのID"
    # セキュリティグループ（複数指定でor判定）
    aws.security_groups = ['group1','group2']
    # タグ
    aws.tags = {
      'Name' => '名前',
      'Description' => '詳細'
    }
    # 最初に実行されるシェルスクリプト（sudoできるamiを作成した方が良い）
    aws.user_data = "#!/bin/sh\nsed -i 's/^.*requiretty/#Defaults requiretty/' /etc/sudoers\n"
    # EBSの指定が可能
    aws.block_device_mapping = [
      {
        # デバイス名
        'DeviceName' => "/dev/sda1",
        # 名称
        'VirtualName' => "ボリューム名",
        # ボリュームサイズ（GB単位）
        'Ebs.VolumeSize' => 100,
        # ターミネートした際に削除するかどうか
        'Ebs.DeleteOnTermination' => true,
        # EBSのタイプを指定      
        'Ebs.VolumeType' => 'standard',
        #'Ebs.VolumeType' => 'io1',
        # standardでIOPSを指定するとエラーが発生するので注意
        #'Ebs.Iops' => 1000
      }
    ]
    # -----
    # ここからはVPCを使用する際の設定
    # サブネットID（マネジメントコンソールから取得）
    #aws.subnet_id = 'サブネットID'
    # VPC内のローカルIPアドレスを指定
    #aws.private_ip_address = '192.168.0.33'
    # 自動的にEIPを割り当てる場合（EIPの取得上限は5個のためそれ以上の指定はエラーとなる）
    #aws.elastic_ip = true

    # -----
    # SSHのユーザー名を指定（AMIはec2-user、ubuntuはubuntu）
    override.ssh.username = "ec2-user"
    # SSHのKeyのパスを指定
    override.ssh.private_key_path = "~/.ssh/aws-key.pem"
  end
  # シェルを実行
  config.vm.provision "shell", inline: $script
  # Chefを実行
  config.vm.provision :chef_solo do |chef|
    chef.cookbooks_path = ["./site-cookbooks"]
    chef.add_recipe     "php54"
    chef.add_recipe     "apache"
    chef.json = {
    }
    # ログレベル
    #chef.log_level = :debug
  end
  # 仮想環境にインストールするchefのバージョン（latestは最新バージョンという意味）
  config.omnibus.chef_version = :latest

end
```

## 各オプションについて

 - vagrant-awsを使用する際のおまじない

```
config.vm.box = "dummy"
config.vm.box_url = "https://github.com/mitchellh/vagrant-aws/raw/master/dummy.box"
```

 - Key Pairを設定（値は以下から参照）
https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1#KeyPairs:


```
aws.keypair_name = 'keypair'
```

## 知っておくと便利なこと

 - 「./.vagrant/machines/aws/id」にEC2のインスタンスIDが記述されているので削除すればAWS起動前と同じ状態になり、
編集、作成すればVagrantで起動していないEC2インスタンスについても
操作することが可能です。


## その他

 - vagrant-awsはREADME.mdに書かれていないオプションがあるので使用する際には調査が必要
 - 便利ですけど個人的にはaws-cliとChefを組み合わせた方がいい気がします。
 - 今時はvagrant-aws使わないでProductionでは他のものを使ったほうがいいですね。

## 便利コマンド

 - AWSのインスタンスのIDを取得

```
INSTANCE_ID=`cat .vagrant/machines/default/aws/id | sed  "s/$//g"`
```

 - AWSのパブリックIDアドレスを取得（aws-cliが必要になります）

```
AWS_PUBLIC_IP=`aws ec2  describe-instances --instance-ids ${AWS_ID} | grep PublicIpAddress | awk {'print $2 '} | sed s/,//g | sed s/\"//g`
```