[AWS]ネットワークの構築方法

**2020年1月13日現在の内容です。**

構築するネットワーク
<img width="813" alt="スクリーンショット 2020-01-14 20.05.40.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/fd7edec6-8bb7-380c-8f9c-07c7865b1188.png">

## 用語説明
### リージョン
AWSの各サービスが提供されている地域のこと
例：東京,オハイオ,ロンドン

- AWSのサービスを利用する際にまずリージョンを決める必要がある
- リージョンごとに使えるサービスが異なる
- 基本的に新しいサービスはアメリカのリージョンから利用可能になり、その後他のリージョンに展開される
- 日本でAWSを利用する際は東京リージョンを選択したほうが良い（応答時間が早いから）

### アベイラビリティゾーン
世界各地にあるデータセンターをまとめたもの

- それぞれのリージョンにアベイラビリティゾーンは２つ以上存在する（あるアベイラビリティゾーンが災害で使用不可になっても、他のアベイラビリティゾーンを利用することでサービスを常に稼働させることができる）

### VPC（Virtual Private Cloud）
AWS上に仮想ネットワークを作成できるサービス

- リージョンを選択してVPCを作成する（リージョンをまたいでVPCは作成できない）

### サブネット
VPCを細かく区切ったネットワーク

- アベイラビリティゾーンの中にサブネットを作成する
- VPCのIPアドレスの中にサブネットのIPアドレスが含まれる
- パブリックサブネットはインターネットから接続できる
- プライベートサブネットはインターネットから接続できない

## IPアドレスとは
### IPアドレス
ネットワーク上の機器を識別するためのインターネットの住所

- ネットワーク上で重複しない番号
- 32ビットの整数値で構成される
- 一般的に32ビットのIPアドレスを８ビットずつ４組に分けピリオドを入れて１０進数で表現する  
（0.0.0.0　〜　255.255.255.255） 

### パブリックIPアドレス
- インターネットに接続する際に使用するIPアドレス
- 重複すると正しく通信できなくなるので、ICANN(Internet Corporation for Assigned Names and Numbers)が管理している
- プロパイダやサーバー事業者から貸し出される（AWS上でも貸し出される）

### プライベートIPアドレス
- インターネットで使用されないIPアドレス
- 以下範囲内のアドレスを自由に使用できる
    - 10.0.0.0　〜　10.255.255.255
    - 172.16.0.0　〜　172.31.255.255
    - 192.168.0.0　〜　192.168.255.255
- 社内LANの構築やネットワークの実験時はプライベートIPアドレスを使用する

### IPアドレスの範囲
ネットワークを構築する際は、そのネットワークで使用するIPアドレスの範囲を決める必要がある。
IPアドレスはネットワーク部とホスト部に区分けして範囲を表記する
例：192.168.128.0　〜　192.168.128.255を使用する場合、共通部分（192.168.128）がネットワーク部、異なる部分（0〜255）がホスト部

### 範囲の表記
1. CIDR表記
IPアドレスの後ろに「/」を書き、その後ろにネットワーク部が先頭から何ビット目までなのかを記載する
例：ネットワーク部が24ビット　→　192.168.128.0/24

2. サブネットマスク表記
IPアドレスの後ろに「/」を書き、ネットワーク部を表すビットと同じ部分を1に、ホスト部を表すビットと同じ部分を0にする
例：ネットワーク部が24ビット　→　192.168.128.0/255.255.255.0

## VPCの作成
リージョンを「東京」に設定し、サービス　→　VPCを検索
<img width="1677" alt="スクリーンショット 2020-01-12 17.30.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/1be8d07b-caa8-d5f1-ff6b-fc2eff42d298.png">

VPCを選択
<img width="1680" alt="スクリーンショット 2020-01-12 21.14.33.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5379d379-b897-f7c5-72cb-4cc3a6a226f3.png">

デフォルトでVPCが作成されているがこれは使用しない
「VPCの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-12 21.17.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/1141ae10-9f61-8fad-f8ca-3a035c44887d.png">

以下の画像を参考に設定し、「作成」をクリック

- 名前タグ：VPCを識別する名前
- IPv4 CIDR ブロック：作成するVPCにおけるIPアドレスの範囲
- テナンシー：物理ハードウェアを専用にする（設定するとEC2の料金が割増になる）

<img width="1680" alt="スクリーンショット 2020-01-12 21.24.59.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/409617a3-1866-0bf7-ad01-19a2e73c0e7f.png">

VPCが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-12 21.26.56.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2ff1d4ab-52ee-17a4-402b-a877e757d682.png">

## サブネットの作成
### パブリックサブネットの作成
サブネットを選択
<img width="1680" alt="スクリーンショット 2020-01-12 21.31.29.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/2ad85038-5647-448b-fdf3-ee667602082e.png">

デフォルトでサブネットが作成されているがこれは使用しない
「サブネットの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-12 21.33.07.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/e4f0d782-b714-5445-5bcf-ecf4388bee69.png">

以下の画像を参考に設定し、「作成」をクリック

- 名前タグ：サブネットを識別する名前
- VPC：サブネットを作成するVPC
- アベイラビリティゾーン：サブネットを作成するアベイラビリティゾーン
- IPv4 CIDR ブロック：作成するサブネットにおけるIPアドレスの範囲

<img width="1680" alt="スクリーンショット 2020-01-12 21.54.31.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/c41abf94-58ce-ae85-6c10-417a8c97d60c.png">


パブリックサブネットが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-12 21.56.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/09cd7533-374b-31b3-af25-7677d4557a3b.png">


### プライベートサブネットの作成
「サブネットの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-12 21.57.48.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/03723d70-c0a3-6f27-b4e9-757d4ff7af97.png">

以下の画像を参考に設定し、「作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-12 21.59.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/300e4cdf-abf8-226e-53b0-c41ba6aae5a3.png">

プライベートサブネットが作成されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-12 22.01.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/65a75b99-dde4-8159-88e5-d27f074e0ab6.png">

## ルーティングの設定
パブリックサブネットからインターネットに接続できるようにしたい
↓
**ルーティングを設定する**

ルーティング：IPアドレスからIPアドレスに紐づくルーター（AWSではターゲットと呼ぶ）へつなぐこと

ルートテーブル：IPアドレスとそのルーター情報を一覧化したもの（経路制御表）

デフォルトルート（0.0.0.0/0）：ルートテーブルに登録されているアドレスに一致しないときの経路

| IPアドレス | ルーター（ターゲット） |  
|:-----------------:|:------------------:|
| 10.0.1.0/24 | local(自身のネットワーク) |
| 10.0.2.0/24 | ルーターB |
| 0.0.0.0/0 | ルーターC |   

インターネットゲートウェイ：インターネットとVPCをつなぐ仮想ルーター    

インターネットゲートウェイを新規作成してVPCに設置する　→　local以外をインターネットゲートウェイにつなげるようにする
＊ルートテーブルはVPCと各サブネットに設定できる
＊AWSはサブネットとルートテーブルを定義すると暗黙的にルーターが動作する

### インターネットゲートウェイを作成し、VPCにアタッチする
「インターネットゲートウェイ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.02.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/998fbaf5-f658-7a25-e330-15745ee8e60e.png">

「インターネットゲートウェイの作成」をクリック
<img width="1678" alt="スクリーンショット 2020-01-13 14.03.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a32c675b-3280-1825-76ab-81940ef80c77.png">

任意の名前を設定し、「作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.07.39.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/85cd9a71-1adb-59ce-7f79-3a7b573d6dc3.png">

作成されたことを確認
<img width="1680" alt="スクリーンショット 2020-01-13 14.09.57.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/452ffa8d-4ef2-d576-85db-f67ecc2da5b5.png">

作成したインターネットゲートウェイを選択し、「アクション」　→　「VPCにアタッチ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.11.20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/a348e2a7-7589-f33c-1af4-f2b0ac39d21d.png">

作成したVPCを選択し、「アタッチ」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.16.14.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/d5455756-e19c-f7fe-9339-206c2046c7d3.png">

VPCがアタッチされていることを確認
<img width="1680" alt="スクリーンショット 2020-01-13 14.19.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/7c58b65f-c1c3-35f7-3d71-3038390b7662.png">

### ルートテーブルを作成し、パブリックサブネットに紐付ける
#### ルートテーブルの作成

「ルートテーブル」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.24.08.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/60fdc104-aa88-32b4-925a-1a28a57b2c5a.png">

現在のルートテーブルを確認（localが作成されている）
<img width="1680" alt="スクリーンショット 2020-01-13 14.27.55.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/84167377-3fcd-3679-c9be-99134a0a342b.png">

「ルートテーブルの作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.41.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/b71e1ece-c86c-9c73-8f26-399559edbd57.png">

任意の名前、作成したVPCを選択し、「作成」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.44.11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/dfbefba9-dfe3-a44c-29e3-083e975dc049.png">

#### ルートテーブルとパブリックサブネットを紐付ける
作成したルートテーブルはVPCのみ割り当てられているので、パブリックサブネットにも割り当てる

作成したルートテーブルを選択し、「サブネットの関連付け」　→　「サブネットの関連付けの編集」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.50.02.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5d338292-51d2-a68b-c42b-efe82e4525fb.png">

パブリックサブネットを選択し、「保存」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 14.57.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/afac902c-2c13-e383-4bcc-9327c10d3c56.png">

サブネットが追加されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-13 14.59.35.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/3972ad2c-fbbd-3fcb-bd14-23a3215819e3.png">

#### デフォルトルートをインターネットゲートウェイに設定する

作成したルートテーブルを選択し、「ルート」　→　「ルートの編集」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 15.03.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/8d1f2f03-9e79-69ae-fd9c-4e8db4b73bd8.png">

「ルートの追加」をクリック
<img width="1680" alt="スクリーンショット 2020-01-13 15.09.32.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/64d0c519-8136-935e-570e-45a051c8fe04.png">

以下を参考に設定し、「ルートの保存」をクリック

- 送信先：0.0.0.0/0
- ターゲット：Internet Gateway → 作成したインターネットゲートウェイ

<img width="1680" alt="スクリーンショット 2020-01-13 15.16.03.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/1620b1a0-dae9-72db-c450-2e6dc7201a53.png">

ルートが追加されていることを確認
<img width="1680" alt="スクリーンショット 2020-01-13 15.19.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/397642/5d095d5e-06cd-6b7a-fda0-3256c26c536f.png">

## ネットワーク設計で考慮すべきポイント
### VPCの設計ポイント
- プライベートIPアドレス範囲から指定する
    - VPCでは仮想のプライベートネットワーク空間を作成するので、プライベートIPアドレスの使用が推奨
- IPアドレスのホスト部は大きめに設定する
    - ホスト部の範囲は/28 〜 /16と決まっている
    - /16が推奨
- オンプレミスや他のVPCレンジと重複しないようにする
    - オンプレミスとクラウドを併用している場合、レンジが重複するとどちらに接続すればよいかわからなくなるため

### VPCとアカウントの分け方
- 異なるシステムを運用する場合、アカウントは分ける
    - 異なるシステムを同一アカウント内に用意すると管理が煩雑になる
- 同一システムで複数環境が存在する場合、同一アカウントでVPCとリージョンを分ける
    - VPCを分けるとIAMの設定が一度でよいが、各環境のリソースが見えて事故の元になる
    - アカウントを分けると他の環境のリソースが見えず作業しやすいが、環境ごとにIAMの設定が必要

### サブネットの設計ポイント
- 将来的に必要なIPアドレス数を見積もって設定する
    - /24が標準的
- サブネットの分割はルーティングとアベイラビリティゾーンを基準に行う
    - サブネットに割り当てられるルートテーブルは1つ
    - インターネットアクセスの有無、拠点アクセスの有無などのルーティングポリシーに応じて分割する
    - 高可用性のために2つ以上のアベイラビリティゾーンを使用する

＊可能な限り全てのサブネットには明示的に何かしらのルートテーブルを紐づけた方が良い
　→ルートテーブルを設定していない場合、デフォルトで存在するルートテーブルが暗黙的に使われるので、
　　デフォルトルートテーブルが変更された際に意図しない影響が出るリスクが発生するから

## 参考
[AWS：ゼロから実践するAmazon Web Services。手を動かしながらインフラの基礎を習得](https://www.udemy.com/course/aws-and-infra/)