Young Leaves

Azure プライベートDNS を使い仮想ネットワーク内に作成された仮想マシンのレコードを自動登録する

今回はAzure プライベートDNS の機能の1つである仮想マシンの自動登録機能を使い、仮想ネットワーク内に作成された仮想マシンのプライベートIP アドレスのレコードを自動で登録します。

実施環境

Azure CLI

2.56.0

前提条件

今回Azure リソース作成に利用するAzure CLI はAzure Cloud Shell からコマンドを実行したものとなります。また仮想マシン作成時にSSH 鍵を利用するため、「~/.ssh」配下にSSH 鍵がない場合は以下のコマンドで事前に作成をお願いします。

# 仮想マシン用のSSH鍵を作成する
ssh-keygen -m PEM -t rsa -b 4096

Azure プライベートDNS の自動登録機能とは

Azure プライベートDNS の自動登録機能は、仮想ネットワーク内の新規または既存の仮想マシンのプライベートIP アドレスを自動でプライベートDNS のレコードに登録できる機能です。自動登録は仮想マシンのみ対象となっているため、仮想マシン以外のリソースについては登録されません。自動登録で登録されるレコードはA レコードとPTR レコード (プライベートDNS には表示されない) であり、レコードは仮想ネットワークリンクの作成時または自動登録の設定時となります。自動登録されたレコードの削除は、特定のレコードのみ削除したい場合は手動で削除を行い、自動登録した全てのレコードを削除する場合はプライベートDNS の仮想ネットワークリンクの自動登録を無効にします。ただし、仮想マシンと同じ名前のレコードを手動で作成した場合は自動登録の対象とならず、自動登録設定を無効にしても削除されません。

自動登録はいくつかの制約があります。仮想マシンでDHCP を利用しているプライマリのNIC のみ登録されること、複数の仮想ネットワークリンクで自動登録を同時に設定する (片方のプライベートDNS ゾーンの仮想ネットワークリンクで自動登録を有効にし、もう一方の仮想ネットワークリンクでは自動登録を無効にする、はOK) ことはできません。

自動登録についてはプライベートDNS のリンク先仮想ネットワークのアドレス帯に関係なく作成できますが、同じアドレス帯の仮想ネットワーク同士で仮想ネットワークを行うと複数の仮想マシン名で同じIP アドレスが登録される可能性があるため、複数の仮想ネットワークで自動登録を行う場合は注意が必要です。

今回の構成

今回は以下の構成のリソースで仮想ネットワークリンク作成前と作成後の自動登録機能を試します。vm-test-dev-001 を仮想ネットワークリンク作成前、vm-test-dev-002 を仮想ネットワークリンク作成後とします。

リソースグループの作成、変数定義

初めに各種Azure リソース用のリソースグループ作成と各種変数の定義を行います。

# 各種変数を定義する
RESOURCE_GROUP_NAME="rg-test-dev-001"
LOCATION="japaneast"
TAGS="Environment=development"
VNET_NAME="vnet-test-dev-001"
VNET_PREFIX="192.168.0.0/16"
SUBNET_NAME="snet-test-dev-001"
SUBNET_PREFIX="192.168.0.0/24"
VM1_NAME="vm-test-dev-001"
VM2_NAME="vm-test-dev-002"
VM_USER="autoregistdemo"
PRIVATE_DNS_ZONE_NAME="privatednstest.com"
PRIVATE_DNS_LINK_NAME="privatednstest-link"

# リソースグループを作成する
az group create -n $RESOURCE_GROUP_NAME -l $LOCATION

仮想ネットワーク、サブネットの作成

リソースグループ作成後、プライベートDNS を設定する仮想ネットワークと仮想マシン用のサブネットを作成します。

# 仮想ネットワークとサブネットを作成する
az network vnet create \
    --name $VNET_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --tags $TAGS \
    --address-prefix $VNET_PREFIX \
    --subnet-name $SUBNET_NAME \
    --subnet-prefixes $SUBNET_PREFIX

仮想ネットワークリンク作成前の仮想マシンを作成

仮想ネットワークとサブネットを作成したら仮想ネットワークリンク作成前の仮想マシンを作成します。

# 仮想ネットワークリンク作成前の仮想マシンを作成
# 今回パブリックIPアドレスは使用しないため空欄とする
# 利用しないが不正ログインを避けるためSSH鍵登録とする
az vm create \
    --name $VM1_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --tags $TAGS \
    --image Ubuntu2204 \
    --vnet-name $VNET_NAME \
    --subnet $SUBNET_NAME \
    --public-ip-address "" \
    --admin-username $VM_USER \
    --generate-ssh-keys

プライベート DNS を作成、仮想ネットワークにリンク

リンク前の仮想マシン作成後、仮想ネットワークで利用するプライベートDNS を作成します。プライベートDNS を作成後は仮想ネットワークにプライベートDNS をリンクさせます。

# プライベートDNSを作成する
az network private-dns zone create \
    --name $PRIVATE_DNS_ZONE_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --tags $TAGS

# プライベートDNSを仮想ネットワークにリンクする
# 「--registration-enabled(-e)」で自動登録の有効、向こうを設定する
az network private-dns link vnet create \
    --name $PRIVATE_DNS_LINK_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --virtual-network $VNET_NAME \
    --zone-name $PRIVATE_DNS_ZONE_NAME \
    --registration-enabled true

リンクが完了後、プライベートDNS のゾーンを確認しリンク前に作成した仮想マシンのレコードが登録され、自動登録済みが真であることを確認します。

# プライベートDNSのAレコードを確認する
# vm-test-dev-001のAレコードが表示されることを確認する
az network private-dns record-set a list \
    --zone-name $PRIVATE_DNS_ZONE_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --output table

自動登録でレコードを作成した場合の初期値は以下の通りとなります。

名前

VM の名前 (ここではvm-test-dev-001 となる)

種類

A レコード

TTL

10

仮想マシンのプライベートIP アドレス

また、自動登録で登録したレコードの削除は可能ですが編集はできないため、上記の設定を変えることはできません。

リンク後の仮想マシンを作成

プライベートDNS、仮想マシンへのリンク完了後、仮想マシンを新規で作成します。

# 仮想ネットワークリンク作成後の仮想マシンを作成
# 今回パブリックIPアドレスは使用しないため空欄とする
# 利用しないが不正ログインを避けるためSSH鍵登録とする
az vm create \
    --name $VM2_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --location $LOCATION \
    --tags $TAGS \
    --image Ubuntu2204 \
    --vnet-name $VNET_NAME \
    --subnet $SUBNET_NAME \
    --public-ip-address "" \
    --admin-username $VM_USER \
    --generate-ssh-keys

設定確認

リンク後の仮想マシンを作成したら再度プライベートDNS のレコードを確認します。

# プライベートDNSのAレコードを確認する
# vm-test-dev-001、vm-test-dev-002のAレコードが表示されることを確認する
az network private-dns record-set a list \
    --zone-name $PRIVATE_DNS_ZONE_NAME \
    --resource-group $RESOURCE_GROUP_NAME \
    --output table

リソースのクリーンアップ

自動登録を確認できたら作成したリソースを削除します。リソースを残しておきたい方はこの作業をスキップしてください。

# リソースグループを作成する
az group delete --name $RESOURCE_GROUP_NAME

まとめ

  • Azure プライベートDNS の自動登録は仮想ネットワーク内の仮想マシンのレコードを自動で作成してくれる機能
  • 手動で仮想マシン名と同じレコードを作成した場合、自動登録の対象とならない
  • 自動登録されたレコードの削除はできるが編集はできない

参考資料