AWSでNATインスタンス構築

AWSでNATインスタンスを構築してPython３をインストール。
AWSで開発環境、兼、Webサーバーを構築中のメモ。
参考になる資料が既に多く存在しているので、自分用の備忘録として書いています。

#### [参考資料]
[NAT インスタンス - Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_NAT_Instance.html)
[NAT インスタンスと NAT ゲートウェイの比較 - Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-nat-comparison.html)
[AWS NAT構成の作り方(NATインスタンス編) - Qiita](https://qiita.com/TK1989/items/ece84500ee87d2d96c4b)
[AWSで最低限セキュアな構成を組む - Qiita](https://qiita.com/ausuited/items/09b626fa5264f0c650fd)
[NATインスタンスとNATゲートウェイの違い - Qiita](https://qiita.com/choro_m4/items/129db9966698ca4c9c91)

# 今回やったこと
- AWSに開発用インスタンスを構築しPython3をインストール
- 開発用インスタンスを外部に直接公開しないためにNATインスタンスを構築
- 開発用インスタンスには踏み台サーバー経由でログインする
- 費用は出来るだけ抑える

### ネットワーク構成
<img width="619" alt="ネットワーク構成図.png" src="https://qiita-image-store.s3.amazonaws.com/0/345798/ae44d13d-4637-a80a-6338-1be67f7b406a.png">


[AWS シンプルアイコン](https://aws.amazon.com/jp/architecture/icons/)を使って書きました。
旧式と比べて随分シンプルになりました。

### NAT構成の種類
2種類ありますが、費用を抑えるために今回は**1.**を採用しました。

**1. NATインスタンス**
2. NATゲートウェイ

**1.はEC2を構築するやり方、自前運用でカスタマイズ性が高い。**
2.はAWSで用意しているゲートウェイを使うやり方で、運用が楽。

料金 (アジアパシフィック (東京)、2019/01/20時点)は、
**1. 0.0068USD/時間 (t3.nanoで構築する場合)**
2. 0.062USD/時間

# 構築手順
AWSマネージメントコンソール (ブラウザ)から行いました。
リージョンは、アジアパシフィック (東京)です。

## ネットワークの設定
インスタンスを作成する前に、ネットワークの設定を整えました。
設定値は末尾に記載します。

1. VPCの作成
2. サブネットの作成
3. インターネットゲートウェイの作成
4. ルートテーブルの作成 (サブネットに割り付ける)
5. ネットワークACLの作成 (サブネットに割り付ける)
6. セキュリティグループの作成 (後でインスタンスに割り付ける)

## インスタンスの作成

| インスタンス | AMI | インスタンスタイプ | ストレージ    |
|:-----------|:----|:----------------------------|:------------|
| 踏み台サーバー | Amazon Linux 2 AMI | t3.nano | 汎用SSD,8GB |
| NATインスタンス | amzn-ami-vpc-nat-hvm-2018.03.0.20181116-x86_64-ebs | t3.nano                      | マグネティック,8GB |
| 開発用インスタンス | Amazon Linux 2 AMI | t3.medium                    | 汎用SSD,32GB |

**\*1** 踏み台サーバーとNATインスタンスの自動割り当てパブリック IPは"有効化"
**\*2** Capacity Reservationは"なし"
**\*3** T2/T3 Unlimitedは"無効化"

## インスタンス作成後の設定変更
- NATインスタンスの送信元/送信先のチェックを無効にする
- Private Subnet1のルートテーブルを変更し、デフォルトゲートウェイにNATインスタンスを追加

## 疎通チェック

自宅PCから踏み台サーバーにログインして、VPC内インスタンスにping

```
ssh -i ./~~~.pem ec2-user@${IPアドレス}
ping {IPアドレス}
```

開発用インスタンスにログインし、インターネットに接続できるか確認

```
ssh -i ./~~~.pem ec2-user@${IPアドレス}
curl {WebサイトのURL} 
```

## Python3のインストール
Amazon Linux 2にインストールされているPythonのバージョンを確認

```
$ python --version
Python 2.7.14
```


Python3をインストール

```
$ sudo yum install python3
(中略)
$ python3 --version
Python 3.7.1 
```

手順は以上。

## [メモ]

### メモ1 ： ネットワークACLとセキュリティグループ
詳しくはネットを調べると色々と情報が出てきますが、
ネットワークACLは、サブネット単位で動作するファイアウォール。
セキュリティグループは、インスタンス単位で動作するファイアウォール。

今回の構成であれば、ネットワークACLは無しで、セキュリティグループのみでも良かったです。
ですが、今回は練習も兼ねて、ネットワークACLも設定しました。

**[参考資料]**
[セキュリティ - Amazon Virtual Private Cloud](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Security.html#VPC_Security_Comparison)
[AWSのネットワークACLとセキュリティグループの違い - プログラマでありたい](https://blog.takuros.net/entry/20131218/1387356888)

### メモ2：yumのリポジトリ確認

```
$ yum repolist all
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
リポジトリー ID                      リポジトリー名                 状態
amzn2-core/2/x86_64                  Amazon Linux 2 core repository 有効: 16,077
amzn2-core-debuginfo/2/x86_64        Amazon Linux 2 core repository 無効
amzn2-core-source/2                  Amazon Linux 2 core repository 無効
amzn2extra-docker/2/x86_64           Amazon Extras repo for docker  有効:      9
amzn2extra-docker-debuginfo/2/x86_64 Amazon Extras debuginfo repo f 無効
amzn2extra-docker-source/2           Amazon Extras source repo for  無効
repolist: 16,086
```

### メモ3：Amazon Linux2のリポジトリに登録されているPython3を確認

```
$ yum list | grep python3
python3.x86_64                         3.7.1-9.amzn2.0.1              amzn2-core
python3-Cython.x86_64                  0.27.3-2.amzn2.0.2             amzn2-core
python3-debug.x86_64                   3.7.1-9.amzn2.0.1              amzn2-core
python3-devel.x86_64                   3.7.1-9.amzn2.0.1              amzn2-core
python3-libs.i686                      3.7.1-9.amzn2.0.1              amzn2-core
python3-libs.x86_64                    3.7.1-9.amzn2.0.1              amzn2-core
python3-pip.noarch                     9.0.3-1.amzn2.0.1              amzn2-core
python3-rpm-macros.noarch              3-23.amzn2                     amzn2-core
python3-setuptools.noarch              38.4.0-3.amzn2.0.6             amzn2-core
python3-test.x86_64                    3.7.1-9.amzn2.0.1              amzn2-core
python3-tkinter.x86_64                 3.7.1-9.amzn2.0.1              amzn2-core
python3-tools.x86_64                   3.7.1-9.amzn2.0.1              amzn2-core
python3-wheel.noarch                   0.30.0a0-9.amzn2.0.3           amzn2-core
```


### メモ4：設定値

#### [1. VPC]
| 名称          | IPv4 CIDR |
|:-------------|:------------|
| Practice VPC | 10.0.0.0/16 |

#### [2. サブネット]
| 名称         | IPv4 CIDR  |
|:----------------|:------------|
| Entrance Subnet | 10.0.0.0/24 |
| Public Subnet   | 10.0.1.0/24 |
| Private Subnet1 | 10.0.2.0/24 |

#### [4. ルートテーブル]
| 名称                     | Destination  | Target                 |
|:------------------------|:-------------|:-----------------------|
| Entrance Route Table    | 10.0.0.0/16  | local                  |
|                         | 0.0.0.0/0    | (インターネットゲートウェイ)  |
| Public Route Table      | 10.0.0.0/16  | local                  |
|                         | 0.0.0.0/0    | (インターネットゲートウェイ)  |
| Private Route Table 1   | 10.0.0.0/16  | local                  |
|                         | 0.0.0.0/0    | (NATインスタンス)        |

#### [5. ネットワークACL]
###### [Entrance Network ACL - Inbound]

| Rule # | Type                | Protocol | Port Range   | Source    | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:----------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 0.0.0.0/0 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 0.0.0.0/0 | ALLOW |
| 120    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
| *      | すべての トラフィック   | すべて    | すべて        | 0.0.0.0/0 | DENY |

###### [Entrance Network ACL - Outbound]

| Rule # | Type                | Protocol | Port Range   | Source    | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:----------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 10.0.0.0/16 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 0.0.0.0/0 | ALLOW |
| 200    | HTTP (80)           | TCP (6)  | 80           | 0.0.0.0/0 | ALLOW |
| 210    | HTTPS (443)         | TCP (6)  | 443          | 0.0.0.0/0 | ALLOW |
| 220    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0 | ALLOW |
| *      | すべての トラフィック   | すべて    | すべて        | 0.0.0.0/0 | DENY |

###### [Public Network ACL - Inbound]

| Rule # | Type                | Protocol | Port Range   | Source      | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:------------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 10.0.0.0/24 | ALLOW |
| 101    | SSH (22)            | TCP (6)  | 22           | 10.0.1.0/24 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 10.0.0.0/16 | ALLOW |
| 200    | HTTP (80)           | TCP (6)  | 80           | 0.0.0.0/0   | ALLOW |
| 210    | HTTPS (443)         | TCP (6)  | 443          | 0.0.0.0/0   | ALLOW |
| 300    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0   | ALLOW |
| *      | すべての トラフィック   | すべて    | すべて        | 0.0.0.0/0   | DENY |

###### [Public Network ACL - Outbound]

| Rule # | Type                | Protocol | Port Range   | Source      | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:------------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 10.0.0.0/24 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 10.0.0.0/16 | ALLOW |
| 200    | HTTP (80)           | TCP (6)  | 80           | 0.0.0.0/0   | ALLOW |
| 210    | HTTPS (443)         | TCP (6)  | 443          | 0.0.0.0/0   | ALLOW |
| 300    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0   | ALLOW |
| *      | すべての トラフィック    | すべて   | すべて        | 0.0.0.0/0   | DENY |

###### [Private Network ACL 1 - Inbound]

| Rule # | Type                | Protocol | Port Range   | Source      | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:------------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 10.0.0.0/24 | ALLOW |
| 110    | SSH (22)            | TCP (6)  | 22           | 10.0.2.0/24 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 10.0.0.0/16 | ALLOW |
| 200    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0   | ALLOW |
| *      | すべての トラフィック    | すべて   | すべて        | 0.0.0.0/0   | DENY |

###### [Private Network ACL 1 - Outbound]

| Rule # | Type                | Protocol | Port Range   | Source      | Allow / Deny |
|:-------|:--------------------|:---------|:-------------|:------------|:-------------|
| 100    | SSH (22)            | TCP (6)  | 22           | 10.0.2.0/24 | ALLOW |
| 110    | すべての ICMP - IPv4 | ICMP (1) | すべて        | 10.0.0.0/16 | ALLOW |
| 200    | HTTP (80)           | TCP (6)  | 80           | 0.0.0.0/0   | ALLOW |
| 210    | HTTPS (443)         | TCP (6)  | 443          | 0.0.0.0/0   | ALLOW |
| 300    | カスタム TCP ルール   | TCP (6)  | 1024 - 65535 | 0.0.0.0/0   | ALLOW |
| *      | すべての トラフィック    | すべて   | すべて        | 0.0.0.0/0   | DENY |

#### [6. セキュリティグループ]

###### [Entrance Security Group - Inbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| SSH                 | TCP     | 22       | 0.0.0.0/0 |
| すべての ICMP - IPv4 | すべて   | 該当なし  | 0.0.0.0/0 |

###### [Entrance Security Group - Outbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| HTTP                | TCP     | 80       | 0.0.0.0/0 |
| SSH                 | TCP     | 22       | 10.0.0.0/16 |
| HTTPS               | TCP     | 443      | 0.0.0.0/0 |
| すべての ICMP - IPv4 | すべて   | 該当なし  | 0.0.0.0/0 |

###### [NAT Security Group - Inbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| HTTP                | TCP     | 80       | 10.0.2.0/24 |
| SSH                 | TCP     | 22       | 10.0.0.0/24 |
| HTTPS               | TCP     | 443      | 10.0.2.0/24 |
| カスタム ICMP ルール  | エコー要求| 該当なし  | 10.0.0.0/24 |

###### [NAT Security Group - Outbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| HTTP                | TCP     | 80       | 0.0.0.0/0 |
| HTTPS               | TCP     | 443      | 0.0.0.0/0 |
| カスタム ICMP ルール  | エコー応答| 該当なし  | 10.0.0.0/24 |

###### [Private Security Group 1 - Inbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| SSH                 | TCP     | 22       | 10.0.0.0/24 |
| SSH                 | TCP     | 22       | 10.0.2.0/24 |
| カスタム ICMP ルール  | エコー要求| 該当なし  | 10.0.0.0/24 |
| すべての ICMP - IPv4 | すべて   | 該当なし  | 10.0.2.0/24 |

###### [Private Security Group 1 - Outbound]

| タイプ               | プロトコル | ポート範囲 | ソース     |
|:--------------------|:--------|:---------|:----------|
| HTTP                | TCP     | 80       | 0.0.0.0/0 |
| SSH                 | TCP     | 22       | 10.0.2.0/24 |
| HTTPS               | TCP     | 443      | 0.0.0.0/0 |
| カスタム ICMP ルール  | エコー応答| 該当なし  | 10.0.0.0/24 |
| すべての ICMP - IPv4 | すべて   | 該当なし  | 10.0.2.0/24 |