AWSのVPCについてまとめてみた

##VPCとは
AWSの仮想ネットワークを作成するサービスです。セキュリティーの設定もここに含まれます。
全てのサービスを作る上で、土台となるネットワークを作成するサービスなので、AWSの勉強をするときには基本的にVPCから学ぶのがおすすめです。

VPCを作成するときに、最初にリージョンの設定を行う必要があります。

##リージョン、アベイラビリティゾーン（AZ）について
アベイラビリティゾーンはAZと略されることも多いので、今後はAZと表記します。

###アベイラビリティゾーン（AZ）
サーバーを置いているデータセンターが集合している場所のことです。
![img01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/da0275d6-2619-6c75-6595-07a3ab661f43.png)


###リージョン
AZを束ねた地域のことです。
世界中にリージョンは存在していて、日本には**東京リージョン**と**大阪リージョン**があります。
![img02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/3a0cbc1d-ea73-1a0d-dd74-94d0eb68e1ab.png)

東京リージョンを使用する場合は、下記のような表し方をします。
「ap-northeast」が東京リージョンを表し、末尾の「1」はAZを表します。
東京リージョンのAZは現在下記の３つが主に使われています。
VPCを使うとこの３つのAZを使うことができます。
![img3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/9ebecd50-0bd1-73d3-615f-08cedaba2f51.png)

##サブネットについて
VPCでネットワークを構成するときに、セキュリティーレベルをあげるためにネットワークを細かく区切ることがあります。
その細かく区切るための小さなネットワークをサブネットと呼びます。
サブネットには**「Public subnet」**と**「Private subnet」**と呼ばれる２種類が存在します。
インターネットゲートウェイに接続できるかどうかの違いがあります。
簡単に説明すると「Public subnet」はインターネットで外部からアクセス可能なサブネットで、「Private subnet」はVPCのネットワーク内でのみアクセス可能なサブネットになっています。
AWSの中にVPCを作成し、更にその中にサブネットを複数作成できます。

![img04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/39d32b23-78be-e791-0d41-58423cc64c57.png)

VPCやサブネットにはIPアドレスを割り当てて使用します。
IPアドレスやサブネット（サブネットマスク・CIDR表記）に関する詳しい説明はこちらにまとめています。
このサブネットの中にEC2などのインスタンスをたてて、サーバーの設置などを行います。
[https://qiita.com/a_goto/items/396dee5c6d894392acb3](https://qiita.com/a_goto/items/396dee5c6d894392acb3)
![img06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/a0deb21a-a594-3656-3536-129d2333637c.png)

##VPCのネットワークコンポーネントについて
ネットワークコンポーネントとはVPCの機能を分解してコンポーネント（部品）として扱えるようにしたものです。
VPCでネットワークを作成し、ネットワーク内でサブネットにIPアドレスをアタッチ（付与）したり、インターネットに繋げれるようにしたり、セキュリティーの設定など様々な機能を追加するのに使います。

ここでは下記について説明します。

```
ルートテーブル
インターネットゲートウェイ
NATゲートウェイ
ENI
Elastic IPアドレス
セキュリティグループ
ネットワークACL
```

例えば下記のように、VPCにサブネットを2つ用意し、その中にEC2インスタンスをそれぞれAとBを設置し、様々な機能を追加していくとします。
![img07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/719158ae-4aaa-dcfc-47aa-78af7a2553ab.png)
このEC2のAとBを紐付けて通信する場合に必要な機能の説明をします。
ルートテーブル、NetworkACL、セキュリティグループを例に取ります。

###ルートテーブルについて
ルートテーブルは、サブネットに関連付けて使用するもので、サブネットから外に出る通信を、どこに向けて発信するのかを定義づけるルールのことです。
**ルート**と呼ばれる下記のようなルールで構成されます。
![img08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/7bccf2be-87f4-5981-0da6-9245425884a7.png)
ターゲットに設定されているLocalというのはVPC内のことを指します。
10.0.0.0/21に向けての通信はVPC内に向けて通信が発信されるようになります。
デフォルトではこの設定がされており、ここにルールを追加していくことが可能です。
基本的に**ルールは細かく指定したものが優先される**ため、細かく通信の制御を設定することで、通信できる範囲を絞ってセキュリティーを高めていくことができます。

例えば下記のようなルールを追加すると、
10.0.0.0/21に向けての通信は上記と同じで、VPC内に向けて通信が発信されて、
それ以外に向けての通信は全て、インターネットに向けての通信が発信されるようになります。
![img09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/3da63a13-3275-69e1-c516-6382cc97b78f.png)

###インターネットゲートウェイ
インターネットゲートウェイとはVPC内のAWSリソースとインターネットを繋げるための機能です。
VPCのネットワークからインターネットに通信を可能にするためには、下記のようにこのインターネットゲートウェイをVPCにアタッチする必要があります。
![img10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/269fad28-35e4-89bd-0ea8-d7520d4f416a.png)

インターネットゲートウェイの特徴としては、インターネットからアクセスが集中しても、自動でスケールして対応してくれるため高い可用性があります。
そして、下記の図のようにサブネットのルートテーブルの設定を使用します。
![img11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/084c9764-7f01-0874-33c8-8089de7bf0cb.png)

また、サブネットからインターネットゲートウェイへのルーティングは、Public subnetからのみ可能になっています。
使い分けとしては、インターネットからアクセスしても問題ないリソースなどはPublic subnetに配置し、セキュリティレベルを上げたい、データベースなどのリソースはPrivate subnetに配置します。
![img12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/06c22241-734c-fbba-23f2-592d31e3a654.png)

###NATゲートウェイ
NATゲートウェイはプライベートサブネットからインターネット接続を可能にする機能です。
ただし、アウトバウンドはできるが、インバウンドはできません。これにより外部からプライベートサブネットには接続できないのでセキュリティが担保される。
![img13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/2c7ee8f5-f4a5-8423-5456-4d7ee822b237.png)

###ENI（Elastic network interface）
仮想ネットワークインターフェイスの略で、EC2インスタンスなどにIPアドレスをアタッチすることができる機能です。
同じAZ内のインスタンスにアタッチ/デタッチができます。
EC2にはデフォルトでENIが付与されている。
一つのインスタンスに複数のENIを付与することができる。
このENIとインターネットゲートウェイが接続することで、Public subnetとインターネットが接続可能になる。
![img14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/271c5936-e8d3-5422-ca4d-a8a01b3bcdc4.png)

###Elastic IPアドレス
外部のネットワーク同士が接続するためには、**外部接続用のIPアドレス**が必要になります。
AWSにも外部用のIPアドレスを付与する機能が２つ用意されています。

「Public IP アドレス」「Elastic IP アドレス」の２つです。

####Public IP アドレス
AWSのIPアドレスプールにより割り当てられる外部接続用のIPアドレスで、インスタンスが再起動、停止、終了したときに開放されます。
開放されることで、確率は低いですが他のネットワークが再度同じIPアドレスをもつ可能性もあります。
設定で有効にしていると、自動で割当されます。
基本的には使わない方が良いと思います。

####Elastic IP アドレス
同じく外部接続用のIPアドレスで、インスタンスにアタッチ/デタッチが可能で、
静的なパブリックIPアドレスのため、再起動、停止、終了したときでも同一のIPアドレスになります。
**どこにもアタッチしていない場合１時間あたり１円の料金が発生するので注意が必要です。
どこかにアタッチしていれば料金はかかりません。**

図が少しややこしいですが、EC2インスタンスはENIを持っており、このENIに外部接続用のElastic IPアドレスがくっついているイメージです。
![img15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367456/5d718d16-2b92-2b8e-f789-ab3ad93f06f1.png)

###セキュリティグループ
AWSの仮想ファイアーウォールサービスのことです。
ファイアーウォールとは通信を制限するフィルターのようなものです。
インバウンドとアウトバウンド両方の設定を行える。基本的にアウトバウンドの設定をすることはあまりない。
ENIの単位で設定します。


###ネットワークACL
サブネット単位で設定するファイアーウォールのことです。
ステートレス・インスペクション型といって、アウトバウンドの通信を許可した場合、インバウンドも明示的に設定する必要があるのが特徴です。