Cloudflare Postmanを使ったHTTPリクエストログ取得方法

CloudflareのLog pullを使ってログ取得をする方法について、紹介したいと思います。REST APIを使って取得するのですが、APIは大体知っている！というような方はすでに以下のような記事がありますので、こちらを見ていただくのいいかと思います。

Cloudflare の HTTP リクエストログ
https://qiita.com/khayama/items/85c87423261442a35d0b

本記事ではPostmanを使ったログ取得方法についてお話します。
あと、現時点(2021/12/15)でベータ機能であるカスタムログフィールドについても少し紹介します。


## APIに接続するための必要な情報を準備
以下の情報を用意します。

- X-Auth-Email
Cloudflareにログインするときのメールアドレスになります。

- X-Auth-Key
Cloudflareのダッシュボードにログインし、マイプロフィール -> API トークンの「API キー」にあるGlobal API Keyになります。
X-Auth-Keyの場所が良く分からない場合は、以下のリンクの「APIキーを表示する」を見てみてください。
https://support.cloudflare.com/hc/ja/articles/200167836

- ゾーン ID
Cloudflareのダッシュボードにログインし、「概要」の「ゾーンID」から確認できます。


## リクエストを投げてみる
今回はPostmanを使ってAPIにリクエスト投げてみたいと思います。Postmanは以下のリンクからインストール済みという想定で始めます。
https://www.postman.com/downloads/

まず準備した、X-Auth-Email、X-Auth-Key、ゾーンIDの情報をEnvironmentに登録します
Postmanで、New -> Environmentとクリックします
![画像5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/fbf5bdec-5f77-0080-d048-0569b982f8fc.png)


図のように、Environmentを「test」とし、「VARIABLE」と「CURRENT VALUE」に各情報を入力し、saveをクリックします。

![画像7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/1b30c80e-dc31-3b8d-8c2d-7965d8292ca0.png)

次に、HTTPリクエストを作成します。
Postmanで、New -> HTTP Requestとクリックします。
![画像1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/67c90f11-cc16-efb3-214f-bcd92d2ab4ef.png)

URLやHeadersの設定をします。DefaultではParamsが選択されていますので、Headersをクリックするようにしてください。また右上のEnvironmentは、先ほど作成したものを選択します。URLやHeadersの値は、以下になります。 
Postmanでは、{{xxxx}}とすることで、Environmentから値を呼び出すことができます。URLの{{zone_id}}もEnvironmentから呼び出しています。

>・URL　https://api.cloudflare.com/client/v4/zones/{{zone_id}}/logs/control/retention/flag
>・Headers
>1つ目 KEY: X-Auth-Email, VALUE: {{x-auth-email}}
>2つ目 KEY: X-Auth-Key, VALUE: {{x-auth-key}}


![画像6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/c4944295-ee9c-ea9d-504f-6d37331dce36.png)

設定が終わったら、Sendボタンをクリックします。
次の図のようにStatusが200 OK,　successがtrueとなっていれば、成功です。

![画像11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/be21e843-6ae0-99dd-196f-505acbf13644.png)

## ログ保持機能の有効化
Cloudflareは、デフォルトではログを保持しない設定になっていますので、設定を有効化します。
先ほど作成したPostmanのリクエストと同じように作成します。Environmentは先ほどと同じものを使います。(以降もずっと同じものを使います。)注意点としては、POSTリクエストで作成することです。その他の値については以下を参照ください。

> ・URL https://api.cloudflare.com/client/v4/zones/{{zone_id}}/logs/control/retention/flag
> ・Headers
>1つ目 KEY:X-Auth-Email, VALUE:{{x-auth-email}}
>2つ目 KEY:X-Auth-Key, VALUE:{{x-auth-key}}
>・body
> {"flag":true}

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/03b672f4-a854-a960-d6b1-8c4f6310b251.png)

リクエストを投げて、以下のように、flagやsuccessがtrueになっていれば、設定完了です。
![画像2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/81c5bbdb-4d24-e12f-a82c-812b3d67d4bb.png)


## Postman Collectionのimport

以下のリンクにあるPostmanのcollectionをimportすることで、Cloudflare API リクエストを一から作成しなくても、リクエストのテンプレートがPostmanに登録されますので、非常に便利です。以降はこのテンプレートを使いながら進めていきます。
次のリンクからPostmanのcollectionをダウンロードします。なぜかファイルが存在していないことがあるので、その場合はgoogle driveに過去のものを保存してありますので、こちらからダウンロードしてください。

https://support.cloudflare.com/hc/en-us/articles/115002323852-Using-Cloudflare-API-with-Postman-Collections

https://drive.google.com/file/d/1S3z7vYwvlVi9y06bZy0lId_KvLZt3WeW/view?usp=sharing

Postmanの画面で、Importボタンをクリックして、先ほどのリンクからダウンロードした「Cloudflare.postman_collection.json」をインポートします。

![画像9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/09204472-1f6a-4aba-afee-f64ad3705675.png)


インポートが完了すると、CollectionsにCloudflare Client API v4というのが表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/c7334c71-3941-f72e-8fc7-2c365a2f2e06.png)


## HTTP requests ログフィールド一覧の確認
APIリクエストで、どのようなログが取得できるか確認することができます。importしたPostman Collectionの Logs Received -> Fieldsのリクエストを選択します。
![画像4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/be7efc3b-59d1-fb57-2be4-68c172ae05ef.png)


Sendをクリックすると、以下のような出力結果が返ってきます。うまくいかない場合は、Environmentの設定を確認してください。

```
{
    "CacheCacheStatus": "string; unknown | miss | expired | updating | stale | hit | ignored | bypass | revalidated | dynamic | stream_hit | deferred",
    "CacheResponseBytes": "int; number of bytes returned by the cache",
    "CacheResponseStatus": "int; HTTP status code returned by the cache to the edge. All requests (including non-cacheable ones) go through the cache. Also see CacheCacheStatus field.",
    "CacheTieredFill": "bool; tiered Cache was used to serve this request",
    "ClientASN": "int; client AS number",
    "ClientCountry": "string; country of the client IP address",
    "ClientDeviceType": "string; client device type",
    "ClientIP": "string; IP address of the client",
----------------------------------<省略>----------------------------------
```
Json形式で出力が返ってきますが、Keyの部分、例えば一番上の「CacheCacheStatus」が取得できるログフィールドになります。他にもCacheResponseBytesやCacheResponseStatusなどがあることがわかると思います。

## HTTP requests ログの取得
では実際にログ取得してみます。Postman CollectionのLogs Received -> Logs Receivedを選択します。まずは単純にログ取得だけしてみたいと思いますので、図のようにParamsのstartとendだけにチェックを入れ、ログを取得する時間を記入します。
なお、以下の注意点がございますので、ご確認ください。

- ログは最大で7日前までの日時を指定
- ログを取得する時間範囲は最大で1時間
- start/endで入力するタイムスタンプは、UTC時間で入力
    - 日本時間で2021年12月12日 12時05分10秒 ~ 12時35分10秒のログを取得したい場合は、startは「2021-12-12T03:05:10Z」, endは「2021-12-12T03:35:10Z」とそれぞれ入力。(マイナス9時間した値を入れる)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/6d3b82da-2964-3420-3906-0d15299f6eeb.png)

この状態で、Sendボタンをクリックすると、以下のような出力結果が返ってきます。

```
{
    "ClientIP": "xxx.xxx.xxx.xxx",
    "ClientRequestHost": "www.xxxx.xxxx.xxx.net",
    "ClientRequestMethod": "GET",
    "ClientRequestURI": "/",
    "EdgeEndTimestamp": 1639347847383000000,
    "EdgeResponseBytes": 417,
    "EdgeResponseStatus": 304,
    "EdgeStartTimestamp": 1639347847352000000,
    "RayID": "6bca5c6dfc2e2065"
}
```

ログフィールドを指定しなくても、いくつか情報が返ってきていますがこれがデフォルトで出力されるログフィールドになります。
今度は、Paramsにfieldsも含めてリクエストを送信してみます。fieldsにチェックをいれ、valueに「ClientIP」と入力してSendをクリックします。

![画像8.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/78a678bc-0d2e-f95d-53fa-a2ea706df1f9.png)

すると、今度は次のようにClient IPの情報だけが結果として帰ってきます。

```
{
    "ClientIP": "xxx.xxx.xxx.xxx"
}
```

複数のログフィールドを取得したい場合は、fieldsのvalueにカンマ区切りでログフィールド名を入力していきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276906/e2369a67-182f-a56b-835f-198bd65ff272.png)

そうすると出力結果も以下のようにログフィールで指定したものが出力されるようになります。

```
{
    "ClientIP": "xxx.xxx.xxx.xxx",
    "ClientRequestHost": "www.xxxx.xxxx.xxx.net",
    "ClientRequestMethod": "GET"
}
```

このように取得したいログフィールド名をfieldsに入れていくことで、任意の情報を取得することができます。


## カスタムログフィールドについて
2021/12/15現在では、プライベートベータの機能ですが、ログフィールド名以外の情報を取得することが可能になる機能です。
例えば、x-forwarded-forの情報やCookieなどの情報が対象となります。この機能により、これまでよりも柔軟にログ情報を取得することが可能になります。ただ、現状では、任意のヘッダー名、例えば「ted-custom-header」などのようなものはデフォルトでは取得できず、メーカーに都度リクエストする必要がありますので、ご注意ください。


## 参考リンク

- ログ機能の有効化
https://developers.cloudflare.com/logs/logpull/enabling-log-retention

- Logpullのパラメーターやリクエスト例
https://developers.cloudflare.com/logs/logpull/requesting-logs

- Cloudflare API v4 Documentation
https://api.cloudflare.com/