VPCの概観とCIDRを用いたサブネットとの関係性のまとめ

## 前提としてのCIDRという概念
- **32ビットのIPアドレス**を任意の位置で分けて**ネットワーク部とホスト部に分割する**仕組み
- プレフィックス表記を用いる事でアドレス末尾に「**/xx（アドレス先頭からxxビット目で区切る**という意味）」を明示できる。
```:CIDRの表記例
    192.168.10.1/24　　　　　　　　　　　　　（10進数表記のIPアドレスと/24プレフィックス表記）
    　　↓
    11000000.10101000.00001010.00000001　　（2進数表記のIPアドレス）
    00000000.00000000.00000000.11111111　　（24ビット目で０と１が切り替わる事で表現されるサブネットマスク）
    |-----ネットワーク部-------||ホスト部|
    　　↓
    11000000.10101000.00001010.00000000　　 （2進数のネットワークアドレス（ホスト部が０なのがネットワークアドレス））
    192.168.10.0/24 　　　　　　　　　　　　　（10進数のネットワークアドレス）

```
- 要は、CIDRは、
    - 割り当てられたIPアドレスをさらにネットワーク内で分割使用でき、
    - ネットワークアドレスと、そのアドレスが割り振られたホストの番号まで一度で理解できる便利な仕組み
    - 例えるなら「○○株式会社の社員番号○○番さん」という表記。
<br>

- これはAWSに限らず現在のインターネットにおける大前提のルール。
<br>



## VPCのCIDR
- VPCもネット上に存在する仮想のネットワーク空間である為、ちゃんとIPアドレスが割り当てられている。

**（重要）**
　そもそも「仮想」と言われているからなんだか混乱するけれど、**AWSの本質は「Amazonが持ってる莫大な量の物理マシンの一部をテナントとしてレンタルしているだけ」というビジネス**の為、偶々利用者である自分たちの目の前に物理サーバーやスイッチ、ルーターが存在しないせいで想像しにくいだけで、自分のネットワークにIPアドレスが割り振られている事は従来のネットワークの考え方と何も変わらない。
 - だからVPCも複雑に考える必要はなく、**「Amazon所有のクソデカいオフィスビルのうちの1オフィスを借りている」** のような感覚でいい、のではないだろうか。
<br>

 - つまり、まずはあなたのVPCに割り振られたIPアドレスがあなたの**大元のネットワークアドレス**になる。



## VPC内に存在するサブネットというエリア
### この章の内容と重なる記事
[AWS VPCに対する構造的理解とセキュリティグループ、ACLに関する概要の備忘録](https://qiita.com/xBUDPIyZ4fDZrlg/items/13cf3e49170bc296a774)
<br>

- **VPCの中にはサブネットが存在します。**
    - サブネットにはパブリックサブネットとプライベートサブネットがあります。
    - パブリックサブネットは**オフィスの受付窓口やレジ**のような客と接触するエリア。
    - プライベートサブネットは**バックオフィスや書庫**のような客と接触せず機密性の高いエリア。
- つまり、サブネットは**VPCというオフィスをパーティションで区切った１つ１つの部屋**の事。
<br>

- その為、VPCという **「オフィス住所の中の○○号室」** という風に部屋番号をサブネットに配らなければならない。
- その時に使用するのが、**VPCのCIDRをさらに分割したCIDRブロック**という概念。
<br>

## CIDRブロックという考え方
- VPCのCIDRが16プレフィックスだった場合、そのVPCネットワーク内にさらに割り振る事ができるアドレス数は、<br>
32 - 16（ **IPアドレスのビット数 - ネットワーク部分のビット数** ） = 16<br>
となり、「16桁の2進数で表す事ができる数字の数」となります。
- 実際この場合は、「1111111111111111(2) => 65535(10)」がVPC内に割り振れるホスト数になります。（正確には先頭と末尾の2つの数字は使用できない。）
<br>

- しかし、VPCは決して何も区分けされてない更地の状態で運用する訳ではありません。
- 前述したように、VPC内にはサブネットと言う部屋があり、そのサブネット一つ一つに番号を振る必要があります。
<br>

- そこで行うのが、**「VPCのIPアドレスのホスト部分のアドレスをさらに任意のビットで区切って部屋番号に当てる」** という操作です。
<br>

こう聞いただけだとよく分からないと思うので、下記の図を見て下さい。

```:CIDRブロックの説明
    192.168.10.1/16　　　（プレフィックス16のVPCのIPアドレス）
        ↓
    192.168.0.0　　　　　（この時のVPCのネットワークアドレス）

これを2進数で表現すると…

    11000000.10101000.00001010.00000001　　（2進数表記のVPCのIPアドレス）
    00000000.00000000.11111111.11111111　　（０と１で表現したプレフィックス16のサブネットマスク）
        ↓
    11000000.10101000.00000000.00000000　　（2進数で表現されたVPCのネットワークアドレス）
    |-ネットワーク部--||----ホスト部----|

となります。
そして、この時VPCアドレスをオフィスで表現してみると…

    11000000.10101000.00000000.00000000　　（2進数で表現されたVPCのネットワークアドレス）
    |-ネットワーク部--||----ホスト部----|
    |-----会社名-----||----社員番号----|

となります。
しかし！！実際は[会社名]と[社員番号]の間にサブネット、つまり[部屋番号]が必要になります。
要は、

    |-ネットワーク部--||----ホスト部----|
    |-----会社名-----||----社員番号----|
    　　　↓
    |--会社名--||-部屋番号-||-社員番号--|

にしたい！！

この時に一番簡単な方法が、「調整可能なアドレスのホスト部分をさらに分ける。」です。

    |ネットワーク部|　|-----ホスト部------|
    |---会社名----|　|部屋番号||-社員番号-|

とします。
実際にIPアドレスに当て嵌めて考えてみると…

    192.168.10.1/16　　　（プレフィックス16のVPCアドレス）
    　　↓
    192.168.0.0　　　　　（VPCのネットワークアドレス）

    11000000.10101000.00001010.00000001　　（2進数表記のVPCのIPアドレス）
    00000000.00000000.11111111.11111111　　（プレフィックス16のサブネットマスク）
    　　↓
    11000000.10101000.00000000.00000000　　（2進数のネットワークアドレス）
                      |--割り振り可能--|　　（末尾16桁が割り振り可能エリア）
                      |subnet||-host--|　　（今回は8桁をサブネット番号、残り8桁をホスト番号に当てる）
                      
        ↓
        
　・11000000.10101000.00001010.00000000　　（サブネットアドレス（部屋番号）が10のCIDRブロック）
      192  .   168   .  10    .   0    /24（このCIDRブロックを10進数アドレスで表現する）
    
　・11000000.10101000.00010100.00000000　　（サブネットアドレス（部屋番号）が20のCIDRブロック）
      192  .   168   .  20    .   0    /24（このCIDRブロックを10進数アドレスで表現する）

と表現できます。
これがCIDRブロックです！！
```
となります。
<br>

この時、<br>
**「え！？なんか /16だったプレフィックスが /24になっちゃったんだけど！？」**<br>
と困惑する方もいるかもしれませんが、考えてみると、

「/16のアドレスなら、**先頭16ビットまでのアドレスが固定されていれば同じネットワーク**なのは分かる。」
「/24のアドレスの場合、末尾8桁でホストを割り振るから、**先頭16ビットと末尾8ビットの間の8ビット**はさらに自由に割り振れるフィールドとして使えるだけ。」<br>

と考えると、一気に単純に思えると思います。後は慣れ。



## VPCとサブネットのCIDRブロックのまとめ
- VPCはAmazonから借りてる仮想のレンタルスペース
- VPCにはIPアドレスがある。
- VPCの中にはサブネットがある。
<br>

- VPCアドレスのホスト部分をさらに分割してサブネット用番号とサブネット内のホスト番号に当てる。
- その際、サブネットのIPアドレスはVPCアドレスよりも数字の大きいプレフィックスを持つIPアドレスに表現される。
```:例
VPCネットワークアドレス： 192.168.0.0/16
VPC内サブネットアドレス： 192.168.10.0/24
VPC内サブネットアドレス： 192.168.20.0/24
```
<br>

## 最後にザックリイメージ！！
```:VPCのイメージ
+===Internet================================================================================
|
|  +---AllAmazonRegions---------------------------------------------------------------------
|  |  +---Region----------------------------------------------------------------------------
|  |  |  +---VPC----------------------------------------------------------------------------
|  |  |  | (192.168.0.0/16)
|  |  |  |
|  |  |  |  +--AvailabilityZoneA----------------------------+  +--AvailabilityZoneB---------
|  |  |  |  |  +---PublicSubnet----+  +---PrivateSubnet---+ |  |  +--PublicSubnet-----+  +--
|  |  |  |  |  | (192.168.11.0/24) |  | (192.168.21.0/24) | |  |  | (192.168.12.0/24) |  |
|  |  |  |  |  |                   |  |                   | |  |  |                   |  |
|  |  |  |  |  |                   |  |                   | |  |  |                   |  |
|  |  |  |  |  |                   |  |                   | |  |  |                   |  |
|  |  |  |  |  |                   |  |                   | |  |  |                   |  |
|  |  |  |  |  +-------------------+  +-------------------+ |  |  +-------------------+  +--
|  |  |  |  |                                               |  |
|  |  |  |  +-----------------------------------------------+  +----------------------------
```