【ネットワーク】AWS VPCに関する諸々を理解するために【VPC】

# はじめに
さまざまなプロジェクトでAWSを使って久しいですが、どうもVPCやネットワーク周りが苦手というエンジニアが少なくないように感じています。
身近なところでは、「AWS Lambda関数、実行できたけど何故かタイムアウトするよ。RDSには繋げられてるのに。」とか、
「EC2からS3にアクセスできないんだけど」、「API GatewayからELB->EC2に繋がらない」といった話を良く聞きます。

話を聞いてみると、TCP/IP(※)の基礎を理解しておらず、曖昧な理解のまま作業を進めているケースが殆どでした。
そこで、TCP/IPをきちんと理解するための情報をまとめておこうと思います。

※本稿で言うところの「TCP/IP」は広義の意味で用います。
　TCP/IPで実現するネットワークに関わる諸々の技術、エコシステムと捉えていただければ結構です。

本稿では、要素技術の解説は行いません。
何故ならば、既に良くまとまった有益なサイト・書籍があるからです。

# キーワード
最低限、下記の技術要素をきちんと理解していれば、VPCも怖くありません。
ひととおり勉強した後、チェックリスト代わりに使ってみましょう。

- IP
- ARP
- ネットワークアドレスとホストアドレス
- CIDR/サブネット
- ルーティング
- ルーティングテーブル（※AWSのRoute Tableとは若干違う概念です）
- ICMP
- TCP/UDP
- Static NAT（≒Internet Gateway）
- NAPT（≒NAT Gateway）

# 基礎を理解する
## 参考サイト

> 3分間ネットワーキング
> http://www5e.biglobe.ne.jp/aji/3min/

TCP/IPネットワークの基礎をなす技術要素について、丁寧に解説されています。
Flashアニメーションがとてもわかりやすいです。

取り急ぎ第1回～第36回までおさえれば、IPの基礎はわかると思います。
1回分が短く、自分のペースで読み進めていくことができます。


> ネットワークエンジニアとして
> http://www.infraexpert.com/

基礎技術が一から丁寧に解説されています。
「Network Study 1 ： 初級ネットワークエンジニア向けネットワーク技術」の下記項目を押さえておけば良いと思います。
想定読者が所謂ネットワークエンジニアなので、Cisco機器のコマンドの説明が入ってきたりしますが、適当に読み飛ばすとよいでしょう。

- ネットワークをはじめから
- TCP/IPをはじめから
- Ethernet LANをはじめから
- IPv4をはじめから
- IPルーティングをはじめから

> ネットワークのおべんきょしませんか？
> http://www.n-study.com/

こちらも基礎から丁寧に解説されています。
ただ、Blog形式のようなサイト構成で、順を追って体系的に読み進むのが少し難しいような気がします。


## 参考書籍
あまり沢山の参考書籍をあげても目移りしてしまうと思いますので、厳選して紹介します。

> マスタリングTCP/IP 入門編 第5版
> https://www.amazon.co.jp/dp/4274068765

TCP/IPネットワークの勉強をするなら、まずはこれです。
ネットワークエンジニア／インフラエンジニアであれば、1年目に必ず買う／買わされる／買ってもらう、でしょう。
\# 私は会社に買ってもらったクチです:blush:

ただ、カスタマーレビューを読んでいて少し気になることがありました。
最新版は第5版ですが、旧版の方が良かったというようなコメントが散見されます。可能であれば第4版を買うのが良いのかもしれません。
ちなみに私は第3版で勉強しましたが、この本で勉強したことはずっと役に立っていると、身にしみて感じます。


> ネットワークはなぜつながるのか 第2版 知っておきたいTCP/IP、LAN、光ファイバの基礎知識
> https://www.amazon.co.jp/dp/4822283119/

ネットワークを経由してデータが転送されている経路、仕組みについて丁寧に解説されているようです。
読んだことはないのでなんとも言えませんが、発行から10年以上経っても版を重ねて販売されていることから、
恐らくしっかりした良い本だと思います。


# 応用する
## AWS Lambda within VPC with Internet connectivity
VPCを利用する上でつまづくのは、AWS LambdaをVPC内で動かす場合だと思います。
VPC内のRDSと通信することはできてもInternetと通信することができない、という状況に陥ってるケースを良く見ました。
しかも、AWS Lambdaのログ上、単純にタイムアウトしているだけのメッセージしか出力されないので、原因特定に時間がかかってしまうことが多いようです。

AWS LambdaをVPC内で動かしてInternetと通信するためにはNAT Gatewayが必要になります。
これは公式ドキュメントにも書いてあります。

Amazon VPC 内のリソースにアクセスできるように Lambda 関数を構成する
http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/vpc.html


またNAT Gatewayが必要であることは知っていても、構成を間違えていてInternetと通信できていない状態になっていることもありました。
AWS Lambdaを実行させるPrivate Subnetのデフォルトゲートウェイ(0.0.0.0/0)はNAT Gatewayになりますが、
NAT Gateway自身はPublic Subnet（デフォルトゲートウェイ(0.0.0.0/0)はInternet Gateway）に配置する必要があります。
NAT Gateway自身もPrivate Subnetに配置されていたため、Internetと通信できない構成になっていたこともありました。


NAT Gatewayがなぜ必要なのか、具体的にどのような仕組で動いているのか、といった点についての説明は公式ドキュメントにはほとんどありません。
しかしながら、仕組みを理解していないと、気付かないで間違った構成を作ってしまう、間違いに気づけないまま時間を浪費する、といった状況に陥ってしまいます。
そのために、きちんとネットワーク技術の基礎について理解する必要があります。


## VPCに関する参考サイト
TCP/IPの観点からVPCを説明した記事は意外と少ないですが、下記の記事がとてもよくまとまっていると思います。

これを読んですんなり理解できるようになれば、VPCを扱うための知識は身に着いたと言えるのではないかと思います。

https://dev.classmethod.jp/cloud/vpcfor-infra-engineer-1/
https://dev.classmethod.jp/cloud/vpcfor-infra-engineer-2/
https://dev.classmethod.jp/cloud/vpcfor-infra-engineer-3/
https://dev.classmethod.jp/cloud/aws/vpcfor-infra-engineer-4/


# おわりに
技術の発達により、コードからネットワーク／インフラを制御できるようになりました。
一見、知識がなくても簡単にネットワーク／インフラを扱えるようになったんじゃないかと錯覚しますが、そんなことはありません。
むしろ仕組みが複雑化している分、基礎を丁寧に押さえていないと、いざトラブルという時に手も足も出なくなります。
基礎をきちんと習得するには時間がかかりますが、後で必ず生きてきます。