[CloudFlare] CloudFlare API(v4)でDNSレコードのIPアドレスを更新する (自動更新もOK)
CDNとしてだけなく、DNSサーバーとしても優秀なCloudFlare。今回は、APIを使ってプログラムから自分のドメインのDNSレコードのIPアドレスを更新してみます。
公開日: 2018.4.10
下準備
まずは、APIを使うために、必要なキーやIDを集めていきます。
ちなみに、今回試すのはAPI(v4)です。
URLが「https://www.cloudflare.com/api_json.html」から始まるものは、(v1)です。(v1)と今回の記事(v4)とは、書き方が大幅に違います。
- v1: https://www.cloudflare.com/api_json.html/…….
- v4: https://api.cloudflare.com/client/v4/……. <— 今回はこちら
ネット上には結構API(v1)の記事があるので、他の記事をご覧になってから、こちらで部分的に変更を加える場合は、バージョンがあっているかを注意してください。
CloudFlareのAPIキーを取得する
CloudFlareのMy ProfileページのAPI Keyのところから、Global API Keyを取得します。
これは後で使うので控えておきます。このページでは今後、Global API Keyを「グローバルAPIキー」と表現します。出てきたら、このコードを挿入するものと思ってください。
zone_idとrecord_idを取得する
CloudFlareのAPIを叩く場合必ずzone_idとrecord_idが必要になりますので、こちらもAPIを叩いて取得しておきます。
まずは、zone_idを取得します。
ターミナルなどから下記のコマンドを実行します。
curl -X GET "https://api.cloudflare.com/client/v4/zones?name=ドメイン名&status=active&page=1&per_page=20&order=status&direction=desc&match=all"
-H "X-Auth-Email: 登録メールアドレス"
-H "X-Auth-Key: グローバルAPIキー"
-H "Content-Type: application/json"
返って来た値の、
{"result":[{"id":"乱数",
の「乱数」部分に入っている英数字がzone_idです。以降、ゾーンIDと表記します。
続いて、record_idは下記のコマンドで取得できます。同じようにターミナルから、
curl -s -X GET "https://api.cloudflare.com/client/v4/zones/ゾーンID/dns_records?name=更新したいドメインレコード" -H "X-Auth-Email: 登録メールアドレス" -H "X-Auth-Key: グローバルAPIキー" -H "Content-Type: application/json" | grep -Po '(?<="id":")[^"]*'
*更新したいドメインレコードの部分は、hoge.example.comなどのようにサブドメインも含めます。
で、取得します。返って来た値がrecord_idです。こちらは以降、レコードIDと表記します。
更新する
さて、それでは実際に更新をしてみます。
コマンドラインから実行
curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/ゾーンID/dns_records/レコードID" -H "X-Auth-Email: 登録メールアドレス" -H "X-Auth-Key: グローバルAPIキー" -H "Content-Type: application/json" --data "{"type":"A","name":"更新したいドメイン","content":"IPアドレス"}"
返って来た値の最後のほうが
"success":true,"errors":[],"messages":[]}
となっていれば成功です。実際にCloudFlareのページで確認してみてください。
サーバーに実行ファイルを置いて自動で更新させる
いつか使うことになると思うので、実行ファイルにしてみました。
自サーバーのIPアドレスをAPIでCloudFlareに登録します。
vi set-ip.sh
#!/bin/bash
IP=$(curl http://c0d3man52.starfree.jp/get_ip.php)
echo $IP
update=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/ゾーンID/dns_records/レコードID" -H "X-Auth-Email: 登録メールアドレス" -H "X-Auth-Key: グローバルAPIキー" -H "Content-Type: application/json" --data "{"type":"A","name":"更新したいドメイン","content":"$IP"}")
echo $update
必要部分を書き換えて、保存して実行してみてください。
cronジョブなどに登録をしておけば、AWSのEC2やGCPのGCEで、静的外部IPを取得していない場合でも、サービス側から自動で振られたIPを登録自動で登録してくれるので便利です、多分。
ちなみに、最初に出てくる「http://c0d3man52.starfree.jp/get_ip.php」は、アクセスしてきたIPアドレスをjson形式でただ返すだけの自作プログラムです。
スターサーバーさんのフリープランにおかせてもらっているので、あまりたくさんアクセスしないでくださいね。
設定出来る項目
詳しくはCloudFlareのAPIドキュメントを見ていただきたいのですが、下記の項目を –data以降のjson配列の部分に追加すれば、更新をかけられます。
- ttl: TTLを更新できます。
- proxied: CloudFlareプロキシを通すか?trueで管理画面の雲マークがオンになります。
以上、CloudFlare APIでDNSレコードのIPアドレスを変更する方法を見ていきました。
CloudFlare APIは、updateだけでなく、createdやdeleteもできるので、使いこなすといろいろとサイト管理が楽になりそうです。
最近はレンタルサーバーでもAPIを提供しているところが増えてきたので、APIをうまく使ってサイトの更新や構築を高速化したいところです。