EC2にパブリックIPを設定せず、EC2にアクセスする方法 (Windows Server)
1. はじめに
ITアーキテクトを務めています松本と申します。
前回の記事で、SSM フリートマネージャーを用いてEC2(Windows Server)にブラウザからリモートデスクトップでアクセスしました。フリートマネージャーではセキュリティグループのインバウンドルールを許可する必要がないので、比較的安全にEC2にアクセスできます。
しかし、実際の案件ではEC2にパブリックIPを付与することが禁止されている場合があります。例えば、通常のWebサイトの構築では、EC2の前段にALB(Application Load Balancer)を配置し、ALBにパブリックIPを持たせるので、EC2はパブリックIPを持ってないことが多いかと思います。
Sandbox環境であっても、まずはNatGatewayを用いたアーキテクチャが利用できないかを検討するところから始めると、セキュリティ的に良いと思います。
そこで今回は前回構築したアーキテクチャを変更し、NatGatewayを追加します。NatGatewayを用いるとパブリックIPが付与されていないEC2でもインターネットゲートウェイを通じて、インターネットにアクセスすることができます。
2. 構築したAWSアーキテクチャ
今回構築したAWSアーキテクチャは以下の通りになります。
前回との差分だけ説明しますと、プライベートサブネットを1つ追加して、パブリックサブネット上にNatgatewayを追加しています。NatgatewayにアタッチするパブリックIPであるEIP(Elastic IP)も作成します。また、プライベートサブネット上に前回の記事とは別のEC2を作成しております。このEC2にフリートマネージャーを用いてログインできることを確認しましょう。

3. NatGatewayとは
今回の主題となるNatGatewayについて説明します。
NatGatewayは、パブリックIPを持っていないAWSリソースが、インターネットへリクエストを送信できるようにするサービスです。VPC内部からインターネットへはアクセスできますが、インターネットからVPC内部へはアクセスできないです。NatGatewayがインターネットへのアクセスに利用するパブリックIPはEIP(Elastic IP)というAWSサービスで取得したIPになります。EIPはEC2やNatGatewayにアタッチすることができる固定のパブリックIPです。一度取得すると、AWSリソースとして削除するまで、そのパブリックIPを利用することができます。よって、NatGatewayから送信されるリクエストのIPアドレスは、固定化されることになります。
※Regional NAT gatewayという機能がリリースされましたが、本稿は従来のZonal NAT gatewayで構築しています。Regional NAT gatewayについては以下のURLを参照してください。
4. AWSリソースの作成
それでは、マネジメントコンソールからAWSリソースを修正していきましょう。
前回の記事で作成したAWSリソースを利用します。
① EIPの作成
NatGatewayを作成する前に、まずはEIPを作成します。
EIPは有料のサービスですので、課金にはご注意ください。
①-1. VPCの画面を開く
VPC作成時と同様にマネジメントコンソールの上部にあるテキストボックスに「vpc」と入力します。
検索結果に「VPC」があるので、そちらをクリックします。
①-2. 「Elastic IP アドレスを割り振る」ボタンを押下する
サイドメニューから「Elastic IP」をクリックします。
「Elastic IP アドレスを割り振る」ボタンが表示されるので、そちらをクリックします。

①-3. EIPの設定を行う
EIPを作成する画面で、以下のように入力します。
| 項目名 | 設定値 | 説明 |
|---|---|---|
| パブリック IPv4 アドレスプール | Amazon の IPv4 アドレスプール | AWSが保有しているパブリックIPからIPが払い出されます。この設定値を一番よく使うことになるかと思います。他の項目は少し高度な内容になっているため説明は割愛します。 |
| ネットワークボーダーグループ | ap-northeast-1 | 基本的には選択の余地がなく、ap-northeast-1にすることになります。Local Zoneなど特殊なゾーンを利用している場合は設定できますが、高度な内容のため説明は割愛します。 |
| タグ | Name: test-eip | Nameタグを追加し、値をtest-eipにします。 |

入力が完了したら「割り振る」ボタンを押下してください。この時点ではどのVPC・サブネットで利用するのかを設定することはないです。NatGateway作成時にこのEIPを紐づけることになります。
これでEIPを利用できるようになりました。次はプライベートサブネットの作成に移りましょう。
② サブネットの作成
前回の記事と同様の手順でサブネットを作成できますので、作成手順は割愛します。以下の設定で作成します。
| 項目名 | 設定値 | 説明 |
|---|---|---|
| VPC ID | (test-vpcのvpc id) | 前回の記事で作成したVPCのIDを設定します。 |
| サブネット名 | test-subnet-private-a | サブネットの名前タグです。名前タグなので重複した名前もつけられますが、識別しやすいように分けた方がいいです。 |
| アベイラビリティーゾーン | (ap-northeast-1a) | 前回の記事で作成したサブネットと同じAZを選択します。別のAZを選択してもネットワーク設定としては問題なく動作します。ただし、AZ間通信は有料であるため、今回の構成では追加で課金が発生します。 |
| IPv4 VPC CIDR ブロック | 10.0.0.0/16 | 前回の記事で作成したVPCのCIDRを選択します。 |
| IPv4 サブネット CIDR ブロック | 10.0.1.0/24 | サブネットに割り当てるCIDRです。前回の記事では「10.0.0.0/24」を指定して、サブネットを作成しました。サブネット間でCIDRは重複してはいけないので、第3オクテットをずらしています。 |
| タグ | Name: test-subnet-private-a | 名前タグに入力した文字列がそのまま「Name」タグとして入力されています。特に修正する必要はありません。 |
③ NatGatewayの作成
次にNatGatewayの作成に入りましょう。NatGatewayは作成しただけで課金されるサービスで、EC2のように停止させることができません。課金に気をつけながら、不要になったらすぐに削除しましょう。
③-1. VPCの画面を開く
VPC作成時と同様にマネジメントコンソールの上部にあるテキストボックスに「vpc」と入力します。
検索結果に「VPC」があるので、そちらをクリックします。
③-2. 「NAT ゲートウェイを作成」ボタンを押下する
サイドメニューから「NAT ゲートウェイ」をクリックします。
「NAT ゲートウェイを作成」ボタンが表示されるので、そちらをクリックします。
③-3. NatGatwayの設定を行う
NatGatewayを作成する画面で、以下のように入力します。
| 項目名 | 設定値 | 説明 |
|---|---|---|
| 名前 | test-ngw | NatGatewayの名前タグです。 |
| サブネット | (test-subnetのsubnet id) | どのサブネット上にNatGatewayを構築するのかを選択します。今回作成したサブネットではなく、前回の記事で作成したサブネットを選択します。つまり、NatGatwayはパブリックサブネットの上に構築しなければならないことを意識しましょう。 |
| 接続タイプ | パブリック | NatGatewayにはパブリック(インターネットに接続する時に利用する)とプライベート(閉域で利用する)の2種類があります。両方とも通信先から見て、IPアドレスを固定化することができます。ただし、そのIPに対して、相手先からアクセスすることはできません。今回はEC2がSSMにアクセスするためにインターネットに接続したいので、パブリックを選択します。 |
| Elastic IP 割り当て ID | (test-eipのid) | NatGatewayが利用するEIPを設定します。 |

これらを入力して、「NAT ゲートウェイを作成」ボタンを押下すると、NatGatewatが作成されます。
(閑話 その1) NatGatewayのマルチAZ
冗長性を確保するために本番系ではNatGatwayをマルチAZにしなければならないというお話を聞いたことがある方もいらっしゃるかもしれません。しかし、上記の設定画面を見るとサブネットは1つしか選択できません。サブネットは1つのAZ上に構築するAWSリソースなので、NatGatewayは1AZにしかデプロイできないように見えます。実はNatGatewayのマルチAZ化とは、別々のNatGatewayを、それぞれのAZに構築することを意味しています。つまり、2AZを利用しているシステムならNatGatewayを2つ作成し、3AZを利用しているのであれば3つ作成します。ただし、作成しただけではマルチAZ化したことにはなりません。続きは「閑話 その2」でお話しします。
④ ルートテーブルの作成
作成したプライベートサブネット用のルートテーブルを作成します。
前回の記事と同様の手順で作成できるため、詳細は割愛します。
以下の設定でルートテーブルを作成して、今回作成したプライベートサブネットに紐づけてください。
| 項目名 | 設定値 | 説明 |
|---|---|---|
| 名前 | test-rtb-private-a | ルートテーブルの名前タグです。 |
| VPC | (test-vpcのvpc id) | どのVPC上にルートテーブルを作成するのかを選択します。 |
ルートテーブルの紐付けまで完了したら、デフォルトルートを設定します。
ルートの作成方法も前回説明しましたので割愛します。
設定は以下の通りです。
| 項目名 | 設定値 | 説明 |
|---|---|---|
| 送信先 | 0.0.0.0/0 | 「0.0.0.0/0」はデフォルトルートと呼ばれています。前回の記事で説明したので割愛します。 |
| ターゲット | (test-ngwのid) | デフォルトルートのターゲットをNatGatewayにして、インターネットへの出口を作ります。 |

変更したら「変更を保存」ボタンをクリックします。ここまででネットワークの設定が完了しました。
(閑話 その2) NatGatewayのルーティング
マルチAZ化するためには、複数のNatGatewayを作成する必要があることは「閑話 その1」でお話ししました。マルチAZ化するには、ルーティングの部分もマルチAZに合わせた設定を行う必要があります。
つまり、AZごとにデフォルトルート変更する必要があります。構成図は下図の通りなのですが、AZ-aのプライベートサブネットは、AZ-aに構築されているNatGatwayにルーティングする必要があります。同様に、AZ-cのプライベートサブネットは、AZ-cに構築されているNatGatwayにルーティングする必要があります。
AWSの設定としては、AZ-cのプライベートサブネットのデフォルトルートをAZ-aのNatGatewayにすることもできますし、平時では問題なくインターネットに通信できます。
しかし、仮にAZ-aでAWS障害が発生してNatGateway Aが止まってしまった場合、本来関係がないはずのAZ-cのAWSリソースもインターネットに対するアクセスができなくなってしまいます。
この状況にならないように、各AZにNatGatewayを構築し、AZごとにルーティングを設定するように本番系では推奨されております。

⑤ EC2の作成
前回の記事と同様の手順でEC2を作成します。
EC2は一度作成するとサブネットを変更することはできません。もし同じEC2を作成したい場合は、AMIを取った後に、そのAMIを利用して新しくEC2を作成する必要があります。
今回は新規のEC2をプライベートサブネット上に構築します。
構築手順は同じであり割愛しますが、名前とネットワーク設定でだけ以下のように異なります。
名前とタグ
| 項目名 | 設定値 | 説明 |
|---|---|---|
| 名前 | test-ec2-private-a | EC2の名前タグです。識別しやすいように名前を変えます。 |
ネットワーク設定
| 項目名 | 設定値 | 説明 |
|---|---|---|
| サブネット | (test-subnet-private-aのsubnet id) | 今回作成したプライベートサブネット上にEC2を構築します。 |
| パブリックIPの自動割り当て | 無効化 | NatGateway経由でSSMにアクセスするため、パブリックIPをEC2に付与しないようにします |
これでEC2が立ち上がったので、フリートマネージャーでアクセスしてみましょう。
⑥ EC2へのアクセス
前回の記事と同様の手順でフリートマネージャを用いてEC2にアクセスしてみましょう。手順は割愛しますが、以下のようにアクセスできることが確認できます。

4. まとめ
今回はEC2にパブリックIPを付与することなくEC2にアクセスすることができました。
前回の記事に比べて、EC2にパブリックIPを付与することがないので、一層セキュリティが強固になったと思います。
ただ、そもそもパブリックIPを一切利用できないシステムもあります。その場合でも、EC2にアクセスする方法はあります。
次回はVPCエンドポイントを用いて、EC2にアクセスします。
Discussion