皆さん、こんにちは! SRE兼クラウドアーキテクトの〇〇です。
今日のテーマは、クラウドインフラを触り始めたばかりの皆さんが「あれ?これってどうなってるんだろう?」と首をかしげがちな、でもとっても重要な「プライベートサブネットからのDNS名前解決」についてです。
特に、AWSのVPCにおけるRoute 53 Resolver (通称 AmazonProvidedDNS) と、プライベートサブネット、そしてNATゲートウェイが織りなすネットワークの裏側を、まるで郵便配達の仕組みのように紐解いていきましょう。
「DNS? ルーティング? NATゲートウェイ? なんか難しそう…」と感じた方もご安心ください。一つずつ、ていねいに解説していきますからね!
—
郵便配達で例えるクラウドネットワークの世界へようこそ!
私たちが普段使っているインターネット。Webサイトを見たり、SNSで友達とやり取りしたり、裏側ではものすごい数のデータが行き交っています。その中でも、特に縁の下の力持ちとして重要な役割を担っているのが「DNS(Domain Name System)」です。
DNSの役割は、例えるなら「インターネット上の住所録」のようなもの。皆さんが「google.com」と打ち込むと、DNSが「はい、google.comさんの住所は142.250.199.110番地ですよ!」と教えてくれることで、あなたのPCは迷わずGoogleのサーバーにたどり着けるわけです。
今日は、この「住所録の問い合わせ」が、AWSの「プライベートな部屋(プライベートサブネット)」から行われるとき、どんな旅路をたどるのかを見ていきましょう。
—
プライベートサブネット:安全だけどちょっと不便?
AWSのVPC(Virtual Private Cloud)には、大きく分けて2種類のサブネットがあります。
1. パブリックサブネット:インターネットから直接アクセスできるサブネットです。ここに配置されたサーバー(EC2インスタンスなど)は、パブリックIPアドレスを持つことができ、外の世界と直接やり取りが可能です。
2. プライベートサブネット:インターネットから直接アクセスできない、閉鎖されたサブネットです。ここに配置されたサーバーは、通常パブリックIPアドレスを持ちません。高いセキュリティが求められるデータベースサーバーや、バックエンドのアプリケーションサーバーなどを配置するのに適しています。
プライベートサブネットは、外部からの不要なアクセスを防ぐことができるため、セキュリティの観点から非常に重要です。しかし、その「閉鎖性」ゆえに、ちょっとした課題も生まれます。それが「インターネットとどうやって通信するの?」という疑問です。
プライベートサブネット内のサーバーが、例えば外部のAPIを呼び出したり、OSのアップデートのためにインターネット上のリポジトリにアクセスしたりする場合、どうすればいいのでしょうか?パブリックIPを持たないサーバーは、そのままではインターネットに接続できませんよね。まるで、外線電話のない部屋にいるようなものです。
—
DNS問い合わせの基本:VPC内部の「郵便局窓口」へ
さて、本題のDNS問い合わせに移りましょう。
プライベートサブネット内のEC2インスタンスが、google.comのような外部のドメイン名に対応するIPアドレスを知りたいとき、最初にどこへ問い合わせるのでしょうか?
実は、AWSのVPC内には、すべてのインスタンスが利用できる特別なDNSサーバーが用意されています。これがRoute 53 Resolver、または旧称であるAmazonProvidedDNSと呼ばれているものです。このDNSサーバーは、VPCのCIDRレンジのネットワークアドレスに+2されたIPアドレスに存在します。(例: VPCのCIDRが10.0.0.0/16なら、10.0.0.2がDNSサーバーのIPアドレスになります)。
プライベートサブネット内のインスタンスは、このVPC内部のDNSサーバーに対して、名前解決のリクエストを送ります。
このときがポイントです!
VPC内部のDNSサーバーへの問い合わせは、VPCの内部で行われるため、インターネットへの接続は一切必要ありません。
これは、まるで「同じマンションの管理人に、マンション内の住民の部屋番号を尋ねる」ようなものです。マンション内でのことなので、外に出る必要はありませんよね。
イメージとしてはこんな感じです。
[プライベートサブネットのEC2]
↓ (DNS問い合わせ: "google.comのIPは?")
[VPC内のDNSサーバー (Route 53 Resolver / AmazonProvidedDNS)]
この問い合わせは、VPCのルーティングテーブルに自動的に設定されているローカルルートによって処理されます。特に意識せずとも、VPC内部のDNSサーバーへたどり着くことができるわけです。
—
外部リソースの名前解決とNATゲートウェイの登場!
では、VPC内部のDNSサーバーは、どのようにしてgoogle.comのような外部ドメインのIPアドレスを知るのでしょうか?
ここが重要です!
VPC内のDNSサーバーは、自身が知らないドメイン(つまり、AWSのRoute 53で管理されていないような外部のドメイン)については、インターネット上のルートDNSサーバーや権威DNSサーバーに問い合わせを行います。
この「VPC内のDNSサーバーが、外部のDNSサーバーに問い合わせに行く」という処理は、インターネットへの通信が必要になります。
しかし、私たちのプライベートサブネット内のインスタンスは、パブリックIPを持たないので直接インターネットに出られません。そして、そのインスタンスからのDNS問い合わせはVPC内のDNSサーバーに向かっています。
じゃあどうするの? ここで救世主となるのが「NATゲートウェイ (Network Address Translation Gateway)」です!
NATゲートウェイは、プライベートサブネット内のインスタンスがインターネットと安全に通信するための「代理人」のような役割をします。
例えるなら、外線電話のない部屋(プライベートサブネット)から、外部の人(インターネット)に電話したい場合を想像してください。あなたは部屋にいる管理人さん(NATゲートウェイ)に頼んで、「〇〇さんに電話してください」と伝えます。管理人さんは、自分の電話を使って外部に電話をかけ、相手から返ってきた情報をあなたに伝えてくれるわけです。
NATゲートウェイがあることで、プライベートサブネット内のインスタンスは、パブリックIPを持たなくても、NATゲートウェイが持つパブリックIPを使ってインターネットと通信できるようになります。
DNS問い合わせの流れ(NATゲートウェイ経由)
1. プライベートサブネットのEC2:「google.comのIPは?」と、VPC内部のDNSサーバー(例: 10.0.0.2)に問い合わせます。
2. VPC内部のDNSサーバー:google.comが自身の管理外のドメインだと判断し、「外部のDNSサーバーに問い合わせる必要があるな…」と考えます。
3. VPC内部のDNSサーバー:インターネット上の権威DNSサーバーに向けて、google.comの問い合わせをします。
4. ルーティングテーブルとNATゲートウェイ:この「外部への問い合わせ」トラフィックは、プライベートサブネットのルーティングテーブルに設定されたNATゲートウェイを経由してインターネットに出て行きます。
- この時、VPC内部のDNSサーバーはプライベートIPアドレスを持っていますが、NATゲートウェイがそのパブリックIPアドレスに変換(NAT)して通信を仲介します。
5. インターネット上のDNSサーバー:google.comのIPアドレスをVPC内部のDNSサーバーに返します。
6. VPC内部のDNSサーバー:受け取ったIPアドレスを、最初に問い合わせてきたプライベートサブネットのEC2インスタンスに伝えます。
7. プライベートサブネットのEC2:google.comのIPアドレスを知り、晴れてgoogle.comにアクセスできるようになります。
つまり、プライベートサブネット内のインスタンス自体がNATゲートウェイを直接経由してDNS問い合わせをしているわけではない、という点がミソです!
インスタンスは常にVPC内部のDNSサーバーに問い合わせ、そのVPC内部のDNSサーバーが外部のDNSサーバーに問い合わせる際に、インターネットへの経路としてNATゲートウェイを利用する、という流れになります。
—
ルーティングテーブルの設定例:NATゲートウェイを「転送センター」に!
プライベートサブネットからインターネットに通信するために、ルーティングテーブルにNATゲートウェイへの経路を設定する必要があります。これは、郵便配達における「転送センターへの指示」のようなものです。
前提条件
- VPCが作成済み
- パブリックサブネットとプライベートサブネットが作成済み
- パブリックサブネットにNATゲートウェイがデプロイ済み
- NATゲートウェイは必ずパブリックサブネットに配置し、Elastic IPアドレスを関連付ける必要があります。
ルーティングテーブルの設定
プライベートサブネット用のルーティングテーブルに、0.0.0.0/0(すべての宛先)へのトラフィックをNATゲートウェイへ向ける設定を追加します。
# まず、VPC IDとプライベートサブネットのルートテーブルIDを取得します。
# ※実際にはご自身の環境のIDに置き換えてください。
VPC_ID="vpc-0123456789abcdef0"
PRIVATE_SUBNET_ROUTE_TABLE_ID="rtb-0fedcba9876543210"
# NATゲートウェイIDも取得します。
NAT_GATEWAY_ID="nat-0123456789abcdef0"
# プライベートサブネットのルートテーブルに、NATゲートウェイへのルートを追加
aws ec2 create-route \
--route-table-id $PRIVATE_SUBNET_ROUTE_TABLE_ID \
--destination-cidr-block "0.0.0.0/0" \
--nat-gateway-id $NAT_GATEWAY_ID
echo "プライベートサブネットのルーティングテーブルにNATゲートウェイへのルートを追加しました。"
この設定により、プライベートサブネット内のインスタンスからインターネット(0.0.0.0/0)へ向かう通信は、すべて指定したNATゲートウェイを経由するようになります。これには、VPC内部のDNSサーバーが外部のDNSサーバーに問い合わせる通信も含まれます。
—
よくある疑問とトラブルシューティングのヒント
1. 「プライベートサブネットのEC2からインターネットに繋がらない!」
これは一番よくあるトラブルですね。以下の点を確認しましょう。
- NATゲートウェイの存在とステータス:
- NATゲートウェイがパブリックサブネットにデプロイされていますか?
- ステータスが
Availableになっていますか? - Elastic IPアドレスが正しく関連付けられていますか?
- ルーティングテーブルの設定:
- プライベートサブネットに関連付けられているルーティングテーブルに、
0.0.0.0/0からNATゲートウェイへのルートが正しく設定されていますか? - セキュリティグループ/ネットワークACL:
- EC2インスタンスのセキュリティグループや、サブネットのネットワークACL (NACL) が、アウトバウンド(外向き)の通信をブロックしていませんか?特に、HTTP/HTTPS (ポート80/443) やDNS (ポート53 UDP/TCP) のアウトバウンドを許可しているか確認しましょう。
- VPC内部のDNSサーバーへの問い合わせは、VPC内部の通信なので、セキュリティグループやNACLでブロックされることは通常ありません。しかし、外部への通信(NATゲートウェイ経由)はこれらの設定の影響を受けます。
2. 「DNSの名前解決が遅い、またはタイムアウトする」
- VPC内部のDNSサーバーへの疎通確認:
- プライベートサブネットのインスタンスから、VPC内部のDNSサーバー(例:
10.0.0.2)に対してpingやtelnetで疎通を確認してみましょう。 ping 10.0.0.2(実際のVPCの.2アドレスに置き換えてください)- もし疎通できない場合、インスタンスのセキュリティグループやNACLでVPC内部の通信がブロックされている可能性があります。
- NATゲートウェイの負荷:
- 多数のインスタンスが同時にインターネットにアクセスしている場合、NATゲートウェイがボトルネックになっている可能性があります。CloudWatchメトリクスでNATゲートウェイの使用率を確認しましょう。
- NATゲートウェイのリージョン:
- NATゲートウェイはアベイラビリティゾーン (AZ) に依存します。インスタンスと同じAZにNATゲートウェイがあるか、またはインスタンスのルートテーブルが別のAZのNATゲートウェイを参照していないか確認しましょう。
—
まとめ:プライベートサブネットとNATゲートウェイ、DNSの賢い連携
今回は、プライベートサブネット内のインスタンスがDNSの名前解決を行う際のネットワーク経路と、NATゲートウェイの重要な役割について深掘りしました。
重要なポイントは以下の3点でしたね。
1. VPC内部のDNS問い合わせは、VPC内部で完結する:プライベートサブネットのインスタンスは、常にVPC内部のRoute 53 Resolver (例: .2のアドレス) に問い合わせます。この際、NATゲートウェイは不要です。
2. 外部ドメインの名前解決にはNATゲートウェイが必要:Route 53 Resolverが外部のドメイン情報を知るためには、インターネット上のDNSサーバーに問い合わせる必要があります。この「外部への通信」を可能にするのが、NATゲートウェイです。
3. ルーティングテーブルで経路を制御:プライベートサブネットのルーティングテーブルに、0.0.0.0/0 からNATゲートウェイへのルートを設定することで、プライベートインスタンスからインターネットへの通信(およびRoute 53 Resolverからの外部DNSへの問い合わせ)が実現します。
クラウドインフラのネットワークは、一見複雑に見えますが、一つ一つのコンポーネントの役割を理解し、郵便配達のような身近な例に置き換えて考えてみると、意外とスッキリ理解できるものです。
この知識が、皆さんの日々のインフラ構築やトラブルシューティングに役立つことを願っています。一歩ずつ、着実に理解を深めていきましょう!
それでは、また次回の記事でお会いしましょう!
コメント