[初心者向け]saaサンプル問題を例にプライベートサブネットから疎通を確認してみる

2023.04.30

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは。AWS事業本部の木村です。
先日無事に12冠を達成することができました。
AWSが全く何もわからなかったところから、1年半かかって達成することができましたので、喜びもひとしおでした。

資格を取得するにあたって各種ブログや書籍を執筆している先人の方々に助けていただいてばかりでしたので、今後は自分もこれから資格取得に向けて学習をしているからの一助になれたらと思っています。今回はその初めの一歩として、問題例の構築と検証を行なっていきます。

今回の目的

AWS資格を習得するにあたって本やBlackBeltを読んだり、模擬問題を解いてみてインプットを行うことは、試験を受けるために非常に重要ですが、それだけだと中々記憶に定着せず資格のための勉強になってしまいがちです。実施に手を動かして構築すると記憶にも残りやすいので試験対策にもなりますし、業務にも活かしやすくなります。頻出するサービスは一度実際に触ってみることをお勧めします。
ただ模擬問題ごとに、手探りで全て構築していたらいくら時間があっても足らなくなってしまいます。ですので実際に模擬問題を構築してみてブログに執筆すれば、AWSの勉強初めたての方の役にたて、自らの復習になると思い今回のブログを書いてみております。

公式のSAAサンプル問題を利用して実際に構築を行なって正解例と誤答例を検証していきたいと思います。

今回利用する問題

以下のSAAのサンプル問題の問1の例を使って、実際に構築していきたいと思います。 https://d1.awsstatic.com/ja_JP/training-and-certification/docs-sa-assoc/AWS-Certified-Solutions-Architect-Associate_Sample-Questions.pdf

ある企業は、複数のアベイラビリティーゾーンにまたがる VPC 内で、パブリック側の 3 層ウェブアプリケーションを実行しています。プライベートサブネットで実行されているアプリケーション層の Amazon EC2 インスタンスでは、インターネットからソフトウェアパッチをダウンロードする必要があります。ただし、EC2 インスタンスにインターネットから直接アクセスすることはできません。EC2 インスタンスが必要なパッチをダウンロードできるようにするために実行すべきアクションはどれですか。(2 つ選択)

A) パブリックサブネットで NAT ゲートウェイを構成する。
B) インターネットトラフィック用の NAT ゲートウェイへのルートがあるカスタムルートテーブルを定義し、アプリケーション層のプライベートサブネットに関連付ける。
C) Elastic IP アドレスを EC2 インスタンスに割り当てる。
D) インターネットトラフィック用のインターネットゲートウェイへのルートがあるカスタムルートテーブルを定義し、アプリケーション層のプライベートサブネットに関連付ける。
E) プライベートサブネットで NAT インスタンスを設定する。

この問題の正解はAとBになります。

今回の問題の正解をアーキテクチャー図を書き起こしてみるとおそらくこのようになります。

構築

ではまず前提の構築を行なっていきます。
アプリケーション層以外は今回の検証に関わってきませんので、今回の構築では割愛したいと思います、
まずは検証の基礎となる以下のアーキテクチャを作成します。

今回はシングルAZで構築します。

  • VPC
  • IAMロール
  • EC2

の順で作成していきます。

VPC

今回はVPCを一括で作成を利用して作成を行います。

まずはVPCの作成の画面に移動します。
画面上部にVPCと入力して、赤枠を選択してVPC画面に移動してください。

赤枠を選択して、VPC作成画面に移動してください。

以下の通りの設定で作成してください。(名前は任意のものを設定してください。)

以上の手順でVPC周りのリソースを一括で作成することができます。

IAMロール

次にSSM接続を行うために利用するEC2ロールを作成します。

まずはIAMの作成の画面に移動します。
画面上部にIAMと入力して、赤枠を選択してIAM画面に移動してください。

ロールを作成していきますので、画面左にあるロールを選択してください。

ロールの画面に遷移したら、画面右上にある作成を選択してください。

今回はEC2向けのロールですので、 EC2を選択して次に進んでください。

次にポリシーをアタッチします。SSMに接続する最小限の権限を付与したいので、「AmazonSSMManagedInstanceCore」を検索して選択します。

最後に任意の名前をつけて作成を選択してください。

EC2

続いてインスタンスを起動していきます。 まずEC2の作成画面に移動します。

画面上部にEC2と入力して、赤枠を選択してEC2画面に移動してください。

赤枠を選択して起動画面に遷移してください。

インスタンスの設定を行なっていきます。

今回はAmazon Linux2を利用します。 以下のように選択してください。(名前は任意のものを設定してください。)

画面を下に移動していき、インスタンスタイプとキーペアについてですが、以下のように設定してください。
今回はSSM接続を行うため、キーペアは利用しません。

続いてネットワークの設定を行います。まず赤枠を選択して編集できる状態にします。

ネットワークの設定内容ですが、VPCは先ほど作成したもの、サブネットはプライベートサブネットを選択してください。

パブリックIPは今回不要ですので、無効化のまま進めてください。

セキュリティグループの設定ですが、今回のインスタンス用に新しく設定します。(名前と説明は任意のものを設定してください。)

今回インバウンドの通信を受け付ける必要がありませんので、インバウンドルールは削除します。

ストレージに関してはデフォルトの設定のままで作成します。

最後に高度な詳細からIAM instance profileに先ほど作成した、IAMロールを設定します。

これ以外の項目は編集不要です。

内容確認できましたら、インスタンスを起動します。

ここまでで、検証に必要な基礎部分の作成が完了しました。

基礎となるアーキテクチャを全て作成したところで、 EC2に接続して外部と通信できるか試してみましょう。

今回は検証のためにSSM接続の際にVPCエンドポイントを作成して接続していますが、本来不要な手順ですので説明は割愛します。

同じように検証を行いたい方は、SSM接続に必要な条件に関しては以下の記事が接続方法をわかりやすく解説されておりますので、こちらご参照のうえ接続を行なってください。

セッションマネージャーのハマりどころをパターンごとに整理してみる

実際に接続してtracerouteで確認しましたが、想定通り失敗してしまいました。

では正解の選択肢の構築を付け加えて、 外部と通信できるようにしていきましょう。

問題の正解選択肢の追加構築

では追加で構築を行なっていきます、実際に疎通を行うことができるか試していきましょう。

目指す構築アーキテクチャはこのような形です。

現在のアーキテクチャに足りていない、NATゲートウェイとプライベートサブネットのルートテーブルを作成していきましょう。

NATゲートウェイの作成

まずはNATゲートウェイを作成していきます。

正解の選択肢Aではパブリックサブネットに作成していましたので、パブリックサブネットに構築していきましょう。

VPCを作成した際と同じようにVPCの画面に遷移してください。

今度は画面左にあるNATゲートウェイを選択してください。

NATゲートウェイの画面に移動したら、画面右上の作成を選択してください。

先ほど作成したVPCのパブリックサブネットを選択し、接続タイプはパブリックを選択してください。(名前は任意のものを設定してください。)

パブリックなNATゲートウェイにはElasticIPの設定が必要になりますので、ElasticIPの割り当てを選択し作成されたものを設定して作成を選択してください。

これにて、NATゲートウェイを作成することができました。(NATゲートウェイは料金が発生しますので検証が終わったらすぐ削除とElasticIPの解放をするようにしましょう!)

正解の選択肢の組み合わせを満たしていないので、接続できないのですが念の為もう一度検証しておきましょう。

先ほどと同じコマンド叩き検証します。

想定通り失敗しました。

NATゲートウェイを作成しましたが、プライベートサブネットからNATゲートウェイがあるところまで通信するためのルートがないためです。

イメージで示すと以下のようになります。

なぜ選択肢Eのプライベートサブネットでは通信が行えないかは後々解説します。

カスタムルートテーブルの定義

続いてカスタムルートテーブルの定義を変更していきます。

最初に作成したカスタムルートテーブルは以下のようになっており、VPC外部へのルーティングが設定されていません。 このためNATゲートウェイを利用できず、外部への通信が行えませんでした。

ではNATゲートウェイに接続できるように設定をしていきましょう。

先ほどと同様にVPCの画面に移動し、画面左側にあるルートテーブルを選択してください。

ルートテーブルの画面に移動したら、画面右上の作成を選択してください。

先ほど作成したVPCを選択して作成してください。(名前は任意のものを設定してください。)

次にルートの設定を行います。
作成後遷移した画面からルートの編集を選択してください。

ルートの追加を行います。

送信先は0.0.0.0/0を選択します

ターゲットはNATゲートウェイを選択します。

NATゲートウェイを選択すると、対象とするNATゲートウェイがリストで表示されますので先ほど作成したものを選択して変更を保存してください。

次にサブネットの関連付けを行います。

サブネットの関連付けタブを選択して、サブネットの関連付けを編集を選択してください。

利用可能なサブネットの一覧から、プライベートサブネットを選択して関連付けを保存してください。

これにてカスタムルートテーブルも定義できました。早速再びコマンドを実行してみましょう。

今度は成功しました。無事外部への通信のルートが確立できました!

不正解の選択肢について

では続いて不正解の選択肢も確認していきましょう。

Elastic IP アドレスを EC2 インスタンスに割り当てる

Elastic IPをEC2インスタンスに割り当てを行ってもインターネットゲートウェイへの経路がないと外部への通信が行えないため間違いです。

インターネットトラフィック用のインターネットゲートウェイへのルートがあるカスタムルートテーブルを定義し、アプリケーション層のプライベートサブネットに関連付ける。

プライベートサブネットにインターネットゲートウェイの経路を設定する場合、経路が確立されるため外部への疎通は可能になります。しかし EC2インスタンスが直接インターネットに接続してはいけないという要件を満たさなくなるため間違いとなります。 また、インターネットゲートウェイへの経路がないサブネットをプライベートサブネットと呼ぶためサブネットの命名とも反してしまいます。

イメージで説明するとこのような形になります。

プライベートサブネットで NAT ゲートウェイを設定する

プライベートサブネットにNATゲートウェイを設置すること自体は可能ですが、NATゲートウェイからインターネットゲートウェイへの経路がないので、外部への通信が行えないため間違いです。

イメージで説明するとこのような形になります。

先ほどと同様にプライベートサブネットはインターネットゲートウェイまでの経路を持っていないサブネットですので、イメージのようにインターネットゲートウェイまで到達することができず外部との通信を行うことができません。

最後に(環境のお片付け)

環境のお片付けまでが検証です。

余計な料金が発生しないように環境をお片付けしていきましょう。

EC2

まずインスタンスを終了させていきます。

作成した際と同じように、EC2の画面に遷移してインスタンスの画面から今回作成したインスタンスを選択します。

インスタンスの状態からインスタンスを終了を選択してください。

これにてEC2のお片付けは終了です。

NATゲートウェイ

次にNATゲートウェイを削除していきます。

作成した際と同様にNATゲートウェイの画面まで移動してください。

対象のNATゲートウェイを選択して、アクションからNATゲートウェイを削除を選択してください。

確認画面が出てきますので、ボックスに「削除」と入力し削除を選択してください。

続いてElastic IPを解放するのですが、NATゲートウェイの削除が完了している必要があるのでそれまでしばらく待機する必要があります。

削除が完了しましたら、画面左側のElastic IPを選択して画面を移動してください。

対象のIPを選択して、アクションからElastic IPアドレスの解放を選択してください。

確認画面が出てきますので、解放を選択してください。

これにてNATゲートウェイのお片付けは終了です。

VPC

最後にVPCを削除していきます。

画面左側のお使いのVPCを選択して画面を移動してください。

今回作成したVPCを選択して、アクションからVPCの削除を選択してください。

確認画面が出てきますので、ボックスに「削除」と入力し削除を選択してください。

これにてお片付けも完了となりました。お疲れ様でした。

まとめ

SAAの問題を例に実際に構築してみて検証してみました。私も勉強し初めの頃はなぜこの組み合わせで接続できるのかが頭が???でした。

やはり手を動かして作成してみると、忘れづらいのではないかと思います。この構成は一般的にも利用されますので、業務の中でも役立つかと思います。

この記事がどなたかの役立てていましたら、幸いです。

以上AWS事業本部木村がお届けしました。