噛み砕きAmazon VPC

VPCがよく分からない.....
AWSの開発においてネットワークの制御を行うVPCは最初に必ず設定するもの避けようとしても避けられません。しかし、自分でQiitaとか色々見ながらポチポチやると何となく動くものが作れてしまう...
もともとネットワークの基礎知識があれば問題なのですが、クラウドの場合は知識なくてもよしなにやれてしまうので、ネットワークがザルだったりしても気づいた時には色々遅かったりします。

そこで、自分の中でとりあえずVPCってなんなの？？というのをまとめて自信を持ってAWSが触れるようになることを目指します。

## 前提
EC2でインスタンス立てたことあるくらいの知識は欲しい、かもしれません


## 概要
クラウド(AWS)内での仮想ネットワークを指す。例えば、EC2同士を内部的に通信したい場合やRDSとやり取りする・内部と外部ネットワークを繋ぐ、など。多くのAWSサービスはVPCに乗ります。

VPCは他のVPCと論理的に独立しています。つまり、VPC1の内部のインスタンスからVPC2のDBを直接叩いたりとかは基本できません。このように、VPC同士が独立していることで例えば、開発環境に入って本番DB直接叩けるみたいなことを防止することができます。

VPCの範囲としては

* IP
* ルーティング
* ネットワークゲートウェイ
* セキュリティ

がそれぞれ含まれます

## VPCの各項目の解説
### VPCのIPアドレス
最初にVPCを作成する際にはIPv4 CIDR blockを設定する必要があります。IPv4 CIDR blockはVPC内で使われるネットワークの範囲を決めることが可能です。
IPv4 CIDR blockはXXX.XXX.XXX.XXX/XXの形をしており、これは作成したVPCの中で利用できるネットワークの取りうるアドレスの範囲を規定します(インスタンスなどに割り当てられる内部ネットワークの上限アドレス数を決めようとしている)。/の左側にはそれぞれ0~255が入ります。つまり0~255,0~255,0~255,0~255/XXの値を取り得ます。この0~255というのは2進数で8ビットで表現でき、全部で32ビットで表されます。

/XXの部分は固定するビットの数を指定します。例えば10.0.0.0/16とした場合、左から16ビットを動かすことができなくなるため、このVPC間で取りうる値が10.0.0~255.0~255で255*255=65536個のIPアドレスを内部的に設定することが可能となります。

じゃあいっぱいIP作ればいいじゃんと思うかもしれませんが、基本的にIPの取りうる範囲が広すぎるとセキュリティ的にも影響が出てきたり管理できなくなるので、一般的には大きくしすぎない程度がベターです(もちろんサービスの大きさによって変えるのが適切なので、そこはちゃんと考えたほうが良いです)。

ちなみに、このCIDRブロックの最初の4つと最後の1つのアドレスはAWSで予約済みなので、インスタンスなどに割り当てることはできないので注意してください(利用できるIPは実質-5個となります)。

### サブネット
サブネットは最初にVPCによって作られたCIDRブロックをさらに分割したネットワーク群のことを指します。サブネットはVPC内で上限を超えない範囲で複数作ることができます。それぞれのサブネットはAZ(アベイラビリティゾーン)を指定する必要があり、その地域のデータセンターのリソースを使って作られます。
サブネットには主にパブリックサブネットとプライベートサブネットがあります。パブリックサブネットは読んで字のごとく、外のネットワークと直接繋がっているサブネットであり、プライベートサブネットとは直接は外のネットワークに繋げないサブネットになります。webサービスを作成する場合、パブリックネットワークにしてしまいがちですが、インスタンスなどがパブリックであるとそれだけ外部からの攻撃を受ける可能性が非常に高いので、可能な限りリソースはプライベートサブネットに置くことが好ましいとされています。最初は1つのAZに対してパブリックサブネット・プライベートサブネットを一つずつ作っておけば良いかと思われます。

VPCで作成したCIDRブロックより総数が少ないものを指定する必要があります。例えばVPCが10.0.0.0/18(設定できる範囲が合計が32-18=14ビット)の場合、サブネットを10.0.0.0/24(32-24=8ビット)などと設定することができます。

ここで作ったサブネットは最初は全てプライベート扱いとなり、パブリックにするにはインターネットゲートウェイ(IGW)に繋ぐ必要があります。

### インターネットゲートウェイ(IGW)
インターネットゲートウェイ(IGW)とはVPCと外のネットワークを繋ぐための接合点のようなコンポーネントになります。IGWを作成してサブネットにアタッチすることで、そのサブネットが外部のネットワークとのやり取りが可能になります(パブリックサブネットになります)。

しかし、このままでは実はまだ外や内のネットワークとやり取りをすることはできません。

### ルートテーブル
サブネットを使うためには各サブネットに対してそれぞれルートテーブルを作成する必要があります。
ルートテーブルは仮想的なルーターと考えると分かりやすいでしょうか....？？
サブネットと接続先に一つのルートテーブルを関連付けることで、その中での通信のやり取りができるようになります。
例えばルートテーブルを作成し、接続先に作成したIGW(この場合転送は0.0.0.0/0を用いる)を使うことで、ネットワークがIGWに転送されるようになり、関連付けられたサブネットがパブリックサブネットとなります。

### セキュリティグループ(SG)
それぞれのVPC内でインスタンス(EC2など)を利用する場合はセキュリティグループを使う必要があります。セキュリティグループは特定の通信を許可・禁止することができ、より不要なアクセスを防止することができます。例えば、SSHだけ通信を許可するには22番ポートのみあける、みたいな使い方をすることができます。あるいは特定のIPアドレスからの通信のみ許可することで、その他の不審なアクセスを弾くことも可能です。

## VPC設定の流れ
VPCを設定する場合は、まず以下のようなフローを踏みます(必ずしもそうである必要はない)

1. VPCの作成
2. サブネットの作成
3. パブリックにするものにはIGWを貼る(これも他のサービスを利用する場合は不要なこともある)
3. 各ルートテーブルを作成し、それぞれのサブネットを関連付ける
4. インスタンスを作成
5. 作成時にインスタンスの通信を鑑みてセキュリティグループを作成

最低この辺を行うことが必要となります。

## まとめと理解の定着のために

自分の備忘録も兼ねてVPCの簡単なまとめを行いました。実際にこう文字に書き起こしてみると何となく理解はできるのですが、やはり実際に作ってみないと見落としが多いものです。この辺の内容もやってみないと頭に入らないと思うので、実際に自分でVPCを作って理解するのがベストかと思います。

実はAWSは[セルフベースラボ](https://aws.amazon.com/jp/training/self-paced-labs/)というAWSトレーニング用の仮想環境があります。中には無料で自分で試せるものもいくつかあり、今回のようなVPC設定といったものもあるので、何をやっていいか分からないという人はまずはここからトライしてみると良いかと思います。

## 参考資料
[AWS VPC環境構築](https://qiita.com/tanj/items/141311526d9ee19aa637)

[AWS シナリオと例](https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/VPC_Scenarios.html)

[AWS ネットワーク構築の基本](https://go-journey.club/archives/8806#i-2)

[VPC CIDRについてちょっと調べた](https://qiita.com/daikissdd/items/101679f19de246f22df4)