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がトラブったと考えられるのは一回だけですから、かなり安定していると思われます。