🚥

【Azure】プライベートDNSゾーンのイメージを掴む!

2023/12/24に公開2

初めに

前回の記事(AzureのVNet、プライベートエンドポイントなどのネットワークのイメージを掴む!)にてAzureのネットワークのイメージは掴めた!と私は思っていました。しかし、そのイメージがあったにも関わらず、仕事でAPI ManagementとAzureOpenAIの疎通がなかなかうまくいかないという事象が起こりました。前回の記事が間違っていたわけではありません。ただ、前回の記事には記載していないプライベートDNSゾーンというものをあまり理解できていなかったが故に詰まりました。今回の記事では、プライベートDNSゾーンについて解説していきます。

なお、これは「テックキャンプ公式コミュニティ Advent Calendar 2023」の24日目の記事です!
https://adventar.org/calendars/8952

プライベートエンドポイントの復習

下図は前回の記事でも記載したプライベートエンドポイントのイメージ図です。

図1
ネットワークを無効にした状態でも、プライベートエンドポイントを設置することでプライベートエンドポイントを介してリソースとの通信を可能にするというものです。なので、図1で言うとプライベートエンドポイントが入っているVNetに存在するAppServiceからcosmosDBにはアクセス可能ということになります。

cosmosDBに"https://test-cosmos.documents.azure.com:443/" というURLが初めから登録されているとします(実際にcosmosDBを作成すると上記のようなドメインを持つURLが作成されています)。この時VNet内のAppServiceからURLを用いてcosmosDBにアクセスできるでしょうか?図1の状態でプライベートIPを用いての通信は可能になっていますが、URLを用いてcosmosDBにアクセスするためには、今回の主題でもあるプライベートDNSゾーンが必要になってきます。

DNSとは

大前提としてDNS(Domain Name System)とはドメイン名とIPアドレスを紐づけるものです。要はURLで特定のサーバーにリクエストを投げたい場合、URLの情報からサーバーの場所を示すIPアドレスを教えてくれるのがDNSで、DNSが働いてくれないとリクエストをどのサーバーに送ればいいかわからず、求めているレスポンスを得ることができません。DNSについてはネット上にわかりやすい記事が山ほどあるのでこれくらいの説明に留めておきます。
(↓一応参考に一記事。)
https://wa3.i-3-i.info/word1287.html

プライベートDNSゾーン

プライベートDNSゾーンの概要

プライベートDNSゾーンとはVNet上の名前解決を行なってくれるものです。URLとプライベートIPを紐づけてくれるものとも言い換えられます。実際に例を出した方がわかりやすいと思うので、プライベートDNSゾーンを追加した図を以下に示します。

図2
図のようにプライベートDNSゾーンにレコードを登録し、対象のVNetに対して仮想ネットワークリンクを作成します。これで、VNetのリソースからプライベートDNSを利用できるようになります。その結果、AppServiceからcosmosDBのURLにアクセスしようとするとプライベートDNSゾーンが、cosmosDBのプライベートIPは10.0.0.4だよと教えてくれます。そのため、URLでcosmosDBにアクセスできるということになります。

詳細については以下のMSドキュメントも参照してください。
https://learn.microsoft.com/ja-jp/azure/dns/private-dns-overview

AzureにはプライベートIPに関するDNSであるプライベートDNSゾーンだけではなく、インターネット上の名前解決を目的とするパブリックなDNSゾーンも存在し、これらをまとめてAzure DNSというサービスの総称で呼んだりします。

プライベートDNSゾーンの命名について

プライベートDNSゾーンのリソース名はなんでもいいわけではありません。例えばcosmosDBのプライベートDNSゾーンは「privatelink.documents.azure.com」という名前になります。cosmosDBのURLが"https://test-cosmos.documents.azure.com:443/" のような感じなので、"privatelink.対象リソースのドメイン"のような名前に設定する必要があると思います。こちらは自分で色々試してわかったことで、他のリソースも同様でした。カスタムドメインが設定できるリソースならプライベートDNSゾーンの名前も自由につけれたりするのかなと想像していますが、検証できてないのでこの辺り詳しい方がいれば教えていただけると嬉しいです。

その他にも制限があるので、詳しくは以下リンクをご確認ください。
https://learn.microsoft.com/ja-jp/azure/dns/private-dns-privatednszone#restrictions
とはいえ、命名についてわかりやすく書いてあるところが見つけられなかったのでわかりづらいなと感じました。

仮想ネットワークリンクについて

仮想ネットワークリンクには登録仮想ネットワークと解決仮想ネットワークの2種類がありますが、説明がややこしくなるので詳しくは説明を割愛します。今回の記事では解決仮想ネットワークという自動でレコードが追加されない方を使用してるくらいの認識で大丈夫です。解決仮想ネットワークの場合は複数のVNetと複数のプライベートDNSゾーンをリンクすることが可能です。また、プライベートDNSゾーンはグローバルなリソースとして作成され(つまりリージョンがない)、リンクするVNetに関してはサブスクリプションやリソースグループが異なるものでもリンクできます。イメージとしては下図のようになります。

図3
VNetに対する仮想ネットワークリンクを作成することで初めて、VNet内のリソースからプライベートDNSゾーンを使用することができるようになるという点には注意です。

詳細は以下リンクをご確認ください。
https://learn.microsoft.com/ja-jp/azure/dns/private-dns-virtual-network-links

プライベートエンドポイントの作成時

Azureポータルでプライベートエンドポイントを作成する際に、あまり詳しくない人でもなんとなく操作すれば、実はいい感じにプライベートDNSゾーンの作成やレコードの登録までやってくれます。そんな中でも個人的に気をつけてほしいところは、以下2点です。

  • プライベートエンドポイントをどこのVNet内に作るか
  • どのプライベートDNSゾーンを使用するかor新規作成するか

1つ目は前回の記事の復習となりますが、どのリソースと通信させたいかということを考えて、プライベートエンドポイントを設置するVNetやサブネットを選択する必要があります。DNSで名前解決をしてプライベートIPがわかったとしても、ネットワーク的にアクセスできなければ意味がありません。
2つ目のプライベートDNSゾーンについては、これまでも記載したように、どのVNetのリソースからURLを用いてアクセスさせたいかということを意識しましょう。「プライベートDNSゾーンの命名」で記載したルールに則った名前のプライベートDNSゾーンが既に存在すれば、統合することもできます。Azureポータルで操作する場合は、デフォルトの選択肢で新規作成になっていることも多いように感じます。
レコードの登録はAzure側でいい感じにやってくれるため、上記2点を意識すればURLを用いたAzureのリソース同士の通信で詰まるポイントが減ると思います!

プライベートエンドポイントの作成手順は以下リンクに書いてありますが、DNS周りのことはあまり書いてないですね、、
https://learn.microsoft.com/ja-jp/azure/private-link/create-private-endpoint-portal?tabs=dynamic-ip

実例紹介

プライベートDNSゾーンがVNetにリンクされていなかった実例

これは今まで記載してきた内容がわかっていれば、直面しなかった問題でした。APIM(API Management)からAzureOpenAIにURLを使ってアクセスしたかったのですが、なかなかうまくいかないという冒頭で記載した事象です。疎通がうまくいかない状況は下図のような感じでした。URLとプライベートIPの名前解決ができず、パブリックなDNSからAzureOpenAiにアクセスしようとして、弾かれているような感じでした。

図4
プライベートDNSゾーンをVNetにリンクさせ、疎通がうまくいったイメージ図が下図です。

図5
これまでの復習のような内容ですが、1つ補足をすると、URLを基にリソースやサーバーにアクセスしようとする際、確認するDNSに優先順位が存在します。VNet内のリソースからのリクエストに対しては、VNetにリンクされているプライベートDNSを初めに確認し、対象のURLのレコードがない場合はパブリックなDNSを探しにいくような流れになっています。

同名のプライベートDNSゾーンをリンクさせることはできなかった実例

次の実例です。先ほどプライベートDNSゾーンの名前はAzureのリソースに依存した名前になるという話をしました。なので別のリソースグループだろうと、AzureOpenAIのプライベートDNSゾーンを作成すると同じ名前のリソースが作成されます。VNetから2つのAzureOpenAIのどちらにもアクセスしたいという場合には、これまで仮想ネットワークリンクを作成するという方法をとってきましたが、同じ名前のプライベートDNSゾーンをリンクさせることはできません。この場合のイメージ図が下図になります。

図6

この場合の解決策が既存のプライベートDNSゾーンと統合するというもので、下図のようなイメージになります。

図7
要は同じプライベートDNSゾーンを共有で利用して、レコードを追加することで、どちらのAzureOpenAIにもURLで名前解決することが可能になるということです。リソースの数が増えたり、ネットワークの構成が複雑になるとこのようなパターンも発生するかもしれません。

最後に

少しわかりづらい部分もあったかと思いますが、なんとなくAzureのプライベートDNSゾーンのイメージを掴むことができたでしょうか?
Azureポータルでリソースの作成をしていると、細かいところがわからなくてもデフォルトの設定をすればうまくいくということもあるかと思います。しかし、応用的なことを考えたり、何か問題があった際の解決方法の検討には基礎的な部分が理解できていないと厳しいと感じさせられました(当たり前ですが、、)。
私もまだまだ理解できてない部分が多いと思うので、間違っている部分あれば教えていただけると嬉しいです!

Discussion

yasunayasuna

アドベントカレンダー完走おめでとうございます!!!
この記事でAzureのネットワークの特徴を掴むことができました。AzureOpenAIはこれから使う企業が増えそうなので私もチェックしておきたいところです~!

peishimpeishim

ありがとうございます!まだまだAzure歴1ヶ月なので、知識深めてアウトプット頑張ります!