Vagrant VirtualBoxとAWS EC2での環境構築例

# 概要

- Vagrantのセットアップ
- VirtualBoxにCentOS7の環境を構築する
- AWSのEC2インスタンスの環境を構築する

Vagrantについては、[公式サイトのチュートリアル](https://docs.vagrantup.com/v2/)を読むと、より正しい知識が手に入ります。

# 環境

記事作成時のソフトウェアバージョンは以下の通り.

- Vagrant 1.7.2
- Vagrant-aws 0.6.0
- VirtualBox 4.3.26
- ruby 2.2.2

# Vagrantってなに？

VirtualBoxやAWSなどに対して「仮想環境の構築、起動、削除」などの共通インターフェースを提供する。（と私は理解しました）

Vagrant単体では面白いことはなくchefなどと組み合わせると効果を発揮します。

# Vagrantのインストール

[Vagrantの公式サイト](https://www.vagrantup.com)からインストーラをダウンロードして、インストールします。
インストールすると、ターミナルからvagrantコマンドが利用できるようになります。

※ VirtualBoxがインストールされていない場合は、予めインストールしておきます。

# Vagrantのログ出力について

Vagrant中にエラーなどで困ったらまずはログを出力をしてググりましょう。

```bash
#ログ出力.
VAGRANT_LOG=info vagrant オプション
```

# Vagrantを使って、VirtualBoxにCentOS7環境を構築する

流れとしては以下の通りです。

1. CentOS7のboxの登録
2. Vagrantのprojectを作成する
3. Vagrantfileの編集
4. 仮想環境の操作

## 1. Boxの登録

### Box

Boxとは、OSとセットアップ状態を１つにまとめたイメージです。自作することも可能ですが、今回はWeb上からダウンロードします。

Boxのダウンロードできる場所
- https://atlas.hashicorp.com/boxes/search
- http://www.vagrantbox.es

### CentOS7のBoxの登録

```bash
# vagrant box add {title:任意} {boxのurl}

# CentOS7のBoxを登録する(http://www.vagrantbox.esのCentOS7.0 x86_64 minimal (VirtualBoxGuestAddtions 4.3.14)を利用します。
vagrant box add centos7 https://f0fff3908f081cb6461b407be80daf97f07ac418.googledrive.com/host/0BwtuV7VyVTSkUG1PM3pCeDJ4dVE/centos7.box
```

## 2. Vagrantのprojectを作成する

```bash

# projectを生成するディレクトリに移動する
cd ~/
mkdir myproj_vb
cd myproj_vb

# projectを生成する.
# vagrant init {title: vagrant box addで指定したタイトル}
vagrant init centos7 # Vagrantfileが生成される 
```

## 3. Vagrantfileの編集

最低限の編集として、vagrantを起動したホストPCと仮想環境とのプライベートネットワークの設定」を行います。これにより、ホストPCと仮想環境でTCP/IP通信が行えるようになります。

※ 参考 [Vagrantのネットワーク通信について](http://qiita.com/ftakao2007/items/0ec05c2ef3c14cdbea11)

```ruby
# 既に例が定義されているので、コメントアウトを外すだけです。
config.vm.network "private_network", ip: "192.168.33.10"
```

## 4 Vagrantを介したVirtualBoxの操作

いずれもVagrantfileのあるディレクトリで行います。

```bash
# 仮想環境を起動、再開する
vagrant up
# 仮想環境を停止する
vagrant halt
# 仮想環境を破棄する
vagrant destroy
```

### 仮想環境へのSSHアクセス

```bash
vagrant ssh
```

どのディレクトリにいてもsshできるようにするには、以下を実行して.ssh/configの設定を行います。

※　参考[.ssh/configについて](http://dogmap.jp/2011/10/27/ssh_config/)

```bash
vagrant ssh-config --host 任意のホスト名 >> ~/.ssh/config

ssh 設定したホスト名 # これでsshでログインできます。
```

# Vagrantを使って、EC2環境を構築する

※ 既にEC2インスタンスのAMIイメージがあることを前提とします。

流れとしては以下の通りです。

1. vagrant-awsプラグインのインストール
2. dummy boxの登録
3. Vagrantのprojectを作成する
4. AWSから必要な情報を取得する
4. Vagrantfileの編集
5. .envファイルに環境変数を追加
5. 仮想環境の操作

## 1 vagrant-awsプラグインのインストール

Vagrant標準はAWSに対応していないため、[vagrant-awsプラグイン](https://github.com/mitchellh/vagrant-aws)をインストールします。

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

## 2 dummy boxの登録

AWS用のDummy Boxを登録します。

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

## 3 Vagrantのprojectを作成する

```bash

# projectを生成するディレクトリに移動する
cd ~/
mkdir myproj_aws
cd myproj_aws

# projectを生成する.
vagrant init dummy
```

## 4 AWSから必要な情報の取得

### アクセスキーの取得

以下に従い、アクセスキーＩＤとシークレットアクセスキーを取得します。

![スクリーンショット 2015-04-29 7.24.06.png](https://qiita-image-store.s3.amazonaws.com/0/37443/92564ae8-4128-6e48-4818-87c4fc8e88ce.png)

----

![スクリーンショット 2015-04-29 10.13.17.png](https://qiita-image-store.s3.amazonaws.com/0/37443/ead93edd-836f-b1a7-120c-2edda1ff8e06.png)

----

![スクリーンショット 2015-04-29 10.13.26.png](https://qiita-image-store.s3.amazonaws.com/0/37443/ace4dbcb-ecd4-2ed0-4ae4-b773ba38b364.png)

----

![スクリーンショット 2015-04-29 10.13.51.png](https://qiita-image-store.s3.amazonaws.com/0/37443/5ac483a1-dc4a-4602-0615-4701b6a47d2c.png)

----

![スクリーンショット 2015-04-29 10.14.53.png](https://qiita-image-store.s3.amazonaws.com/0/37443/b5bb32bc-e01e-7314-fcde-35b60e0bfd8b.png)

----

以下のアクセスキーIDとシークレットアクセスキーを控えます。
![スクリーンショット 2015-04-29 10.14.08.png](https://qiita-image-store.s3.amazonaws.com/0/37443/bc465dc8-e167-dc8a-0d33-6f68e8ae7e48.png)

----

![スクリーンショット 2015-04-29 10.15.13.png](https://qiita-image-store.s3.amazonaws.com/0/37443/ff188d3b-6758-fa32-4f67-86874e9cf91d.png)

---

※より適切なポリシーがあるかもしれませんが、ここではEC2へのフルアクセス権を設定します。

![スクリーンショット 2015-04-29 10.17.23.png](https://qiita-image-store.s3.amazonaws.com/0/37443/a208bd67-575c-0fae-3e85-07bc2d78be6e.png)

以上です。

- キーペアの生成と取得

以下に従い、キーペアを作成します。

![スクリーンショット 2015-04-29 10.32.50.png](https://qiita-image-store.s3.amazonaws.com/0/37443/fa84178b-19ba-08a2-f183-a58c446f4d95.png)


----

![スクリーンショット 2015-04-29 10.35.09.png](https://qiita-image-store.s3.amazonaws.com/0/37443/d8cfb25a-3528-b854-7fbb-0156aea37503.png)

----

![スクリーンショット 2015-04-29 10.30.25.png](https://qiita-image-store.s3.amazonaws.com/0/37443/981a9f8f-41a8-a461-7f60-38ed4f5128e4.png)

- ダウンロードされたpemファイルのパーミションを変更します。※変更しないとSSHでEC2にアクセスできません。

```bash
chmod 600 ダウンロードしたpemファイル
```

## 5 Vagrantfileの編集

※ 環境変数だったり直値だったりするのは説明を端折るためです。全ての環境変数にした方が一括管理出来て良いと思います。

```rb
config.vm.provider :aws do |aws, override|
  # IAMで取得したアクセスキーID
  aws.access_key_id = ENV['AWS_ACCESS_KEY_ID']
  # IAMで取得したシークレットアクセスキー
  aws.secret_access_key = ENV['AWS_SECRET_ACCESS_KEY']
  # 作成したキーペアの名称
  aws.keypair_name = ENV['AWS_KEYPAIR_NAME']

  aws.ami = # EC2で利用する仮想環境のイメージ
 
  override.ssh.username = "ec2-user"
  override.ssh.private_key_path = "ダウンロードしたpemファイルのパス"
  aws.security_groups = ["セキュリティグループ名かID"] 
# 以下はVagrant_chefのREADMEより抜粋
# An array of security groups for the instance. If this instance will be launched in VPC, this must be a list of security group Name. For a nondefault VPC, you must use security group IDs instead (http://docs.aws.amazon.com/cli/latest/reference/ec2/run-instances.html).

# 以下はSSH上でsudoを実行できるようにするために必要。
# config.ssh.pty=true
  aws.user_data =<<USER_DATA
#!/bin/sh
sed -i -e 's/^\\(Defaults.*requiretty\\)/#\\1/' /etc/sudoers
USER_DATA

end   
```

```bash
# .bash_profileを読み直して、設定を反映します。
source .bash_profile
```

### 補足 SSH上でsudoするために

aws.user_dataの設定をしなければ、vagrant upの起動に失敗します。
sudoを実行できるようにするためには、２つ方法があるようです。

- Vagrantfileにconf.ssh.pty=trueにする.#[Vagrant公式サイト](http://docs.vagrantup.com/v2/vagrantfile/ssh_settings.html)では、falseが推奨されています。
- 起動時にrequirettyの設定を無効にする。(aws.user_dataの設定)

## 6 環境変数の設定

.bash_profileや.env等に環境変数を定義します。

```bash
# .bash_profile
export AWS_ACCESS_KEY_ID="IAMで取得したアクセスキーID"
export AWS_SECRET_ACCESS_KEY="IAMで取得したシークレットアクセスキー"
export AWS_KEYPAIR_NAME="キーペア名"
```

```bash
# ファイルを読み直して、変更を反映します。
source .bash_profile
```

## 7. 仮想環境の操作

```bash
# 仮想環境を起動、再開する
vagrant up --provider=aws
# 仮想環境を停止する
vagrant halt
# 仮想環境を破棄する
vagrant destroy
```

以上です。