NAT ゲートウェイの AZ 障害対策 ── プライベートサブネットから外に出られなくなるのを防ぐ
記事の「実践」を 1 項目ずつ進めるためのページです。AWS マネジメントコンソールで操作したら、右の一覧にチェックを入れてください。チェックはこのブラウザに保存されます。
前提条件
- リージョン:
ap-northeast-1(東京) - VPC・EC2・Systems Manager の操作権限を持つ IAM ユーザーまたはロールでコンソールにログイン済みであること
以下のリソースが作成済みであることを前提とします。プライベートサブネットの EC2 には、Session Manager で接続できる IAM ロールが付いています。
まだ用意していない場合は、「作り方の参考」の記事の手順で作れます。リソース名は、この記事の名前に読み替えてください。
| リソース種別 | リソース名 | 内容 | 作り方の参考 |
|---|---|---|---|
| VPC | nat-ha-vpc | CIDR 10.0.0.0/16 | Amazon VPC で仮想ネットワークを構築しサブネットを設定する ※AZ を 2 つにする |
| パブリックサブネット | nat-ha-public-1a / nat-ha-public-1c | 10.0.1.0/24(1a)/ 10.0.2.0/24(1c)。インターネットゲートウェイ nat-ha-igw へのルートあり | 同上 |
| プライベートサブネット | nat-ha-private-1a / nat-ha-private-1c | 10.0.11.0/24(1a)/ 10.0.12.0/24(1c) | 同上 |
| NAT ゲートウェイ | nat-ha-nat-1a | nat-ha-public-1a に配置。Elastic IP 付き | NAT ゲートウェイでプライベートサブネットからの外部通信を実現する |
| ルートテーブル | nat-ha-private-rt-1a / nat-ha-private-rt-1c | それぞれのプライベートサブネットに関連付け。どちらも 0.0.0.0/0 → nat-ha-nat-1a | VPC のルートテーブルでトラフィックの流れを制御する |
| EC2 インスタンス | nat-ha-app-1a / nat-ha-app-1c | それぞれのプライベートサブネットに 1 台ずつ。パブリック IP なし。Session Manager で接続できる | NAT ゲートウェイでプライベートサブネットからの外部通信を実現する |
このハンズオンで作成するリソースは以下のとおりです。
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| NAT ゲートウェイ(ゾーン) | nat-ha-nat-1c | ap-northeast-1c 用の出口 |
| NAT ゲートウェイ(リージョン) | nat-ha-regional | 両方の AZ をまとめて受け持つ出口 |
> [!WARNING] > NAT ゲートウェイは、作成している間ずっと時間単位で課金されます(リージョン NAT ゲートウェイは、有効になっている AZ ごとに課金されます)。Elastic IP も課金対象です。検証が終わったら必ず削除し、Elastic IP を解放してください。
手順 1: 両方の AZ が同じ NAT ゲートウェイを通っていることを確かめる
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに VPC と入力し、「VPC」を選択します。左側ナビゲーションの「NAT ゲートウェイ」を選択し、nat-ha-nat-1a の「プライマリパブリック IPv4 アドレス」を控えておきます。
左側ナビゲーションの「ルートテーブル」を選択し、検索ボックスに nat-ha-private と入力して絞り込みます。nat-ha-private-rt-1c を選択し、下部の「ルート」タブで 0.0.0.0/0 のターゲットが nat-ha-nat-1a の ID(nat- で始まる)になっていることを確認します。ap-northeast-1c のサブネットなのに、ap-northeast-1a の NAT ゲートウェイを通っている状態です。
上部の検索バーに EC2 と入力し、「EC2」を選択します。「インスタンス」で nat-ha-app-1c を選択し、「接続」をクリックします。「Session Manager」タブで「接続」をクリックし、表示されたターミナルで次のコマンドを実行します。
curl -s https://checkip.amazonaws.com
表示された IP アドレスが、控えておいた nat-ha-nat-1a のパブリック IP アドレスと同じであることを確認します。nat-ha-app-1a でも同じコマンドを実行し、同じ IP アドレスになることを確認します。
手順 2: ap-northeast-1c に NAT ゲートウェイを作る
VPC コンソールの左側ナビゲーションで「NAT ゲートウェイ」を選択し、「NAT ゲートウェイを作成」をクリックします。以下を設定します。
- 名前:
nat-ha-nat-1c - アベイラビリティーモード:
ゾーナル(初期表示は「リージョナル - 新規」なので切り替えます。ゾーナルにすると、サブネット・接続タイプ・Elastic IP の欄が表示されます) - サブネット:
nat-ha-public-1c - 接続タイプ:
パブリック - Elastic IP 割り当て ID: 「Elastic IP を割り当て」をクリックして新しく割り当てる(割り当てた ID が欄に自動で入ります)
その他の項目はデフォルトのままにして、「NAT ゲートウェイを作成」をクリックします。
状態が Available になるまで数分待ちます。nat-ha-nat-1c のパブリック IP アドレスを控えておきます。
手順 3: ap-northeast-1c のルートを同じ AZ の NAT ゲートウェイに向ける
左側ナビゲーションの「ルートテーブル」から nat-ha-private-rt-1c を選択し、「ルート」タブの「ルートを編集」をクリックします。0.0.0.0/0 のターゲットを「NAT ゲートウェイ」に変え、その下の入力欄に nat- と入力して、候補に表示された nat-…(nat-ha-nat-1c) を選択します。「変更を保存」をクリックします。
nat-ha-private-rt-1a は nat-ha-nat-1a に向けたままにします。これで、各 AZ のプライベートサブネットが同じ AZ の NAT ゲートウェイを通るようになりました。
手順 4: 各 AZ のインスタンスが自分の AZ の出口を通ることを確かめる
nat-ha-app-1c の Session Manager で、もう一度次のコマンドを実行します。
curl -s https://checkip.amazonaws.com
表示される IP アドレスが nat-ha-nat-1c のパブリック IP アドレスに変わったことを確認します。nat-ha-app-1a では、引き続き nat-ha-nat-1a の IP アドレスが表示されます。
この状態なら、ap-northeast-1a に障害が起きても、ap-northeast-1c のインスタンスは自分の AZ の NAT ゲートウェイで外へ出られます。
手順 5: リージョン NAT ゲートウェイに切り替える
左側ナビゲーションの「NAT ゲートウェイ」で「NAT ゲートウェイを作成」をクリックし、以下を設定します。
- 名前:
nat-ha-regional - アベイラビリティーモード:
リージョナル - 新規 - VPC:
nat-ha-vpc - Elastic IP (EIP) 割り当て方法:
自動
サブネットを指定する欄はありません。その他の項目はデフォルトのままにして、「NAT ゲートウェイを作成」をクリックします。
状態が Available になったら(今回は 2〜3 分でした)、nat-ha-regional の詳細画面を開きます。アベイラビリティーモードが Regional になっていること、「IP アドレス」タブに、インスタンスのある ap-northeast-1a と ap-northeast-1c のそれぞれに IP アドレスが自動で割り当てられていることを確認します。
続けて、nat-ha-private-rt-1a と nat-ha-private-rt-1c の両方で「ルートを編集」をクリックし、0.0.0.0/0 のターゲットを nat-ha-regional に変えて保存します。2 つの AZ のルートが、同じ 1 つの NAT ゲートウェイ ID を指すようになります。
各インスタンスの Session Manager で curl -s https://checkip.amazonaws.com を実行し、どちらのインスタンスからも外へ出られることを確認します。表示される IP アドレスは、リージョン NAT ゲートウェイがそれぞれの AZ に割り当てた IP アドレスに変わります。ルートが指す NAT ゲートウェイ ID は 1 つでも、出口は AZ ごとに分かれていることが分かります。なお、ワークロードが新しい AZ に増えた場合、その AZ へ広がるまでに最大 60 分かかることがあり、その間は既存の AZ の NAT ゲートウェイが通信を処理します。