オンプレ 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
参考