[CloudFlare] CloudFlare API(v4)でDNSレコードのIPアドレスを更新する (自動更新もOK)

CDNとしてだけなく、DNSサーバーとしても優秀なCloudFlare。今回は、APIを使ってプログラムから自分のドメインのDNSレコードのIPアドレスを更新してみます。

下準備

まずは、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をうまく使ってサイトの更新や構築を高速化したいところです。