CloudFlare、APIでIPを切り替える
タグ: CloudFlare
CloudFlareはCDNとファイヤーウォールのように働いてくれます。HTTPSや高度な機能を使用しない限りは無料で使用できます。
その性質上、リバースプロキシとして動作します。サブドメインごとに、別のIPへ振り分けるなど、当然できてしまいます。
海外サーバーを使用している都合上、CDNによるスピードアップと、セキュリティ強化のために使用しています。このサイトも乗っていたサーバーは定期的に安定(2月)・不安定(通常1日)を繰り返していましたが、前回DBトラブルで4日も修復にかかったため、別のサーバーに移動しました。しばらく安定していたのですが、サーバーで管理パネルであるcPanelのPHPバージョンセレクターの不具合らしく、突然PHPがまともに動かなくなりました。現在はバージョンがPHP5.4固定にされましたが、安定しているようです。
このサーバーの切り替え作業で、CloudFlareの登録IPを切り替えた際、ドメインサーバーで変更するのとは異なり、更新の反映がほとんど瞬時に行われるので、「これは使える」と思いました。
ちょっと調べると、APIも使用可能になっています。APIキーはログイン後のアカウント設定ページの一番下にありました。これはもう、「自動化につかってよ」と言っているようなものです。
これを利用すると、いちいちログインしなくても、何かが起きた時、自動的に外部からドメインに割りつけたIPを切り替えることができます。例えば、バックアップの同じ内容のサイトを用意しておき、それに切り替えるとか、固定ページだけの「トラブル中」サイトに切り替えるとかです。
その際に、調べた内容です。
ドメインの情報を取得
本来やりたいのは、特定のドメインに割りつけたIPを変更したいだけなのですが、そのAPIで対象の登録内容を表すIDが必要となります。このIDはrec_load_allというAPIの機能を利用して読み込みます。
ドキュメントに乗っているサンプルコードを変更したものをご覧ください。curlを利用して呼び出す場合です。
curl https://www.cloudflare.com/api_json.html \ -d 'a=rec_load_all' \ -d 'tkn=自分のAPIコード' \ -d 'email=自分の登録メールアドレス' \ -d 'z=example.com'
同じ内容をブラウザから呼び出すには、URLバーに以下のように入力します。
https://www.cloudflare.com/api_json.html?a=rec_load_all&tkn=自分のAPIコード&email=自分の登録メールアドレス&z=example.com
zで指定しているのは情報を取得するドメインです。CloudFlareでは、ドメインごとにDNS情報を保持しているため、登録してある自分のドメインをここに指定します。ドメインをCloudFlareに登録する際、DNSに登録するネームサーバーをCloudFladが指定するドメインに切り替える必要があるため、他人のドメインはもちろん登録できません。
結果はJSON形式で返ってきます。
{ "request": { "act": "rec_load_all", "a": "rec_load_all", "email": "sample@example.com", "tkn": "自分のAPIコード", "z": "example.com" }, "response": { - "recs": { "has_more": false, "count": 7, "objs": [ { "rec_id": "16606009", "rec_tag": "7f8e77bac02ba65d34e20c4b994a202c", "zone_name": "example.com", "name": "direct.example.com", "display_name": "direct", "type": "A", "prio": null, "content": "[server IP]", "display_content": "[server IP]", "ttl": "1", "ttl_ceil": 86400, "ssl_id": null, "ssl_status": null, "ssl_expires_on": null, "auto_ttl": 1, "service_mode": "0", - "props": { "proxiable": 1, "cloud_on": 0, "cf_open": 1, "ssl": 0, "expired_ssl": 0, "expiring_ssl": 0, "pending_ssl": 0 } }, 以下、登録済みのDNSレコード分だけ返ってくる ] } }, "result": "success", "msg": null }
省略していますが、返ってくるオブジェクトの中から、変更したいレコードを見つけ出し、そのrec_idを把握しましょう。
では、rec_idを元に、DNSレコードの内容を変更しましょう。今回はrec_idをidとして指定します。ipアドレスは、contentとして指定します。
curl https://www.cloudflare.com/api_json.html \ -d 'a=rec_edit' \ -d 'tkn=自分のAPIコード' \ -d 'id=9001' \ -d 'email=sample@example.com' \ -d 'z=example.com' \ -d 'type=A' \ -d 'name=sub' \ -d 'content=1.2.3.4' \ -d 'service_mode=1' \ -d 'ttl=1'
ブラウザを使用するなら:
https://www.cloudflare.com/api_json.html?a=rec_edit&'tkn=自分のAPIコード&id=16606009&email=sample@example.com&z=example.com&type=A&name=sub&content=1.2.3.4&service_mode=1&ttl=1
成功時の結果は:
{ - "request": { "act": "rec_edit", "a": "rec_edit", "tkn": "自分のAPIコード", "id": "23734516", "email": "sample@example.com", "type": "A", "z": "example.com", "name": "sub", "content": "96.126.126.36", "ttl": "1", "service_mode": "1" }, - "response": { - "rec": { - "obj": { "rec_id": "23734516", "rec_tag": "b3db8b8ad50389eb4abae7522b22852f", "zone_name": "example.com", "name": "sub.example.com", "display_name": "sub", "type": "A", "prio": null, "content": "96.126.126.36", "display_content": "96.126.126.36", "ttl": "1", "ttl_ceil": 86400, "ssl_id": "12805", "ssl_status": "V", "ssl_expires_on": null, "auto_ttl": 1, "service_mode": "1", - "props": { "proxiable": 1, "cloud_on": 1, "cf_open": 0, "ssl": 1, "expired_ssl": 0, "expiring_ssl": 0, "pending_ssl": 0, "vanity_lock": 0 } } } }, "result": "success", "msg": null }
APIでIPアドレスを切り替えられます。いろいろと使い道はありそうですね。まあ、お金をかけられるサービスなら、AWSのroute53でも良いのですが、なにせ無料で使用できますからね。
もちろん、CloudFlare自身にトラブルがあると、サイト自身が表示されません。今のところ、数年間使用して、CloudFlareがトラブったと考えられるのは一回だけですから、かなり安定していると思われます。