CloudFlare、APIでIPを切り替える

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