AWS VPCハンズオン - セキュアなネットワーク環境構築ガイド

## 構築する環境の全体像
今回構築するのは、東京リージョンに1つのVPCを作成し、その中に4つのサブネット（パブリック2つ、プライベート2つ）を配置する構成です。可用性を高めるために、サブネットは2つの異なるアベイラビリティゾーン（AZ-AとAZ-C）に分散させます。

VPCのCIDRブロックは10.0.0.0/16とし、この広大なアドレス空間から以下のサブネットを切り出します：

- パブリックサブネット（AZ-A）: 10.0.1.0/24
- パブリックサブネット（AZ-C）: 10.0.2.0/24
- プライベートサブネット（AZ-A）: 10.0.11.0/24
- プライベートサブネット（AZ-C）: 10.0.12.0/24

パブリックサブネットはインターネットゲートウェイを経由してインターネットと通信できるようにし、プライベートサブネットはVPC内部のみで通信可能な設計にします。これにより、公開すべきサービスと内部でのみ使用するリソースを適切に分離できます。

## VPCの作成
**VPC（Virtual Private Cloud）** は、AWS上に構築する独自のプライベートネットワーク空間です。VPCを作成することで、クラウド内に論理的に分離された自分だけのネットワーク環境を構築できます。今回は、東京リージョンに10.0.0.0/16のCIDRブロックを持つVPCを作成します。

### VPC作成の手順
VPC作成は非常にシンプルです。VPCのダッシュボードから「VPCを作成」ボタンをクリックし、必要な情報を入力するだけです。今回は「VPCのみ」のオプションを選択して、基本的なVPCを作成します。

作成時に設定する主なパラメータは以下の通りです：

- 名前タグ: 「handson」（任意の名前でも構いません）
- IPv4 CIDRブロック: 10.0.0.0/16
- IPv6 CIDRブロック: なし（今回はIPv6は使用しません）

VPCのCIDRブロックは16ビットから28ビットまで設定可能ですが、今回は広めのアドレス空間を確保するために16ビット（65,536個のIPアドレス）を選択しています。本番環境では、将来の拡張性を考慮して余裕を持ったサイジングが重要です。

::: note info
CIDRは、IPアドレスとそのネットワーク部分を指定するプレフィックス長（サブネットマスク）を組み合わせた表記法です。例えば「10.0.0.0/16」という表記では：

- 「10.0.0.0」がネットワークアドレス
- 「/16」がプレフィックス長（ビット数）

プレフィックス長は、IPアドレスの先頭から何ビットがネットワーク部分かを示します。IPv4アドレスは32ビットなので、残りのビット（この例では32-16=16ビット）がホスト部分となります。

なので，`10.0.0.0/16` の指定は `10.0.0.0` - `10.0.255.255` の範囲でIPアドレスを指定できます。
:::

### デフォルトVPCについて
AWSアカウントを作成すると、各リージョンに自動的に「デフォルトVPC」が作成されています。このデフォルトVPCは172.31.0.0/16のCIDRブロックを持ち、EC2インスタンスなどをすぐに起動できるように設定されています。

今回のハンズオンでは、このデフォルトVPCは使用せず、一から新しいVPCを作成して設定していきます。これにより、ネットワーク設計の基本から理解することができます。

### VPC作成時の注意点
VPCを作成する際は、以下の点に注意しましょう：

- 一度設定したCIDRブロックは後から変更できません
- 他のVPCやオンプレミスのネットワークとの接続を計画している場合は、IPアドレスの重複を避ける必要があります
- VPC単体では外部との通信はできません（インターネットゲートウェイなどの追加設定が必要）

VPCの作成が完了したら、VPC一覧画面で新しく作成したVPCが表示されていることを確認します。これで、クラウド内に独自のネットワーク空間が確保できました。次のステップでは、このVPC内にサブネットを作成していきます。

# サブネットの作成
VPCを作成したら、次はその中にサブネットを作成します。サブネットはVPCをさらに小さなネットワークセグメントに分割するもので、リソースの論理的なグループ化やセキュリティ設計の基盤となります。今回は、パブリックサブネットとプライベートサブネットを各アベイラビリティゾーンに作成し、可用性と分離性を確保します。

### サブネットの基本概念
サブネットを作成する際に理解しておくべき重要なポイントがいくつかあります：

- サブネットは単一のアベイラビリティゾーン内に存在し、複数のアベイラビリティゾーンにまたがることはできません
- サブネットのCIDRブロックはVPCのCIDRブロックのサブセット（より小さな範囲）である必要があります
- サブネットのネットマスクは16ビットから28ビットの間で設定可能です

### 4つのサブネットの作成
今回のハンズオンでは、以下の4つのサブネットを作成します：

1. Public subnet - a（AZ-A）: `10.0.1.0/24`
1. Public subnet - c（AZ-C）: `10.0.2.0/24`
1. Private subnet - a（AZ-A）: `10.0.11.0/24`
1. Private subnet - c（AZ-C）: `10.0.12.0/24`

サブネットの作成手順は以下の通りです：

1. VPCダッシュボードの左側ペインから「サブネット」を選択します
1. 「サブネット作成」ボタンをクリックします
1. 作成したVPC（handson）を選択します
1. 各サブネットの情報（名前、アベイラビリティゾーン、CIDRブロック）を入力します
1. 「新しいサブネットを追加」ボタンをクリックして、残りのサブネットも同様に設定します
1. すべての情報を入力したら「サブネット作成」ボタンをクリックします

サブネットの命名規則は任意ですが、用途（パブリック/プライベート）とアベイラビリティゾーン（A/C）がわかるような名前を付けることで、管理がしやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558518/b6d8f09d-89c7-4045-861a-33c59164fdf3.png)

### サブネットのアドレス設計について
今回のアドレス設計では、パブリックサブネットには`10.0.1.0/24`と`10.0.2.0/24`を、プライベートサブネットには`10.0.11.0/24`と`10.0.12.0/24`を割り当てています。このように、用途ごとにアドレス範囲を分けることで、ネットワークの管理や問題の切り分けが容易になります。

各サブネットは/24のネットマスク（256個のIPアドレス）を持ちますが、実際に使用できるのは251個です。これは、AWSが各サブネットの先頭3つのIPアドレスと最後のIPアドレスを予約しているためです。



### サブネット作成時の注意点
この時点では、サブネットに「Public」や「Private」という名前を付けていますが、実際にはまだすべてのサブネットが同じ状態（プライベート）です。パブリックサブネットとプライベートサブネットの違いは、後ほど設定するルートテーブルによって決まります。

サブネットの作成が完了したら、サブネット一覧画面で4つのサブネットが正しく作成されていることを確認しましょう。これで、VPC内にネットワークセグメントを作成できました。次のステップでは、インターネットとの接続を確立するためのインターネットゲートウェイを設定します。

# インターネットゲートウェイの作成とアタッチ
VPCとサブネットを作成した後、次はインターネットゲートウェイを設定します。インターネットゲートウェイ（IGW）は、VPCとインターネットの間の通信を可能にするコンポーネントです。これにより、VPC内のリソースがインターネットにアクセスしたり、インターネットからアクセスされたりすることが可能になります。

### インターネットゲートウェイの役割
インターネットゲートウェイは以下の2つの主要な機能を提供します：

VPC内のリソースとインターネット間の通信経路を提供する
パブリックIPアドレスを持つインスタンスに対して、ネットワークアドレス変換（NAT）を行う
インターネットゲートウェイがなければ、VPC内のリソースはインターネットと通信できません。これは、VPCがデフォルトで完全に分離されたプライベートネットワークとして設計されているためです。

### インターネットゲートウェイの作成とアタッチ
インターネットゲートウェイの設定は2段階のプロセスで行います。まず、インターネットゲートウェイを作成し、次にそれをVPCにアタッチします。

1. インターネットゲートウェイの作成
    1. VPCダッシュボードの左側ペインから「インターネットゲートウェイ」を選択します
    1. 「インターネットゲートウェイの作成」ボタンをクリックします
    1. 名前タグに「handson-igw」（または任意の識別しやすい名前）を入力します
    1. 「インターネットゲートウェイの作成」ボタンをクリックします

    この時点では、インターネットゲートウェイは作成されただけで、どのVPCにも関連付けられていません。状態は「デタッチ」と表示されています。
    <br>
2. VPCへのアタッチ
    1. 作成したインターネットゲートウェイを選択します
    1. 「アクション」ドロップダウンから「VPCにアタッチ」を選択します
    1. アタッチするVPC（今回の場合は handson）を選択します
    1. 「アタッチ」ボタンをクリックします

アタッチが完了すると、インターネットゲートウェイの状態が「アタッチ済み」に変わります。これで、VPCとインターネットの間の通信経路が確立されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3558518/0f405f9a-44e1-42e7-a78b-4dff96885c14.png)

### インターネットゲートウェイ設定後の状態
この時点で、以下のコンポーネントが設定されています：

- VPC（10.0.0.0/16）
- 4つのサブネット（パブリック2つ、プライベート2つ）
- インターネットゲートウェイ（VPCにアタッチ済み）

しかし、まだサブネットからインターネットゲートウェイへの経路が設定されていないため、実際にはインターネットとの通信はできません。次のステップでは、ルートテーブルを設定して、パブリックサブネットからインターネットへの経路を確立します。

### 重要なポイント
インターネットゲートウェイを作成・アタッチしただけでは、VPC内のリソースがインターネットと通信できるようにはなりません。ルートテーブルの設定と、インスタンスへのパブリックIPアドレスの割り当ても必要です。これらの設定は次のステップで行います。

また、1つのVPCに対してアタッチできるインターネットゲートウェイは1つだけです。複数のインターネット接続経路が必要な場合は、別の方法（例：Transit Gateway）を検討する必要があります。

# ルートテーブルの設定
ルートテーブルは、VPC内のネットワークトラフィックの経路を決定する重要なコンポーネントです。各サブネットは必ず1つのルートテーブルに関連付けられ、そのルートテーブルの設定によって、サブネット内のトラフィックがどこに向かうかが決まります。今回のハンズオンでは、パブリックサブネットとプライベートサブネット用に異なるルートテーブルを設定します。

### パブリックサブネットとプライベートサブネットの違い
まず、パブリックサブネットとプライベートサブネットの定義を明確にしておきましょう：

- **パブリックサブネット**: ルートテーブルにインターネットゲートウェイへのルートエントリがあり、インターネットとの双方向通信が可能なサブネット
- **プライベートサブネット**: インターネットゲートウェイへのルートエントリがなく、インターネットから直接アクセスできないサブネット

この定義からわかるように、サブネットがパブリックかプライベートかは、そのサブネットに関連付けられたルートテーブルの設定によって決まります。サブネット作成時に「パブリック」や「プライベート」という設定項目はありません。

### デフォルトルートテーブルの状態
VPCを作成すると、自動的に1つのルートテーブル（デフォルトルートテーブル）が作成されます。このデフォルトルートテーブルには、VPC内部の通信を可能にするローカルルートのみが設定されています：

|送信先	|ターゲット|
|-|-|
|10.0.0.0/16|	local|

このルートは、VPC内のすべてのサブネット間の通信を可能にしますが、インターネットへの経路は含まれていません。そのため、現時点ではすべてのサブネットがプライベートサブネットの状態です。

### パブリックルートテーブルの作成
パブリックサブネットを設定するために、インターネットゲートウェイへのルートを持つ新しいルートテーブルを作成します：

1. VPCダッシュボードの左側ペインから「ルートテーブル」を選択します
1. 「ルートテーブルの作成」ボタンをクリックします
1. 名前タグに「パブリックルートテーブル」と入力します
1. VPCに作成したVPC（Handson）を選択します
1. 「ルートテーブルの作成」ボタンをクリックします

作成したルートテーブルを選択し、「ルート」タブで「ルート編集」ボタンをクリックして、インターネットへのルートを追加します：

1. 「ルートを追加」ボタンをクリックします
1. 送信先に「0.0.0.0/0」（すべてのトラフィック）を入力します
1. ターゲットで「インターネットゲートウェイ」を選択し、作成したIGWを指定します
1. 「設定を保存」ボタンをクリックします

これで、パブリックルートテーブルには以下の2つのルートが設定されました：

|送信先|ターゲット|
|-|-|
|10.0.0.0/16|local|
|0.0.0.0/0|	igw-xxxxxxxx|

### デフォルトルートテーブルの名前変更
管理を容易にするために、デフォルトルートテーブルの名前を変更します：

1. ルートテーブル一覧からデフォルトルートテーブル（VPC作成時に自動生成されたもの）を選択します
1. 名前タグの編集アイコンをクリックします
1. 「プライベートルートテーブル」と入力します
1. 「保存」ボタンをクリックします

### サブネットとルートテーブルの関連付け
作成したルートテーブルをそれぞれのサブネットに関連付けます：

#### パブリックサブネットの関連付け
1. パブリックルートテーブルを選択します
1. 「サブネットの関連付け」タブをクリックします
1. 「サブネットの関連付けを編集」ボタンをクリックします
1. パブリックサブネット-AとパブリックサブネットCを選択します
1. 「関連付けを保存」ボタンをクリックします

#### プライベートサブネットの関連付け
1. プライベートルートテーブルを選択します
1. 「サブネットの関連付け」タブをクリックします
1. 「サブネットの関連付けを編集」ボタンをクリックします
1. プライベートサブネット-AとプライベートサブネットCを選択します
1. 「関連付けを保存」ボタンをクリックします

### メインルートテーブルについて
VPCには必ず1つの「メイン」ルートテーブルがあります。明示的にルートテーブルが関連付けられていないサブネットは、自動的にこのメインルートテーブルに関連付けられます。

デフォルトでは、VPC作成時に自動生成されるルートテーブル（今回は「プライベートルートテーブル」と名付けたもの）がメインルートテーブルになっています。これは、新しく作成したサブネットがデフォルトでプライベートサブネットになることを意味します。

セキュリティの観点からは、メインルートテーブルはインターネットへのルートを持たないものにしておくことが望ましいです。これにより、新しく作成したサブネットが意図せずインターネットに公開されることを防ぎます。

### ルーティングの優先順位
ルートテーブルに複数のルートが存在する場合、最も具体的なルート（ネットマスクが大きいルート）が優先されます。これは「最長プレフィックスマッチ」または「ロンゲストマッチ」と呼ばれるルールです。

例えば、パブリックルートテーブルには以下の2つのルートがあります：

- 10.0.0.0/16 → local
- 0.0.0.0/0 → インターネットゲートウェイ

この場合、10.0.0.0/16 内の宛先（例：10.0.10.111）へのトラフィックは、より具体的な最初のルート（local）に従います。一方、VPC外の宛先（例：8.8.8.8）へのトラフィックは、2番目のルート（インターネットゲートウェイ）に従います。

この優先順位のおかげで、VPC内の通信はインターネットを経由せずに直接行われ、VPC外の通信のみがインターネットゲートウェイを経由するようになります。

### ルートテーブル設定のまとめ
ルートテーブルの設定により、以下のネットワーク構成が実現されました：

- パブリックサブネット（10.0.1.0/24, 10.0.2.0/24）

    - VPC内の通信はローカルで行われる
    - インターネットへの通信はインターネットゲートウェイを経由する

- プライベートサブネット（10.0.11.0/24, 10.0.12.0/24）

    - VPC内の通信はローカルで行われる
    - インターネットへの直接の経路はない

これにより、パブリックサブネットに配置したリソースはインターネットと通信できる一方、プライベートサブネットのリソースはVPC内部でのみ通信可能な、セキュアなネットワーク環境が構築されました。

まとめ
このハンズオンでは、AWS VPCを使用してセキュアなネットワーク環境を構築しました。具体的には以下のコンポーネントを設定しました：

VPC（10.0.0.0/16）
4つのサブネット（パブリック2つ、プライベート2つ）を2つのアベイラビリティゾーンに分散
インターネットゲートウェイをVPCにアタッチ
パブリックサブネット用とプライベートサブネット用の2つのルートテーブルを設定
この構成により、以下のようなネットワーク環境が実現されました：

パブリックサブネットに配置したリソースはインターネットと双方向通信が可能
プライベートサブネットに配置したリソースはVPC内部でのみ通信可能
2つのアベイラビリティゾーンを使用することで、可用性が向上
AWS VPCの基本的な設定を理解することで、セキュアで可用性の高いクラウドインフラストラクチャを設計・構築するための基礎が身につきました。実際のシステム構築では、この基本構成をベースに、より複雑なネットワーク設計やセキュリティ対策を追加していくことになります。