AWS無料枠対象のt2.microでNatインスタンスを構築する

※ 読者の皆様へ。本エントリーを参考にしてAWSの費用が発生した場合に関しても、著者は何ら責任を負いません。自己責任でお願いいたします。

最近、エンジニアとして駆逐されそうな危機感に駆られて、週末は潰しが効くスキルを身につけるためAWSと仲良くする活動を続けている。そこでお世話になっているのが [AWS クラウド 無料利用枠](http://aws.amazon.com/jp/free/)。

Blue-Greenデプロイメントやデプロイ自動化などの仕組みを作ろうとすると、
Publicネットワークのみではできないことが多いため、Public/Privateネットワークを利用できるVPCを構築したくなる。

しかし、VPCで構築時に自動的に作成されるNatインスタンスは、
無料利用枠の対象外のインスタンスタイプである旧世代のインスタンス(Paravirtualization系)からしか選べないため、Natインスタンスの稼働中は常にお金が発生する問題に悩まされるているだろう。

お金が潤沢にあるプロジェクトではでは 1Nat インスタンス `t1.small 15$/月`, `m1.small 約32$/月` という少額費用なので、たいした問題ではないかもしれないが、本活動はお勉強のための利益を生み出さないプロジェクトかつ個人的なお財布事情を考えるとこの問題は見過ごせかった。

そこで、本記事は、AWS無料利用枠の t2.micro インスタンスで Natインスタンスを作ろうという記事タイトルの話に帰着する。

方法は2つ考えられる。
　1. まっ更なt2.microサーバから設定
　2. VPC構築時に作られる旧世代のインスタンスの仮想化方式をPV方式からHVM方式へ変更する

ここでは、Natインスタンスの勉強がてら、1の方法を選択した。

## ステップ1 VPCを作ろう

VPC画面から、「VPC with Public and Private Subnets」を選択し、
下記のようなスモールネットワークを作りました。

```
IP CIDR block:  192.168.0.0/23
Public Subnet:  192.168.0.0/24
Private Subnet: 192.168.1.0/24
Nat instance:   m1.small ※ 便宜上最低スペックで選択
```

VPC構築と同時にデフォルトのNatインスタンスが起動しお金が発生するので、このインスタンスはすぐに止めます(stop)。
※ ちなみにVPC構築画面では選択できなかった t1.small にスケールダウンも可能になります。

## ステップ2. 踏み台兼Natインスタンスを作ろう

上記 public subnet に属する踏み台兼Natインスタンス(t2.micro)を作ります。

### インスタンス設定

* EC2インスタンスはデフォルトでは、IPアドレス変換が無効になっているため、
マネコンのインスタンス設定「Networking」 -> 「Change Source/Destination Check」 を 「Disable」に設定します。

※ お金はかかりますが、不便になるので、Elastic IP は付与しました。

### SecurityGroup設定

SSHのInboundとは別にアドレス変換対象のPrivateネットワークからの通信を許可します。

```
Type: All Trafic
Protocol:All
Port Range:All
Source: 192.168.1.0/24
```


### Routeテーブル設定

PrivateネットワークのRouteテーブルの上位ネットワークの宛先(0.0.0.0/24)を
デフォルトで作成されたNatインスタンスから今回構築したインスタンスに書き換えます。

>
Before
```Destination: 0.0.0.0/0, Target: デフォルトのEni-ID / Instance-ID```
After
```Destination: 0.0.0.0/0, Target: 構築した踏み台兼NatインスタンスのInstance-ID```


### iptables の設定

踏み台兼NatインスタンスにSSHして、iptablesの設定をします。

```
### ip変換を有効に ###
# vim /etc/sysctl.conf
# diff /etc/sysctl.conf.default /etc/sysctl.conf
7c7
< net.ipv4.ip_forward = 0
---
> net.ipv4.ip_forward = 1


### iptablesの設定 ###
# /sbin/iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE
# /etc/init.d/iptables save
iptables: ファイアウォールのルールを /etc/sysconfig/iptable[  OK  ]中: 


### iptablesの確認 ###
# iptables --list -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
MASQUERADE  all  --  anywhere             anywhere            
MASQUERADE  all  --  ip-192-168-1-0.us-west-2.compute.internal/24  anywhere
```

これで踏み台兼Natインスタンスの設定完了です。
本来なら踏み台とNatインスタンスの機能は分割すべきですが、コスト節約観点で一緒にしています。

## ステップ3. NATインスタンス 動作確認

private network に 適当なEC2インスタンス`test-internal01`を用意します。
踏み台兼Natインスタンス`stepstone`として下記テストを行いました。

* 準備:
  * `stepstone`経由で`test-internal01`にSSHできることを確認
  * `stepstone`と`test-internal01`間でお互いにpingが通ることを確認
* Natインスタンス確認
  * `test-internal01`から `$ ping 8.8.8.8` でGoogleのDNSサーバに疎通できることを確認
  * `test-internal01`から `$ nslookup www.google.com` でDNSが引けることを確認

## ステップ4. VPC構築時に自動作成されたNatインスタンス/ElasticIPをリリース

動作確認がとれたら、自動作成されたNatインスタンスと割り当てられているElasticIPをリリースして固定費を減らしましょう。

これで作業の発生ベースで`stepstone`を起動するようにして月間750時間以内に抑えれば、EC2料金の追加料金は発生しないはず。何か間違っていたらコメントいただけたら嬉しいです。

## 参考

* [Amazon VPCのNATインスタンスを作ってみる(iptables編)](http://blog.cloudpack.jp/2012/03/02/aws-news-amazon-vpc-nat-instance_02/)
* [t2.microでNATインスタンスを作る](http://understeer.hatenablog.com/entry/2014/07/11/164757)
* [PV->HVM変換ツール pv2hvm.rbを試してみた](http://dev.classmethod.jp/etc/pv2hvm-rb/)