Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

さくらのクラウド DNSサーバのレコード編集時の反映時間を可視化する

dehydratedとさくらのクラウドDNSを使った証明書取得の記事を書いておりますが、

kazeburo.hatenablog.com

DNS-01 チャレンジを使って証明書を作成しようとする際に気になるのはDNSレコードの登録から、実際に反映するまでの待ち時間だったりします。dehydratedのhookスクリプトの例をみていると、30秒ほどsleepしているものもあったりします。

github.com

そこで、さくらのクラウドDNS機能のクライアントである sacloudns コマンドとmackerelをつかって、ゾーンへのレコード追加削除など編集から実際にDNSへの反映にかかる時間を可視化してみました。

github.com

計測方法

sacloudnsコマンドを使って適当なレコードを更新するshell scriptを書きます。

$ cat time-taken.sh 
#!/bin/sh
set -e
export SAKURACLOUD_ACCESS_TOKEN="xxx"
export SAKURACLOUD_ACCESS_TOKEN_SECRET="xxx"
TOKEN_VALUE=$(openssl rand -hex 18)

sacloudns rset --wait --wait-timeout=80s --zone example.com --name time-taken --ttl 30 --type TXT --data ${TOKEN_VALUE}

sacloudnsコマンドは、TXTレコードを追加・編集した際にのみ --wait というオプションが使えます。--wait オプションを指定して実行すると、ゾーン編集リクエストをさくらのクラウドAPIに送信したのち、指定されたゾーンのNSレコードからDNSサーバを調べ、そのDNSサーバに対して、2秒おきに実際に更新されているか名前解決を行うことで、実際に更新されるまで待つことができる機能です。ACMEdns-01チャレンジをスムーズに行うためにつくったものですが、今回これを利用します。

このshell scriptをcronで実行し、mackerelに送信するのが次のcrontabの設定です。

*/5 * * * * mkr wrap -n sacloud-dns-rset -d -a -- bash -c 'set -e -o pipefail; \
  /opt/mackerel-agent/plugins/bin/mackerel-plugin-command-status \
  --timeout 90s -n sacloud-dns-rset -- sh /path/to/time-taken.sh  | mkr throw -s my-service'

mkr wrap はコマンドを実行しエラーがあった場合、mackerelのアラートを発生させるコマンドです。sacloudnsコマンドが失敗した際にわかるようにしています。

mackerel-plugin-command-status は与えられたコマンドを実行し、その終了コードとかかった時間をメトリクスにするmackerelのプラグインです。

kazeburo.hatenablog.com

こちらで紹介してますが、バージョン 0.0.2 でかかった時間もメトリクスとして取得できるようになりました。

ホストのメトリクスとして使うことを想定したプラグインではありますが、crontabを実行するサーバを変更してもメトリクスが残るよう、mackerel-plugin-command-statusの結果をサービスメトリクスとして mkr throw を使って送信しています。

これで5分ごとにDNSを更新し、かかった時間をmackerelに投稿できました。

可視化結果

結果はこんな感じ。

f:id:kazeburo:20210317003256p:plain

グラフをみると、大体は20秒強、あるいは45秒前後で終わっているようです。また、APIのレスポンスに時間がかかったのか、反映の待ち時間が長かったのかはここではわかりませんが、たまに60秒以上かかることもあるようです。

これらを指標としつつ、改善していきたい所存です。