AWSアソシエイト試験に向けて4(VPC関係）

## VPCの前にネットワークでのアドレス周りの知識について

### IPアドレス

ネットワーク機器やWEBサイトの場所を特定するために使われるもの。
住所……というより識別コードみたいな印象が個人的にはある。
TCPやIPというプロトコル(通信に関する規則・手順。語彙としては儀礼という意味になるのでかなり厳格な意味合いを持つ)に則って使われている。
機器に付与されるのではなく、NIC(ネットワークインターフェースカード)という部分に付与される。

2進法かつ8bit×4の32bit値で構成されているものを10進法に直して表示されている。
つまり、180.16.1.10というIPアドレスの実体は10110100.00010000.00000001.00001010ということになる。
(10進数から2進数へ変換→8bitにするために8桁にならないところは前の桁に0で埋める)
ちなみにIpv4が一般的だが、振り当てがいっぱいいっぱいになってきているのでIPv6という規格に移行が始まっている。
IPアドレスはグローバル(一意)とプライベート(ユーザーの通信環境内で利用され、決められた範囲で自由に割り振れる)に分かれる。
個人レベルの話で大雑把な言い方をするとルーターにグローバルIPが振られていて、ルーターがそれをルーター内の目的の各プライベートIPへ通信を振り分ける形で普段の通信が行われているイメージ。

### ネットワークの範囲とIPアドレスの関係

IPアドレスの利用可能な範囲がネットワークの範囲となる。
1番単純な例であると、ルーターの接続台数である。
例えばルーターが5台まで端末を接続できるといった場合に振り分けられるIPアドレスは5つとなり、すなわちその5つのIPアドレスがそのルーターのプライベートネットワークの範囲ということになる。
さらに細かくするとIPアドレスにはサブネットマスクが定義されることで、そのIPアドレスの範囲が決まることになる。
10.0.1.0/16のIPアドレスを例にして考えてみる。
この場合、サブネットは/16の部分で16bitまでをロックするという意味になる。
したがってこのIPアドレス内では10.0を頭にして、残りの1.0の部分(00000001~.00000000)の16bitの範囲でIPアドレスをさらに作成することでネットワークを分割できることになる。
その際に分割するときはサブネットマスクの値をさらに上げる(/16のままだと同階層のネットワークになるので、例えば/24にして固定する範囲をさらに広くする)。
このとき固定される範囲のことをネットワーク部と呼び、それ以外の利用可能な範囲をホスト部と呼ぶ。
こうしてサブネットを使ってIPアドレスの割当を行い、ネットワークの範囲を定義することをCIDR(Classeless Inter-Domain Routing)と呼ぶ。
プライベートIPアドレスの割り当ては余裕をもたせて行うのがベター。
ちなみにCIDR基準で割り当てられるサブネットあたりのIPアドレスの数はサブネットマスクが2進むごとに約1/4ずつ減っていく。
つまり、1つ下がるごとに約1/2で求められる。

ex.

/16 → 16379
/20 → 4091
/22 → 1019
/23 → 521


### サブネットについて

まず、グローバルとプライベートのネットワークの間にはそれを仲介するNATと呼ばれるものが存在する。
例えば、AWSのVPCならNATゲートウェイがそれにあたる。
例えば端末は個々に割り当てられたプライベートIPアドレスでネットワークに繋がろうとするが、プライベートIPアドレスはグローバルネットワークにおいては一意とはなり得ないのでこのままでは利用できない。
そこでNATがプライベートIPアドレスをグローバルIPアドレスに変換する形で仲介することで、端末はネットワークに接続できるようになる……というのがNATの役割になる。
1対多の関係でグローバルIPアドレスとプライベートIPアドレスを変換する場合はNATではなく、IPマスカレードというものを使うことになる。
ちなみにAWSではデフォルトで1つアカウント作成時にパブリックサブネットが1つあるVPCが用意されている。

## VPC

ここからが本題でVPC(Virtual Private Cloud)とはAWSにおける仮想ネットワーク空間をユーザー専用に切り出したものを指す。
特徴は以下の5点。

- 任意のIPアドレスを範囲選択して仮想ネットワークを構築
- サブネットの作成、ルートテーブル、ネットワークゲートウェイの設定
- クラウド内外のネットワークの接続
- インターネット経由での接続かVPN/Direct Connectでの接続かを選択できる。
- 同一リージョン内では複数のAZに跨がせることができる

またVPCにおける設定の上限数は以下の通り。

- リージョンあたりのVPCは5まで
- VPCあたりのサブネットの数は200まで
- 1リージョン内のElasticIPの数は5個まで
- ルートテーブルあたりのルート上限数は100
- VPCあたりのセキュリティグループの数は500まで
- セキュリティグループあたりのルールの数は50まで

またAWSアカウントを作成するとデフォルトで以下のようなものが作成される。

- サブネットマスク/16のIPv4のCIDRブロックのVPC(最大6万強のプライベートIPv4が作れる)
- 各AZ(アベイラビリティーゾーン)に/20のサブネット(最大4000強のIPアドレス、一部は使えない)
- インターネットゲートウェイの作成(デフォルトのVPCに接続されている)
- セキュリティグループ(デフォルトのVPCに適用)
- ネットワークアクセスコントロール(ACL、これもデフォルトのVPCに適用)
- DHCPオプションセット(AWSアカウントに紐付く)
- パブリック、プライベートどちらにもDNSホスト名が付与される

VPCはVPCで用途別にウィザードで作成できる、そこで作成したものをカスタマイズするのがベターな作成方法。
つまり整理すると

- AZにCIDR区分(サブネットマスク)でVPCが作られる
- VPCのIPアドレスとサブネットマスクによって任意の数サブネットが作られる
- 必要に応じて作られたサブネットのうちインターネットゲートウェイにルーティングされるようなルートテーブルを持つサブネットを設定する(パブリックサブネット。インターネットゲートウェイへのルーティングがないものはプライベートサブネット)

という手順でVPCのネットワークレンジが決まる。
ちなみにCIDRは/16、サブネットは/24で作ることが推奨されているらしい。
プライベートサブネットからインターネットへ接続するためにはパブリックにNATゲートウェイを置き、そこからパブリックのゲートウェイに渡す手法を取る。
ではリソースとの通信はどうするのか?
VPCの外側にあるリソースとの通信はパブリックAWSネットワークかエンドポイントを利用する。
VPCを設計するときのポイントは以下の通り。

- 将来の拡張を考えた余剰性や他のネットワークとの接続性を考慮する
- CIDRは既存のVPC及び社内ネットワークなどと被らないアドレス帯を設定し、既存の組織構成やシステム構成の将来像を考慮する
- VPC構成は単体ではなく、VPC全体の関係性も考慮する
- 組織とシステム境界からVPCをどのように分割するかなど、将来の構成も考慮して設計する
- 複数AZを利用して可用性の高いシステムを構築する
- サブネットは大きいサブネットを使い、パブリック/プライベートサブネットへのリソースの配置をインターネットアクセスの可否から検討する
- セキュリティーグループを使って、リソース間のトラフィックを適切に制御する
- 実装や運用を補助するツールも有効活用し、VPC Flow Logsを使ってモニタリングできるようにする

### VPCの分割

VPCを分割するケースとして考えられる例は以下の通り

- アプリケーション毎にVPCを作る
- 監査の際に区分しやすいようにスコープとして分割
- リスクレベルによって分割する
- 本番/検証/開発とフェーズごとに分割
- 部署や共通サービスごとに分割

## 通信プロトコルとOSI参照モデル

ネットワークにおける通信にはプロトコルと呼ばれる規格がある(ex.TCP/IP)。
例えばメールなら送信と受信とでSMTPとPOPとそれぞれプロトコルがある。
このプロトコルが通信においてどの層の規格なのかを表した1つのモデルがOSI参照モデル。

### アプリケーション層

WEBアプリケーションなどの通信サービスの通信方式のプロトコルはここ。
メールなら前述の通りSMTP/POP、WEBならHTTP/HTTPSなど。

### プレゼンテーション層

文字の送受信、文字コード、暗号についてのプロトコルはここ。
文字コード・圧縮・データ暗号及び復号……と文字の通信に関わる規定を作っている。

### セッション層

アプリケーション間での一連の継続的な通信処理の継続やつながり(これらをセッションと呼ぶ)の仕方に関するプロトコルはここ。
セッションの確立・維持・終了までの手順を規定する。

### トランスポート層

通信をする際に通信先との通信を許可するか否かチェックが入る。
この処理のことを信頼の確立といい、セッション開始前にそれを行うことやバケットの到着順序やその確認を行うためのプロトコルがここ。
セッション開始のための論理的回線の確立し、セッションを開始するためにポート番号の割り当てを規定する。

### ネットワーク層

IPアドレスを利用したルーティング方法のプロトコルはここ。
ノード(通信の起点や終点(エンドポイント))間の通信を規定し、IPアドレスを利用した割り当てやルーターから宛先の端末への最適なパスの選択を行っている

### データリンク層

MACアドレス(NICの識別番号)を利用したノート間の通信の方法のプロトコルはここ。
1つのネットワーク回線上で直接接続されたノード同士の通信を規定している。
例えばLANは同じネットワークセグメント(ネットワークのグループのようなもの)内におけるノード間の通信をEthernetを使ってMACアドレスを利用し実施している。

### 物理層

bitによるコンピュータ間の物理的なデータ伝送形式に関わるプロトコルはここ。
0と1のビット列を電気信号に変換することでネットワークへ伝送したりしているらしい。

## TCP/IPモデル

OSI参照モデルをさらに実務的にまとめたモデル。
以下の4層へと圧縮される。

- アプリケーション～セッション層 → アプリケーション層(HTTP、SSH、DNS、SMTP、POP、FTP……etc)
- トランスポート層(TCP、UDP)
- ネットワーク層(IP、ICMP、ARP、BGP)
- 物理層(Ethernet、PPP)

さてここで通信の処理フローの1例を見てみる。

1. アプリケーション層においてHTTPプロトコルを利用して、メッセージが送信される。
2. トランスポート層において信頼の確立が行われる
3. ネットワーク層において送信先にパケットが送付される
4. 物理層にて相手側に電信の形で一連の処理が伝送される

このような処理フローのことをRequestと呼んだりする。

## ポート番号

通信の出入口、部屋番号とか郵便ボックスみたいなもの。
OSにおけるデータ通信のためのエンドポイント。
インターネット上の通信プロトコルで、同じコンピュータ内で動作する複数のソフトウェアのどれが通信するかを指定するための番号である。
例えば

- HTTPポート(80)
- HTTPSポート(443)
- SSHポート(22)
- SMTPポート(25)
- POPポート(110,143)

などがある。

## セキュリティグループとネットワークACL

AWSにおいてインスタンスへのトラフィックのアクセス可否(つまり、どの通信方式でどのIPアドレスを許可するのかなど)のルールを設定する機能。
いわゆるファイアウォール的な機能になる。
対してネットワークACLはサブネットへのトラフィック制御、つまり仮想ネットワーク自体へのトラフィックを設定する機能になる。
両者の違いとしては

- サーバー単位(セキュリティグループ)かVPCまたはサブネット単位か(ACL)
- ステートフル(セキュリティグループ)かステートレスか(ACL)
- 許可のみの設定(セキュリティグループ)か拒否も設定できるか(ACL)
- デフォルトの場合、同じセキュリティグループ内通信のみの許可(セキュリティグループ)かすべての通信を許可するか(ACL)
- すべてのルールを適用する(セキュリティグループ)か番号の順序通りに適用するか(ACL)

といったもの。
ステートフルとステートレスはこの場合は前者がインバウンド(通信の入口側)ルールだけ設定すれば自動的にアウトバウンドも許可されるが、後者の場合はインバウンドだけ許可しただけではアウトバウンドは許可されないという違いになる。


### コンソールで確認してみる

ここまでの一連の流れを実際にVPC等々を作りながら確認してみる。

![2021-04-24_18h46_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/1baddaa4-d0cb-801d-075a-106d49a1e395.png)

まずVPCウィザードからパブリックとプライベートのそれぞれのサブネットを持つVPCを作成する。
設定は上記の通り。
パブリックでもプライベートでもAZは必ず指定することに注意。(リージョンによって選択できるAZは当然変わる)
また、パブリックサブネットを作るという意味合い(プライベートサブネットにNATゲートウェイ経由でインターネットゲートウェイと接続させる)から考えて、パブリックサブネットを作る場合はプライベートサブネットも同じAZに作るのがベター。
そして、サブネットは作っただけではプライベートのままなのでルートテーブルを設定することでパブリックサブネットへと変化させる。
ルートテーブルの役割はその名の通りルーティングなので、インターネットゲートウェイに対し当該IPアドレスの場所を示すことでインターネットゲートウェイからのパケットの通路を作ってやれる。(上記の設定の場合は10.0.0/24への経路ということになる)
VPCを作ると以下のようになる。

![2021-04-24_19h08_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a4a8e199-8d32-44c7-4f9f-7ec8cf5f4c3f.png)

![2021-04-24_19h09_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/c35358ac-05ea-c5c1-ecc2-a91d8ff20b70.png)

![2021-04-24_19h09_20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/b4582519-4bd6-890d-f81e-73a83b2a1f2c.png)

インターネットゲートウェイも先程作ったVPCに関連付けられたものが新たに作られているのがわかる。

![2021-04-24_19h09_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/aa914dfb-ad49-0824-99d5-1e297adafb3b.png)

次はサブネットを新たにもう一つ作る。
V先程作ったVPCを選択して任意の設定を行っていく。
CIDRブロックは先程までの過程ですでに使用しているものと被らないように注意(10.0.1.0まで使っているので10.0.2.0にするなどする)。
AZも先程とは違うAZを指定して作成する。

![2021-04-24_19h12_28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/5e9af168-8e96-67e8-06ea-e7100ba0f9ae.png)


さて、これで現状を整理すると10.0.0.0/16のVPCの中にAZが2つある状態が出来上がり仮にAZa、AZcとすると

AZa → 10.0.0.0/24サブネット(パブリック)、10.0.1.0/24サブネット(プライベート)
AZc → 10.0.2.0/24サブネット(プライベート)

というVPC構成が出来上がっていることになる。
ただし、10.0.2.0/24サブネットのルートテーブルを確認してみると以下の通りルーティングがNATゲートウェイに通ってしまっていることがわかる。

![2021-04-24_19h15_23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/1039b701-ba06-91f8-ad59-7c6528a83b27.png)

ここからサブネット自体はプライベートであり、デフォルトだとインターネットゲートウェイにはルーティングが通っていないということが確認できる。
なので、関連付けを編集してインターネットゲートウェイへ通してやる。
ルートテーブルIDを10.0.0.0/24サブネットのものと同じもので指定すると以下の通り切り替わってくれる

![2021-04-24_19h16_02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/805314f8-7842-6b86-3083-e9fbdeb575fc.png)

一応10.0.0.0/24サブネットのルートテーブルの詳細情報も確認してみる。

![2021-04-24_19h16_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/919e7c9f-469b-8fad-f935-df2ffe9e37d0.png)

これで10.0.0.0/24サブネットと10.0.2.0/24サブネットで同じルーティングができたことが確認できた。
さて今度はプライベートなサブネットを新たに作ってみる。
ここでパブリック・プライベートサブネット及びNATゲートウェイを使った通信フローを整理してみる。

1. Webからのアクセスがインターネットゲートウェイを通してやってくる
2. パブリックサブネットへパスされる、パブリックサブネットへのアクセスならここでResponseを返す
3. プライベートサブネットへのアクセスであるならパブリックからパスされ、Responseが返す
4. Responseは**パブリックサブネット内**のNATゲートウェイへパスされる
5. NATゲートウェイからインターネットゲートウェイへパス
6. WebへResponseが到着する

つまりNATゲートウェイはプライベートサブネット下にあるインスタンスに対して、更新処理等のRequestが外部のネットワークから行われたという場合に、外部ネットワークから直接プライベート下のインスタンスへアクセスさせないようにパブリックサブネットへ迂回させつつ、トラフィック(Response)を返すためのゲートウェイであることがわかる。
ここまで確認した上で新しくサブネットを作る。
現状は

AZa → 10.0.0.0/24サブネット(パブリック)、10.0.1.0/24サブネット(プライベート)
AZc → 10.0.2.0/24サブネット(パブリック)

という構成なのでこれを

AZa → 10.0.0.0/24サブネット(パブリック)、10.0.1.0/24サブネット(プライベート)
AZc → 10.0.2.0/24サブネット(プライベート)、10.0.3.0/24サブネット(プライベート)

という構成にする。
サブネットの作り方は省略して、サブネットを作成したら以下のようにNATゲートウェイを作成する。
このときサブネットの指定に注意、必ず同じAZ内のパブリックサブネットを指定する。
ElasticIPはVPCを作る際に作ったものでOK。

![2021-04-24_19h59_53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/5ba1a5ae-f09d-973c-a390-895728277fb5.png)

さて、作ったサブネットのルーティングを確認してみる。
一見問題なさそうに見える。
![2021-04-24_20h00_30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a6652236-5e5e-fe1e-0199-5e08b49048aa.png)

ところがルートテーブルIDをクリックして以下の画面を見るとステータスがblackhole(存在しないルーティング)になってしまっている。
![2021-04-24_20h01_59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/690eb6f3-da67-98cf-c3e4-f829a99fef35.png)

NATゲートウェイは実は最初ウィザードで作ったときに自動的に1つ出来上がっていて、以降サブネットを作ると自動的にそれが割り当てられてしまうという仕様になっている。
で、問題はNATゲートウェイは課金対象なので無闇に放置をしておくと要らぬコストになってしまうので適宜削除する必要があるが、そうすると今回のようにサブネット作ったはいいもののNATゲートウェイが通ってない……というトラブルにあたってしまうことがある。
なので、その場合はルートの編集でblackholeなルーティングを削除して、先程作ったNATゲートウェイへのルーティングを行ってやればいい。

![2021-04-24_20h03_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/e527fd7e-61a2-6fb6-d4c9-e3fd5534e23f.png)

これで作ったサブネットに同じく新しく作ったNATゲートウェイを設定することができた。

### ここまでの注意ポイント

ここまでのフローでの気をつけておきたい課金対象は

- Elastic ID
- NATゲートウェイ

の2点なので必要なければ削除をしておく。

## ネットワークACLの設定

![2021-04-24_22h43_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/400831ee-44c2-efbd-48fe-1e520e781142.png)
![2021-04-24_22h43_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/860fe609-ae9e-19af-ad98-6c48d809f297.png)
![2021-04-24_22h44_10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/ebaef74f-c2b2-8f1d-0742-e3727450c9fb.png)

ここまでがVPCを作ったときに自動的に作成されたネットワークACLになる。
現状だとすべてのプロトコル及びすべてのトラフィックが許可されている状態なので、これを変更していく。

まずは新しくネットワークACLを作成する。
![2021-04-24_22h45_11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/800c4f16-d664-0fc8-f6dd-e0e0c6542543.png)

作成したネットワークACLを確認してみる。
インもアウトも両方ともすべての通信が許可されていないのがわかる。
![2021-04-24_22h50_15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/cf8b68ba-d122-355f-a4bc-de5fd4a11f77.png)
![2021-04-24_22h50_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/b42b0105-2e6f-6e3a-90b6-2c77321f07fe.png)

よってそれぞれルールを作っていく。
ルール番号の順に適用される優先順位が決まるのでそれを意識して作る。
作り方はセキュリティルールと同じだが、下記のようにインとアウトそれぞれ設定することが必要である。
![2021-04-24_22h55_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/d95613e3-c0e7-e3e3-d598-92e50e49885a.png)
![2021-04-24_22h55_24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/3e3bc2b8-ed84-d463-c0cf-5a03e5c81efa.png)

ルールを作ったらあとは適用するだけ。
適用したいサブネットを選択するだけでいい。
![2021-04-24_22h55_44.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/54b8d627-825f-1f4f-d939-9ca6b6f563d4.png)

すると以下のような状態になり、新しく作ったACLの方へデフォルトのACLからサブネットの関連付けが移行されたのがわかる。
![2021-04-24_22h56_33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/24858d25-0897-62bc-25b7-7667a32ae8cf.png)

しかし、このままだと実際に使うときにエラーになる場合があるので以下のようにカスタムTCPでポート番号を広く拾うように設定してやる必要があるらしい。
![2021-04-24_22h57_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/b5716792-f5b1-cec4-3c25-6d0df82620c9.png)
![2021-04-24_22h59_12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/e58972e2-1d3e-caa6-25e7-0029ab95129d.png)


## NATゲートウェイを使った通信をEC2インスタンスを用いて確認してみる

いよいよ実際のリソースと通信できるかの確認に入る。
まずはインスタンスを2つ作る。
細かいところは省略して注意するところは

- ネットワークは作成したVPCを選択する
- 同じくサブネットも作成したパブリックサブネットを選択する
- 同様に2つ目のインスタンスも作る、ただしサブネットは作成したプライベートサブネットを選択し、自動割当パブリックIPは無効にする(パブリックサブネットじゃないから)
- セキュリティグループはどちらのインスタンスも同じものを適用する

以下は設定例。
![2021-04-24_23h56_04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/07a5d226-427a-c6ed-16e4-6926f6948731.png)
![2021-04-24_23h59_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/9119bb83-3677-aa42-4b9a-ee675e35e531.png)

インスタンスを作成したらTerminal等でアクセスを試みる。
無事、インスタンスへアクセスできたらまず、インスタンスをアップグレードする。
以下は実行コマンド、`sudo su`で管理者権限へ切り替えてから実行している。
![2021-04-25_00h20_41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/9c5e2566-2789-7949-5961-2ea3a2a098cd.png)

実行できたら下記のようにComplete！ と表示される。
これでパブリックサブネットへのアクセスが通っていてかつリクエストを行って、レスポンスも返ってきていることがわかった。
次に、プライベートサブネットへアクセスを試みる。
その前にまずキーペアをリソース内へ作る必要があるので`nano ファイル名`コマンドで作成する。
コマンドを実行するとエディタが開くので、既存のキーペア(今のインスタンスへアクセスする際に使っているもの)の中身をコピペしてCtrl+Xでエディタを終了しようとすると保存するか聞かれるのでYesと入力してEnterで完了。
あとは作ったキーペアへの権限を`chmod`コマンドで与えてやる。
今回は`chmod 400`なので対象のファイルへの読み取り権限を与えている。
![2021-04-25_00h24_34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/0a0a58f7-b906-0ea2-d4e0-191ace7da6ec.png)

ここまでいったらあとはsshコマンドでプライベートサブネットへアクセスする。
先ほどと違って`ssh ec2-user@プライベートサブネットのIPv4アドレス -i 先程作ったキーペア`でアクセスできる。
下記は`-i`なしでもコマンドを打っている。
どちらにしろ信頼の確立がてきないという旨のエラーメッセージが出て、このまま進めるかどうか聞かれる。
おそらく、`-i`なしではYesを選択しても下記のようなエラーになるのだろう。
なので、`-i`を使ってちゃんとキーペアを指定してやった上でyesを入力するとプライベートサブネットへアクセスができる。

![2021-04-25_00h26_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/c743ac25-0740-d935-3d2c-f6939684c257.png)


しかしパブリックと同じようにインスタンスの更新を行おうとすると下記のようにエラーになってしまう。
![2021-04-25_00h51_31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/44ce4104-0569-2f76-6ddb-cf8eadfb4a8b.png)

理由は簡単で、都度触れてきたようにプライベートサブネット内へのアクセスやRequestのフローはパブリックを介して行えるが、ResponseのフローはNATゲートウェイがないとできないのでRequestをしてもResponseを返せないので正常にインスタンスの更新が行えずエラーが出てしまうという次第である。
なので、NATゲートウェイを作ってやる必要があるので以下のように作成する。
パブリックサブネットに作らないと意味がないので注意。
![2021-04-25_00h44_13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/b7ad9d09-082b-6b2e-d28e-de37f9e2b135.png)
![2021-04-25_00h44_39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a38103f6-a79c-fceb-08b3-4dde9e0ae9ff.png)

あとは作ったNATゲートウェイをサブネットへ適用する。
当該パブリックサブネットは以下のようになっている(さっきNATゲートウェイは削除してあるので)ので、ルートの編集から適用してやればOK。
![2021-04-25_00h46_21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/a80d0f3e-aa4a-fa5c-d94f-8870bf508bc1.png)

NATゲートウェイの適用が終わったら再度コマンドを実行する。
問題なければ下記のようにインスタンスの更新が完了するはず。
![2021-04-25_00h51_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/ca5b0e98-d8aa-1d0e-12bf-caeca37a6e9f.png)

## Direct Connectとは

同一アカウントに所属する別リージョンの同士の接続でも使われるが、実態はAWS環境とオンプレ環境(自社サーバー等自社で物理リソース等用意して構築している環境)とをAWS Direct Connect のパートナーまたはネットワークプロバイダーと契約することで連携し、接続する際の仲立ちをしているのがDirect Connect。
競合するというか比較される仕組みとしてはVPN(Virtual Private Network)というものがある。
VPNは簡単に言うとプライベートネットワークを拡張するもので、大学生なんかだと例えば学外から学内サーバーのコンテンツを利用する(オンライン授業とか履修登録……etc)というときにこれを使わされたという人がいると思う。
VPNとDirect Connectの違いは

- ベストエフォートなのでコストが安価か(VPN)かキャリアで契約する必要があり割高(DC)
- クラウド上での接続であるので即時利用可能である(VPN)か物理対応が必要なので利用までに1ヶ月強かかるか(DC)
- 暗号化のオーバーヘッドにより帯域幅に制限がある(VPN)かポートあたり1/10Gbsと広く使えるか(DC)
- ネットワークの状態によって品質に影響がある(VPN)か通信キャリアによってある程度品質が保証されているか(DC)
- インターネットベースなので自社由来以外の障害の特定が難しい(VPN)か物理ベースなので障害の特定が比較的容易か(DC)

というものになる。

## VPCエンドポイント

グローバルIPを持つAWSサービスに対して、VPC内から直接アクエスするための窓口(出口)。
つまり、VPC外にあるAWSリソース等にアクセスするにはこれを設定しないといけない。
このエンドポイントの接続方法は2種類ある。

### Gateway型

- サブネットに特殊なルーティングを設定することでVPC外のサービスへと直接接続する
- エンドポイントポリシーを設定してアクセス制御を行う
- 無料
- 冗長性はAWS側が対応
- これを利用して接続するサービスはS3かDynamoDBのみ

### PrivateLink型

- サブネットにエンドポイント用のプライベートIPアドレスを設定し、DNSに名前解決させてルーティングさせる
- セキュリティグループを作成してアクセス制御を行う
- 有料
- 冗長性はマルチAZ設計

## VPC Flow Logs

ネットワークトラフィックを取得して、CloudWatchでモニタリングできるようにする機能。
取得できるものは以下の通り。

- ネットワークインターフェースを送信元/送信先とするトラフィック
- セキュリティグループ及びネットワークACLのルールで許可/拒否されたトラフィックログ
- RDS、Redshift、ElasticCache、WorkSpacesのネットワークインターフェーストラフィック

利用に追加料金はかからず、キャプチャウィンドウと呼ばれる時間枠(10分程度の枠)で収集・プロセッシング・保存を行う。

## VPC Peering

異なる2つのVPC間で通信をしたい(連携させたい)場合にこれを使うことでトラフィックルーティングが可能になる。
特徴としては

- 異なるAWSアカウント間のVPC間を接続できる
- 一部リージョン(中国等)を除いて異なるリージョンに存在するVPC間の接続もできる
- 単一障害点・帯域幅のボトルネックは存在しない
- 接続は1対ずつになる(3つのVPCを接続するにはAB、BC、CAと3つのVPC Peeringを設定しないといけない)
- 上記の点からあまり多くのVPC間を繋げることは不得手

という点が挙げられる。
似たようなサービスとしてはTransit Gatewayがあるがこちらはより複数のVPC間接続で利用される。

### ここまでをハンズオンで確認

まずはエンドポイントで通信するということを確認する。
そのためにはS3へのIAMロールを付与しないといけないのでいつか作ったものをプライベートインスタンスの方へ適用していく。
![2021-04-25_03h03_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/27128f56-6e33-19b2-3b40-088ff7472b36.png)
![2021-04-25_03h03_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/46cb253b-9c95-e2c4-d024-51fd017ce2c7.png)

で、Terminal等でインスタンスへアクセスし、プライベートインスタンスの管理者権限へ入って試しにログ取得のコマンドを打つ。
すると下記のようにフリーズする。
これはNATゲートウェイがないためである。
VPCエンドポイントがない以上外からのアクセスはすべてNATゲートウェイがないとプライベートインスタンスにおいては正常に処理されないことは度々見てきた通り。
なので、VPCエンドポイントを作る。
![2021-04-25_03h06_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/921cd128-ef23-a719-6ef6-45b5a2a06c47.png)

ポイントは以下の点。

- どこに対するエンドポイントなのか
- サービスであるならどのサービスに対するエンドポイントなのか
- Gateway型(S3かDynamoDB)かInterface型なのか
- どのVPCのどのサブネットに作成するのか
- Gateway型の場合はポリシーはどうするのか（Interface型はセキュリティグループでアクセス制御)

以下は設定例。

![2021-04-25_03h07_42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/2f9fe0cb-5cb5-990b-e53a-4f0e60e88b6c.png)
![2021-04-25_03h09_36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/22f159bf-fddb-a551-6d3c-f045653db9dd.png)
![2021-04-25_03h09_55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/d183f7d2-cb46-9242-2e76-fdec1b7469f2.png)


エンドポイントを作成したら再度コマンドを実行する。
このとき、`--region リージョン名`とコマンドの後ろに付け加えて実行リージョンを指定しないといけない。
問題なければ以下のようにフリーズしない(S3の証跡を作ってあればログがでる)
![2021-04-25_03h11_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/3786fe7b-4436-0db3-0c9d-3fa9e7d8bcbd.png)

次にVPC Peeringを見る。
これは簡単で接続したいVPCを選択して、それぞれのVPCで承諾を行えばいい。
別アカウントのVPCと接続するなどの場合は、そちらのVPCでの承諾が行われない限り接続が完了しないので注意。
以下は例。
![2021-04-25_03h14_00.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/7aef23b5-6832-6967-c8b1-c371ffcb19d7.png)
![2021-04-25_03h14_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/94a5c31b-1b52-d86b-29cc-54775205347d.png)
![2021-04-25_03h16_08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/d5b93e04-b2cc-bf70-a904-f38520811e6a.png)

次にTransit Gateway。
Transit Gatewayは1対以上の複数のVPCを接続したい時に使える。
ただし、課金対象なので必要ない場合は削除をしないといけない(以下で作成したものすべて)
まずGatewayを作る。
![2021-04-25_03h20_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/844505f2-7197-454f-768f-f48779956c0c.png)

次に作ったGatewayに関連付けたいVPCごとにAttachmentを設定する。
以下は例。
![2021-04-25_03h23_35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/9f5aa770-5962-2314-43c4-b5d7f6f62771.png)
![2021-04-25_03h23_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/c1a3309f-953e-c045-5ba0-b864d3ea5550.png)
![2021-04-25_03h23_56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/c93edad9-d917-f05c-aea3-8a49031d3c24.png)
![2021-04-25_03h24_25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/3d731568-0c95-5c19-7d5f-6d3af557cb77.png)
![2021-04-25_03h25_03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/27576806-9c90-083f-1b26-7f66c3b624ef.png)

アタッチするとこうなるので暫く待つ。
![2021-04-25_03h25_18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/7a8bc87c-be6c-e34a-c0bd-1dd4ba4da0e0.png)
無事完了すると以下のようにステータスが変わる。
![2021-04-25_03h26_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/14d91763-b3d1-53ae-7baa-1b6a8885e1eb.png)
Transit Gatewayにもルートテーブルが存在する。
特に作らなくてもTransit Gatewayを作成して、VPCをアタッチすると自動的に1つはデフォルトとして作成される。
![2021-04-25_03h25_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/428779/f1f38503-d121-41dc-b60d-1c4ecf517f88.png)

## その他メモ

Egress Only インターネットゲートウェイ(IPv6専用のインターネットゲートウェイ)
キャリアゲートウェイ(Wavelengthゾーンと呼ばれる5Gをつかったサービスで用いるAZのようなものとの連携するためのゲートウェイ)

DHCPオプションセット(TCP/IPネットワークのホストに設定情報を渡すもの)

Elastic IPアドレス(インスタンスに付与されるIPアドレスは動的なものであり、再起動等で変動してしまう。そこで、代わりにこれを付与することで固定的なIPアドレスを実現する。実行中インスタンスに紐つけてないと課金対象になるので不要であるなら削除する)

マネージドプレフィックスリスト(IPアドレスの範囲をリストとして設定できる)

エンドポイント(リージョンの外のサービスとの窓口)

エンドポイントのサービス(エンドポイントを使って、他のAWSアカウントから当該AWSアカウントへ接続する場合の窓口)

Reachability Analyzer(サービス間の通信が可能かどうか分析してくれる)

Transit Gateway(複数VPCを使用している際に、それを関連付けて管理するための機能)

ミラーリング(VPC間の異常な接続などトラブルシューティングの際に異常の特定をするために使える機能)