業務でAWSのネットワーク周りを触ってみたよって話

業務で`VPC`内に`Lambda`を構築するというタスクがありました。
[こちらの記事](https://digitalvarys.com/how-to-assign-a-static-ip-to-the-aws-lambda-function/)を参考に実装していきました。
初めてAWSのネットワーク周りのサービスを使ったので、色々と大変だったんですけど、なんとか上手くできたのでアウトプット代わりとしてお伝えしていこうと思います。
AWSの公式ドキュメントを参考にしながらお伝えしていきます。


1\.VPCを作成する
2\.プライベートサブネットとパブリックサブネットを1で作成したVPCに紐づける
3\.インターネットゲートウェイを作成する
4\.NATゲートウェイを作成する
5\.ルートテーブルを作成する
6\.セキュリティグループの作成
7\.Lambdaをプライベートサブネットに紐づける

まずは1から。
## VPCを作成する
そもそもVPCとはなんでしょうか？
[公式ドキュメント](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html)を読んでみると、以下のように書かれています。
>仮想プライベートクラウド（VPC）は、お客様のAWSアカウント専用の仮想ネットワークです。AWSクラウド内の他の仮想ネットワークから論理的に分離されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/012abce3-6ab7-3063-4692-10b142260e92.png)

つまり、ぼくたちだけが使えるプライベートなネットワークを構築するためのサービスですね。
たとえば、あるサービスのデータベースをVPC内に構築することで外部からの接続を遮断することができるわけですね。

## VPCがどう動いているのか
[公式ドキュメント](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html)を読んでみると、以下のように書かれています。

>VPCを作成する際には、VPCのIPv4アドレスの範囲をCIDR（Classless Inter-Domain Routing）ブロックの形式で指定する必要があります。

そもそもCIDRって何なのでしょうか？
### CIDR
辞書的な意味でいうと、**IPアドレスでアドレスクラスの概念を無くした仕組み**です。
マジで意味不明だとおもいますので、IPアドレスとアドレスクラスを説明していきます。
#### IPアドレスとは
IPアドレスは、パソコンやスマホ等のデバイスに割り振られているインターネット上の住所みたいなもんです。
そして、IPアドレスには、「どのネットワークに」データを送るかを決めている**ネットワーク部**と、「どのコンピュータに」データを送るかを決めている**ホスト部**が存在します。
例えば、197.78.110.20というIPアドレスにはネットワーク部とホスト部が存在します。
#### アドレスクラスとは
アドレスクラスは32bitで構成されており、左から24bitがネットワーク部で8bitがホスト部になります。
IPアドレスは5つのクラス(アドレスクラス)に分類されます。

| クラス | 範囲 | 特徴 |
|:-----------:|:------------:|:------------:|
| クラスA       | 1.0.0.0〜126.255.255.255 | 大規模 最大16,777,214台|
| クラスB  | 128.0.0.0〜191.255.255.255 | 中規模 最大65,534台 |
| クラスC       | 192.0.0.0〜223.255.255.255 | 小規模 最大256台|
| クラスD         | 224.0.0.0〜239.255.255.255 | マルチキャスト |
| クラスE       | 実験用で使用されてない| × |

IPアドレスがわかるだけで、どのクラスに属しているかわかるので、一見するとめっちゃ便利に見えますよね。
でもこのIPアドレスのクラス分けの仕方をすると、問題がでてきます。
たとえば、IPアドレスが80000個必要だとしたら、アドレスクラスのクラスAに属します。
でも80000個しか必要ないのに、1600万台分のアドレスを付与されたら、不必要なIPアドレスが多すぎ問題が発生します。

その問題を解決するために考えられたものがCIDR(Classless Inter-Domain Routing)です。
CIDRはクラスという概念を使わずに、IPアドレスの割り当て量の最適化を行います。
ですが、どこまでがネットワーク部でどこまでがホスト部か分からないですよね。

それを分かるために必要なものが**サブネットマスク**というものです。
サブネットマスクは書式はIPアドレスと同じ、255.255.255.128のように記述されます。
コンピュータは2進法で区別をする物体なので、2進法で考えてみます。
255.255.255.128を2進法にすると、11111111.11111111.11111111.10000000となります。
もちろん2進法なので、0と1から構成されています。

そのうち、1が並んでいる部分がネットワーク部(「どのネットワークに」データを送るかを決めている)で、0が並んでいる部分がホスト部(「どのコンピュータに」データを送るかを決めている)です。

では先ほどのIPアドレスである197.78.110.20のネットワーク部とホスト部を、サブネットマスク255.255.255.128を例に確かめてみましょう。
197.78.110.20を2進法で並べてみると、11000101.01001110.01101110.00010100
255.255.255.128を2進法で並べると、11111111.11111111.11111111.10000000

197.78.110.20のホスト部が0010100の部分で、それ以前がネットワーク部になるわけです。
つまり、サブネットマスクが「255.255.255.128」の場合、IPアドレス「197.78.110.20」は、「11000101.01001110.01101110.0ネットワークの0010100コンピュータです」という意味になるわけですね。

そして、このホスト部は7bitなので、サブネットマスクが255.255.255.128のときは、ホスト部に割り当てられるのは、128個のIPアドレスを割り振ることができます。
詳しくは[IPアドレスのサブネットマスク早見表](https://www.ahref.org/doc/ipsubnet.html)をご覧ください。

次の最大IP数の増え方が、アドレスクラスだと、2の8乗ずつ増えていくのに対して、CIDRだと2の2乗ずつ増えていくので、無駄なIPアドレスの個数が減っていくような仕組みとなっています。

CIDRを表記するための表記方法として、CIDR表記というのがあり、書き方としては、
「IPアドレス/2進法でIPアドレスを表記した時のネットワーク部のbit数」で表記します。
今回の197.78.110.20でいえば、2進法でIPアドレスを表記した時のネットワーク部のbit数は25であるため、CIDR表記でいうと、197.78.110.20/25となります。

VPCは以下の画像のように作成されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2485775/5de2d936-9473-7355-04e8-4813ea0a7a46.png)
【[AWS公式ドキュメント](https://docs.aws.amazon.com/vpc/latest/userguide/configure-your-vpc.html)より参照】

サブネットとは、VPC内で使えるIPアドレスの範囲のことを言います。
画像を見てもらえれば分かるとおもいますが、サブネットにはCIDRが使われています。

## 2. プライベートサブネットとパブリックサブネットを1で作成したVPCに紐づけ
このセクションはサラッといきます。
パブリックサブネットには、webサーバとやりとりするためのサービスを展開します。
そこからプライベートサブネットにあるDBへアクセスしたりするよう展開します。
なぜこのように一旦パブリックサブネットを挟むかというと、セキュリティを意識するからです。
webサーバからいきなり、DBにアクセスしちゃうとまずいですからね

## 3. インターネットゲートウェイを作成する
VPCは1でも説明した通り、プライベートクラウドなので、そのままだとインターネットにアクセスすることができません。そこで、このインターネットゲートウェイというものを設定することで、VPCからインターネットにアクセスることが可能になります。

## 4. NATゲートウェイを作成する
3で作成したインターネットゲートウェイですが、このままだとインターネットからVPCにアクセスできてしまいます。VPCからインターネットにアクセスしたいけど、インターネットからVPCにはアクセスできないようにします。
[公式ドキュメント](https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Scenario2.html)によると、具体的にはNAT(Network Adress Transition)ゲートウェイというものをパブリックサブネットに設定します。そうすることで、プライベートサブネット→パブリックサブネット→インターネットという経路を使って、プライベートサブネットをより安全に運用することができます。
なので、NATゲートウェイを使用します。

「NATそのものがなんやねん！」っていう方は以下の記事が参考になりましたので、共有しておきます

https://qiita.com/tasakii/items/60a3696ec7b86111884d

簡潔に言えば、プライベートIPアドレスはインターネット上にルーティングがないので、プライベートIPアドレスをグローバルIPアドレスに変換することで外部とのやりとりを可能にするわけです。
その変換する際に使われているのがNATというものなんですね。

## 5. ルートテーブルを作成する
ルートテーブルとは、何をしているかというと、サブネットからどこと通信するか定義するものです。
今回でいえばインターネットと通信したいので、0.0.0.0/0を指定します。
この数字は超ザックリいえば、インターネットにつなげるよ、ということを表しています。

## 6.セキュリティグループの作成
セキュリティグループとはファイアウォールみたいなものです。(厳密には違います)
それを指定してあげることで、どのサービスをグルーピングして攻撃から守るかを指定してあげています。


めちゃくちゃザックリなんですけど、これからもっとAWSを触る機会が多くなるとおもいますので、随時AWS関連の記事をアップしていくとおもいます

【参考記事】

https://docs.aws.amazon.com/vpc/index.html

https://wa3.i-3-i.info/word11989.html