😀

Azure DNS で一時的に TTL を短くしておいて後から戻す AzureCLI を試してみた

に公開

オンプレ DNS から AzrueDNS に DNS ゾーンを移行する時など、一時的に DNS レコードの TTL を短くして、クライアントのネガティブキャッシュを含むキャッシュを短くしておいて切り替えたい場合があります。DNS ゾーン数や DNS レコード数が少なければ手動でも良いのですが、複数あると面倒です。そこで AzureCLI を使って Azure DNS に設定済みの TTL を含むレコード情報を全て JSON で保存しておき、TTL を 600 秒に設定したのち、TTL を戻す一連の動作を検証してみました。

検証環境を準備

bash
# 環境変数をセットします
prefix=mnrdns
region=japaneast

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# example.jp ゾーンを作成します
az network dns zone create \
  --resource-group ${prefix}-rg \
  --name example.jp

# example.jp に A レコードを作成します
az network dns record-set a add-record \
  --resource-group ${prefix}-rg \
  --zone-name example.jp \
  --record-set-name www \
  --ipv4-address 93.184.216.34

# example.com ゾーンを作成します
az network dns zone create \
  --resource-group ${prefix}-rg \
  --name example.com

# example.com に A レコードを作成します
az network dns record-set a add-record \
  --resource-group ${prefix}-rg \
  --zone-name example.com \
  --record-set-name www \
  --ipv4-address 93.184.216.34

Azure DNS ゾーンのリストを取得

bash
zones=$(az network dns zone list \
  --resource-group ${prefix}-rg \
  --query "[].name" \
  --output tsv)

Azure DNS ゾーンのレコード情報を保存

bash
for zone in ${zones[@]}; do
  echo "--- $zone ---"
  az network dns record-set list \
    --resource-group ${prefix}-rg \
    --zone-name $zone \
    > $zone.json
done

全レコードの TTL を 600 秒に設定

bash
for zone in ${zones[@]}; do
  echo "--- $zone ---"
  ids=$(cat $zone.json | jq -r .[].id)
  for id in ${ids[@]}; do
    echo $id
    az resource update \
      --set properties.TTL=600 \
      --ids $id
  done
done

保存しておいた JSON から TTL を戻す

bash
for zone in ${zones[@]}; do
  echo "--- $zone ---"
  lines=$(cat $zone.json | jq -c '.[] | {id,TTL}')
  for line in ${lines[@]}; do
    id=$(echo $line | jq -r .id)
    ttl=$(echo $line | jq -r .TTL)
    echo "$ttl : $id"
    az resource update \
      --set properties.TTL=$ttl \
      --ids $id
  done
done

検証環境を削除

bash
az group delete \
  --name ${prefix}-rg \
  --yes

参考

https://learn.microsoft.com/ja-jp/cli/azure/network/dns/record-set?view=azure-cli-latest#az-network-dns-record-set-list-examples

https://learn.microsoft.com/ja-jp/cli/azure/resource?view=azure-cli-latest#az-resource-update

Discussion