【AWS】VPC（Virtual Private Cloud）とネットワーク図の考察

### VPCの主な構成要素

**1. サブネット**

・VPCネットワークをさらに分割したやつ、ホスト部の間借りをしたもの

・パブリックサブネット：インターネットと直接通信するサブネットである。Webサーバーなど外部公開するリソースを配置する。

・プライベートサブネット：インターネットと直接通信しないサブネットで、DBサーバーなど内部で使用するリソースを配置する。

**2.ゲートウェイ**
・VPC内のリソースがインターネットと通信するための出入り口である。これをVPCに接続することで、パブリックサブネット内のリソースがインターネットにアクセスできる。

**3.ルートテーブル（AWSのルートテーブルはちょっと特殊なので参考文献を参照してください。）**
・ネットワーク内のトラフィックの行き先を決定するための設定である。どのサブネットやゲートウェイにパケットを送るかをここて定義する。

**4.セキュリティグループとネットワークACL**
・セキュリティグループ：特定のリソース（例：EC2インスタンス）に対するファイアーウォールの役割を果たし、どのIPアドレスやポートからのアクセスを許可するかを設定する。

・ネットワークACL(アクセスコントロールリスト):サブネット単位でパケット制御をし、セキュリティグループよりも広範囲なアクセス制御が可能。

**5.NATゲートウェイ**
・プライベートサブネット内のリソースがインターネットにアクセスする際使用する。内部から外部への通信は許可されるが、外部から内部への直接的なアクセスはブロックされる。（原則exgress通信はOK,ingress通信はNGだよというお話。）

### 具体例を用いてネットワーク図の考察をしてみる（参考文献2より）
![AWS-VPC-Components.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3575047/693520fd-3001-466b-b4dd-9fa11a5bccc6.png)
---
・VPC:10.0.0.0/16 (us-east-1リージョンに存在している。)

・サブネット
パブリックサブネット　10.0.0.0/24
プライベートサブネット 10.0.1.0/24 (us-east-1b)
→別リージョンにおいている。（CAP定理の観点から

https://zenn.dev/take_tech/articles/daceaad562febe

・ゲートウェイ
インターネットゲートウェイ（パブリックサブネットのインターネット接続用）
NATゲートウェイ（プライベートサブネットのインターネット通信用）
VPNゲートウェイ（オンプレミスとの接続用）

・エンドポイント
S3エンドポイント（プライベートサブネットのインスタンスがS3と直接通信可能）

・外部サービス
Amazon DynamoDB
S3
オンプレミス（この場合VPN経由でデータセンターに接続している。）

### 復習がてら
VPCとサブネットの関係である。

**VPC(10.0.0.0/16)**
・10.0.0.0～10.0.255.255までのアドレスをカバーしている。（ホスト部を間借りしているので、変化するのはホスト部の下位16bitのみ）

・つまり、10.0.x.xの範囲すべてのIPがこのVPCに含まれる。

**サブネット**
10.0.0.0/24（パブリックサブネット） → 10.0.0.0 ～ 10.0.0.255
10.0.1.0/24（プライベートサブネット） → 10.0.1.0 ～ 10.0.1.255
→どちらも 10.0.0.0/16 の範囲内に含まれる！

**サブネット間の通信**
VPC内では、デフォルトですべてのサブネット間の通信が許可されている。
そのため、特別にルーティング設定をしなくても通信はできる。

もし通信を制限したい場合
→セキュリティグループやネットワークACLで制限を掛ける。
→パブリックサブネットからプライベートサブネットへのSSH接続を禁止にするなどの設定が可能となる。

### やったほうがいいセキュリティ設定の一例とその理由
**パブリックサブネットからプライベートサブネットへのSSH接続の禁止**

**理由**：セキュリティの向上
プライベートサブネットにあるEC2は外部から直接アクセスできないようにするのが基本である。（公式でもこれがベストプラクティスだとされている。）
パブリックサブネットが乗っ取られたら、公開してはいけないDBの中身とかを覗けるようになってしまうので必要な設定ですね。

**インバウンドトラフィックの制限**
**理由**：不要な通信をブロックするため。
セキュリティグループを設計するときも最小権限の原則的思想を忘れずに！
| 対象 | 許可するポート | 許可する送信元 | 説明 |
|:-:|:-:|:-:|:-:|
|Webサーバー（公開用）|443(HTTPS)|0.0.0.0/0|誰でも接続していいよー、インターネット公開|
|Webサーバー（公開用）|22|コンソールに繋いでいる制御用のPCのIPアドレス|管理者だけ|
|アプリケーションサーバー(非公開)|8080など|Webサーバー自体のIPアドレス|Webサーバーからのみ通信可能にし、web3層構造を実現する。|
|DB(非公開)|3306(MySQLの標準ポート番号)|アプリケーションサーバー自体のIPアドレス|アプリケーションサーバーからのみ通信可能|

:::note info
内部ネットワークに管理者PCがある場合である。
セキュリティグループ定義の際に、管理者PCのプライベートIPアドレスを登録する。
:::

**NATゲートウェイの制限**
**理由**：不要な外部アクセスを防ぐ
プライベートサブネットのEC2は、NATゲートウェイ経由でインターネットにアクセスできる。
ただし、すべての外部に対する通信を許可するのはリスキーである。特定のAPIエンドポイントのみに設定などが適切である。


**IAMロールの最小権限設定**

:::note alert
ダメな例です。すべてのユーザーがすべてのリソースに対してすべての操作が可能
:::

```
{
  "Effect": "Allow",
  "Action": "*",
  "Resource": "*"
}
```
:::note info
いい例です。特定のs3に対してのみ読み書きできるようになっています。
:::
```
{
  "Effect": "Allow",
  "Action": [
    "s3:GetObject",
    "s3:PutObject"
  ],
  "Resource": "arn:aws:s3:::my-secure-bucket/*"
}
```

**VPCフローログの有効化**
**理由**：ネットワークの可視化＆セキュリティ監査
VPCフローログを有効化すると、どのIPアドレスがどこに通信しているかをCloudWatch LogsやS3に記録できる。



### 参考文献（いずれも参照日2025年2月12日）↓わかりやすいです。
**参考文献1**

https://milestone-of-se.nesuke.com/sv-advanced/aws/vpc-architect/

**参考文献2**

https://jayendrapatil.com/wp-content/uploads/2016/03/AWS-VPC-Components.png