VagrantでAmazon Web ServicesのVPCにAmazon Linuxのインスタンスを作成


## 1. ローカルでの準備

1. Vagrantのインストール。
2. vagrant-aws のインストール。

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

3. dummy ボックスの作成。

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

## 2. AWSでの準備

### 1. アクセスキー、シークレットIDの取得
 1. AWSのコンソールにログイン。
 1. 自分のアカウント名をクリックして表示されるドロップダウンメニューから「Security Credentials」を選択。
 1. Access Keys (Access Key ID and Secret Access Key) を開いて「Create New Access Key」をクリック。
 1. ポップアップに表示された「Download Key File」をクリックしてアクセスIDとシークレットキーのペアが記載されたファイルをダウンロード。```rootkey.csv```という名前で落ちてくる。
 1. ```rootkey.csv``` には以下のように記載されているので、これを今回はそれぞれ```MYAPP_AWS_ACCESS_KEY_ID```、```MYAPP_AWS_SECRET_KEY```という名前で環境変数として設定した。

     ```:rootkey.csv
AWSAccessKeyId=yourawsaccesskeyid
AWSSecretKey=yourawssecretkey
     ```
     ```diff:$HOME/.bash_profile
+ export MYAPP_AWS_ACCESS_KEY_ID=yourawsaccesskeyid
+ export MYAPP_AWS_SECRET_KEY=yourawssecretkey
     ```


### 2. Key Pairs の作成
 1. EC2 > Key Pairs に移動。
 1. 「Create Key Pair」をクリック。
 1. 適当な名前をつける。ここでは```naoyes-myapp```としておく。
 1. 「Yes」をクリックすると鍵ペアが作成されてダウンロードされる。```naoyes-myapp.pem```というファイル名。
 1. これをローカルの任意の場所に置く。ここでは```/Users/naoyes/.ssh/naoyes-myapp.pem```としておく。


### 3. VPC Security Groups の作成
 1. VPC > Security Groups に移動。
 1. 「Create Security Group」をクリック。とりあえず外向けにはWEBとSSHを許容したいので以下の2つのセキュリティグループを作成した。各々```sg-XXXXXXXX```、```sg-YYYYYYYY```といった感じでIDが振られる。
    * ```sg-XXXXXXXX``` : Inbound 80 0.0.0.0/0, Outbound ALL
    * ```sg-YYYYYYYY``` : Inbound 22 0.0.0.0/0, Outbound ALL

### 4. VPC Subnet ID の確認
 1. VPC > Subnets に移動。
 1. 2つあるサブネットのうちの適当な片方のサブネット```subnet-ZZZZZZZZ```を採用。

   _以下、その理由を。
     デフォルトVPCだとサブネットが2つ存在している。そのどちらも「明示的には」ルートテーブルに紐付けられていない。これはRoute Tablesに存在してる唯一のルートテーブルの```Associated With```が```0 Subnets```となっていることから分かる。つまり2つのサブネットは一見宙ぶらりんな状態。
     翻って、この唯一のルートテーブルは```Main```が```Yes```となっている。つまりこのルートテーブルはいわゆるメインルートテーブルということになる。「宙ぶらりんな状態のサブネットはみんなこのルートテーブルが適用されますよ」というのがメインルートテーブルの役割。よって実は2つのサブネットはともに暗黙的にはメインルートテーブルを使用することとなっている。
     もう一度メインルートテーブルの中身を見てみる。```0.0.0.0/0```のターゲットがInternet Gatewayに向いていることからこれはインターネットとやりとりできそうだということがわかる。
     今回はWEBサーバを設置したいのでこの2つのサブネットのどちらにインスタンスを置いても問題なさそう。というかもう一つインターナルなルートテーブルを作成してそこに片方のサブネットを紐付けてDBサーバインスタンスを置くのが常套か。
     今回はとりあえずはそこまではしない。
     よって2つあるうちの片方のサブネット```subnet-ZZZZZZZZ```を仮に採用_


### 5. その他、設定値の決定

* リージョン

  ```
ap-northeast-1
  ```

* インスタンスタイプ

  ```
t1.micro
  ```

* AMI
Amazon Linux の'PV EBS-Backed 64 ビット'とした。

  ```
ami-3561fe34
  ```
  以下を参考に。EBSルートデバイスとした。インスタンスタイプがmicroだし。
  * http://d.hatena.ne.jp/torazuka/20110504/rootdevice
  * http://aws.amazon.com/jp/amazon-linux-ami/

## 3. インスタンスの作成


#### 1. 適当なディレクトリを掘ってvagrantを初期化

```
cd /path/to/myapp
vagrant init
```

#### 2. ```Vagrantfile```の作成

```ruby:/path/to/myapp/Vagrantfile
VAGRANTFILE_API_VERSION = "2"

Vagrant.configure(VAGRANTFILE_API_VERSION) do |config|
  config.vm.define "dev.myapp" do |machine|
    machine.vm.box = "opscode-centos-6.5"
    machine.vm.network :private_network, ip: "192.168.40.10"
  end

  config.vm.define "prod.myapp" do |machine|
    machine.vm.box = "dummy"
    machine.vm.provider :aws do |aws, override|
      aws.access_key_id = ENV['MYAPP_AWS_ACCESS_KEY_ID']
      aws.secret_access_key = ENV['MYAPP_AWS_SECRET_KEY']
      aws.region = 'ap-northeast-1'
      aws.instance_type = 't1.micro'
      aws.ami = 'ami-3561fe34'
      aws.security_groups = [
        'sg-XXXXXXXX', # WEB
        'sg-YYYYYYYY', # SSH
      ]
      aws.keypair_name = 'naoyes-myapp'
      aws.tags = {
        'Name' => 'MYAPP',
        'Env' => 'PROD',
      }
      aws.subnet_id = 'subnet-ZZZZZZZZ'

      override.ssh.username = "ec2-user"
      override.ssh.private_key_path = '/Users/naoyes/.ssh/naoyes-myapp.pem'
      override.ssh.pty = true
    end
  end
end
```

 * ローカル上の開発環境を```dev.myapp```、AWS上の本番環境を```prod.myapp```として同一ファイルに記載してある。
 * Amazon Linuxの場合、```override.ssh.pty = true``` の記述が無いと```vagrant up```の際に以下のエラーになった。そのあたりの議論はこちらに。
https://github.com/mitchellh/vagrant/issues/1482

  ```
stderr from the command:
sudo: sorry, you must have a tty to run sudo
  ```

#### 3. インスタンスの作成

```
vagrant up prod.myapp --provider=aws
```


----

これでAWS上のインスタンスのにsshで接続できる。またWEBサーバをインストールしてHTTPアクセスしたらトップページが表示されることを確認した。