さくらのクラウド DNSサーバのレコード編集時の反映時間を可視化する
dehydratedとさくらのクラウドのDNSを使った証明書取得の記事を書いておりますが、
DNS-01 チャレンジを使って証明書を作成しようとする際に気になるのはDNSレコードの登録から、実際に反映するまでの待ち時間だったりします。dehydratedのhookスクリプトの例をみていると、30秒ほどsleepしているものもあったりします。
そこで、さくらのクラウドのDNS機能のクライアントである sacloudns
コマンドとmackerelをつかって、ゾーンへのレコード追加削除など編集から実際にDNSへの反映にかかる時間を可視化してみました。
計測方法
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秒おきに実際に更新されているか名前解決を行うことで、実際に更新されるまで待つことができる機能です。ACMEのdns-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のプラグインです。
こちらで紹介してますが、バージョン 0.0.2 でかかった時間もメトリクスとして取得できるようになりました。
ホストのメトリクスとして使うことを想定したプラグインではありますが、crontabを実行するサーバを変更してもメトリクスが残るよう、mackerel-plugin-command-statusの結果をサービスメトリクスとして mkr throw
を使って送信しています。
これで5分ごとにDNSを更新し、かかった時間をmackerelに投稿できました。
可視化結果
結果はこんな感じ。
グラフをみると、大体は20秒強、あるいは45秒前後で終わっているようです。また、APIのレスポンスに時間がかかったのか、反映の待ち時間が長かったのかはここではわかりませんが、たまに60秒以上かかることもあるようです。
これらを指標としつつ、改善していきたい所存です。