情報科学屋さんを目指す人のメモ

方法・手順・解説を書き残すブログ。私と同じことを繰り返さずに済むように。

CloudFlare APIの使い方(キャッシュを全クリアする、Python利用)

API (1) CloudFlare (9) Python (5)

CloudFlare APIを使ってみたので、API Keyの取得方法から、実際にキャッシュクリアという具体的な操作をするまでに分かったことや躓いたポイントなどなどを、ここに書き残しておきます。

CloudFlareは有料プランです。プラン表示的には「Professional (Early Bird) Plan」で利用中です。無料プランでもAPIは利用可能で、今回紹介する範囲に違いはないかと思います。

CloudFlare APIを使ってキャッシュを削除してみる

CloudFlare APIを使って、最も基本的な操作のひとつである、キャッシュのクリア(Purge Cache)を行ってみます。

curlではなく、Python(Jupyter Notebook)から。

Web UIとAPIが密接にリンク

CloudFlareの良い特徴として、Web UIに対応するAPIが、同じ場所で案内されている点です。

この通り、Web UIでの操作方法が分かれば、利用すべきAPIエンドポイントやメソッドがすぐに分かります。

しかし、「認証はどうするの?API Keyはどこ?」だったり、「URL中の『:identifier』って何を指定すれば良いの?」など、基本的な情報は、documentに飛んで該当項目を見るだけでは分からず、いろいろ読み解く必要がありました。

そのあたり、実際にやってみて分かったことを紹介していきます。

API Keyを取得する

CloudFlare APIは、登録メールアドレスとAPI Keyのペアを利用して認証できます。

登録メールアドレスは常にCloudFlareの管理画面右上に表示されるのでよいとして、問題はAPI Keyです。

自分のAPI Keyを知るにはまず、そのメールアドレスの部分をクリックして、「My Profile」を開きます

すると、「API Key」というセクションに「Global API Key」があるので、その「View API Key」をクリックします。

すると、Global API Keyが表示されるので、こちらをコピーしておきます。CloudFlare APIを呼び出す際には、これを使用します。

「zone identifier」を把握する

APIを呼び出す際は、複数のサイトをCloudFlareで管理している場合、「どのサイト/どのドメインを対象にするか」を指定する必要があります。

この指定する単位をCloudFlareでは「zone」と呼んでいるようです。そして、「zone」を指定するためには、「zone identifier」を調べる必要があります(ドメイン名などでは指定できない)。

そしてそのzone identifierを取得するためのAPIがあるので、まずはそのAPIを叩きます。

認証のためのヘッダ「X-Auth-Key」や「X-Auth-Email」を指定しつつ、エンドポイント「https://api.cloudflare.com/client/v4/zones」に対して、以下のようにGETメソッドを発行します。

import requests
import json
CLOUDFLARE_GLOBAL_API_KEY = 'abcd1234abcd1234abcd1234abcd1234abcd1'
CLOUDFLARE_ACCOUNT_EMAIL = 'example@example.com'

headers = {
    'X-Auth-Key': CLOUDFLARE_GLOBAL_API_KEY,
    'X-Auth-Email': CLOUDFLARE_ACCOUNT_EMAIL,
    'Content-Type': 'application/json'
}
r = requests.get('https://api.cloudflare.com/client/v4/zones', headers=headers)
r.json()

すると、結構大きめのjsonが結果として返ってきます。

zoneの一覧は、jsonの「result」に配列として格納されています。

そのため、zoneがひとつであれば、以下のようにして、zone identifierを取得できます。

zone_id = r.json()['result'][0]['id']

キャッシュをクリアするAPIを呼び出す

ここまでで、下準備がおわりです。

あとは実際に呼び出したかったAPI「DELETE https://api.cloudflare.com/client/v4/zones/:identifier/purge_cache」を呼び出すだけです。

r = requests.delete(
    'https://api.cloudflare.com/client/v4/zones/' + zone_id + '/purge_cache',
    headers=headers,
    data=json.dumps({'purge_everything':True}))
r.status_code

ポイントは、まずちゃんと「zone_id」を含めてあげることと、「purge_everything:true」をリクエストに含めてあげることです。headersは、先ほどと同じ認証用のヘッダを含めてあります。

これでstatus_code 200が返ってきていれば、APIの実行成功です

※キャッシュのクリアなので、成功した実感があまり湧かないのが問題ですが、Audit Log(監査ログ)のようなものもCloudFlareのProfessional Planでは用意されていないようなので(Enterpriseプランならあるかもという含み)、今ひとつ分かりにくいのが問題です。

トラブル対策

はまったポイントをメモしておきます。

zone identifierはどれ?問題

zones APIを呼び出した時、zone identifierがどれだか分かりにくかったのですが、先ほど紹介した通り、'result'の配列の各要素の'id'です(r.json()['result'][0]['id'])。

複数のzoneが存在する場合は、「r.json()['result'][0]['name']」で区別が付く(特定できる)はずです。

「Malformed JSON in request body」エラー

「{'code': 6007, 'message': 'Malformed JSON in request body'}」というエラーが出てしまいましたが、これは、request bodyに「purge_everything: true」を載せる際に、json文字列に変換するのを忘れたため発生しました。先ほどのコードサンプルの「json.dumps」を忘れると発生してしまいます。注意。

「"purge_everything" must be true」エラー

もう一つ発生してしまったエラーが「{'code': 1013, 'message': '"purge_everything" must be true'}」です。

こちらも同じ部分で、「'purge_everything': 'true'」と指定してしまっていたのが原因です。「True」はあくまで文字列ではなく論理的な「True」なので、Pythonであれば大文字で直接「True」でよかったわけです。と言うわけでそのミスを修正したものが先ほど紹介したサンプルコードになっています。

ひとこと

簡単なようで、序盤のAPI Keyまわりとzone identifierまわりは、意味の理解含め、手間取りました。

コメント(0)

新しいコメントを投稿