Skip to content

非公式本サイトは非公式の日本語ドキュメントであり、Cloudflare 公式サイトではありません。最新情報はdevelopers.cloudflare.comをご確認ください。

クエリの基本

最終更新 Markdown で表示Agent セットアップ

GraphQL クエリの構造

GraphQL はデータをグラフとして構造化します。GraphQL はスキーマを使って、データグラフ内のオブジェクトとその階層を定義します。必要なデータを得るには、クエリでグラフのエッジをたどります。クエリはスキーマの構造に従う必要があります。

GraphQL クエリの中心は、ノードとその フィールド です。ノードは特定の のオブジェクトです。型は、オブジェクトを構成するフィールドを指定します。

フィールドは別のノードになることがあり、その場合は適切なクエリに入れ子の要素を含めます。一部のノードは関数のように見え、対象の範囲を制限する引数を取れます。各ノードにフィルターを適用できます。

Cloudflare の GraphQL スキーマ

Cloudflare の GraphQL スキーマに対する典型的なクエリは、次の 4 つの主な要素で構成されます。

  • viewer - ルートノードです
  • zones または accounts - クエリの範囲、つまりクエリしたいドメインまたはアカウントを示します。viewer は 1 つの zones または accounts、あるいは両方にアクセスできます
  • データノード または データセット - クエリしたいデータを表します。zones または accounts には 1 つ以上のデータセットが含まれます。ノードの見つけ方については、イントロスペクション を参照してください
  • フィールドセット - データセット のフィールド、または入れ子のフィールドの集まりです

Cloudflare GraphQL API へのクエリは、HTTP POST リクエストで送り、ペイロードは次のフィールドからなる JSON 形式である必要があります。

{
	"query": "",
	"variables": {}
}

上記の構造では、query フィールドには 1 行 の文字列として整形した GraphQL クエリを入れます(改行は削除またはエスケープします)。variables は、クエリ内のプレースホルダーの値をすべて含むオブジェクトです。

1 つのデータセットの例

次の例では、GraphQL クエリがゾーンスコープの firewallEventsAdaptive データセットから、2 件の WAF イベントの datetimeaction、クライアントリクエストの HTTP ホストを host フィールドとして取得します。

GraphQL クエリの例graphql
query ASingleDatasetExample($zoneTag: string, $start: Time, $end: Time) {
	viewer {
		zones(filter: { zoneTag: $zoneTag }) {
			firewallEventsAdaptive(
				filter: { datetime_gt: $start, datetime_lt: $end }
				limit: 2
				orderBy: [datetime_DESC]
			) {
				action
				datetime
				host: clientRequestHTTPHost
			}
		}
	}
}

上記のクエリには、変数プレースホルダー $zoneTag$start$end があります。これらのプレースホルダーの値は、クエリと一緒にペイロードの variables フィールドに入れます。以下の例では、文字「Z」で示す UTC タイムゾーンを使っています。

変数のセットjson
{
	"zoneTag": "<zone-tag>",
	"start": "2020-08-03T02:07:05Z",
	"end": "2020-08-03T17:07:05Z"
}

Cloudflare GraphQL API にクエリを送る方法はいくつかあります。お気に入りの GraphQL クライアントや CLI を使って、curl でリクエストを送れます。GraphiQL クライアントの使い方 のガイドがあります。curl でクエリを実行する方法は こちら を参照してください。

上記クエリのレスポンス例json
{
	"data": {
		"viewer": {
			"zones": [
				{
					"firewallEventsAdaptive": [
						{
							"action": "log",
							"host": "cloudflare.guru",
							"datetime": "2020-08-03T17:07:03Z"
						},
						{
							"action": "log",
							"host": "cloudflare.guru",
							"datetime": "2020-08-03T17:07:01Z"
						}
					]
				}
			]
		}
	},
	"errors": null
}

1 回の GraphQL API リクエストで複数のデータセットをクエリする

前述のとおり、クエリには 1 つまたは複数のノード(データセット)を含められます。API レベルではデータ抽出は同時に行われますが、すべてのデータセットクエリが結果を得るまでレスポンスは遅れます。実行中にいずれかが失敗すると、クエリ全体が打ち切られ、エラーが返されます。

2 つのデータセットを一度に取得するクエリの例graphql
query MultipleDatasetsExample(
	$zoneTag: string
	$start: Time
	$end: Time
	$ts: Date
) {
	viewer {
		zones(filter: { zoneTag: $zoneTag }) {
			last10Events: firewallEventsAdaptive(
				filter: { datetime_gt: $start, datetime_lt: $end }
				limit: 10
				orderBy: [datetime_DESC]
			) {
				action
				datetime
				host: clientRequestHTTPHost
			}
			top3DeviceTypes: httpRequestsAdaptiveGroups(
				filter: { date: $ts }
				limit: 10
				orderBy: [count_DESC]
			) {
				count
				dimensions {
					device: clientDeviceType
				}
			}
		}
	}
}
上記クエリ用の変数セットjson
{
	"zoneTag": "<zone-tag>",
	"start": "2022-10-02T00:26:49Z",
	"end": "2022-10-04T14:26:49Z",
	"ts": "2022-10-04"
}
上記のクエリと変数に対するレスポンス例json
{
	"data": {
		"viewer": {
			"zones": [
				{
					"last10Events": [
						{
							"action": "block",
							"country": "TR",
							"datetime": "2022-10-04T08:41:09Z"
						},
						{
							"action": "block",
							"country": "TR",
							"datetime": "2022-10-04T08:41:09Z"
						},
						{
							"action": "block",
							"country": "RU",
							"datetime": "2022-10-04T01:09:36Z"
						},
						{
							"action": "block",
							"country": "US",
							"datetime": "2022-10-03T14:26:49Z"
						},
						{
							"action": "block",
							"country": "US",
							"datetime": "2022-10-03T14:26:46Z"
						},
						{
							"action": "block",
							"country": "CN",
							"datetime": "2022-10-02T23:51:26Z"
						},
						{
							"action": "block",
							"country": "TR",
							"datetime": "2022-10-02T23:39:41Z"
						},
						{
							"action": "block",
							"country": "TR",
							"datetime": "2022-10-02T23:39:41Z"
						}
					],
					"top3DeviceTypes": [
						{
							"count": 4580,
							"dimensions": {
								"device": "desktop"
							}
						}
					]
				}
			]
		}
	},
	"errors": null
}

参考資料

Cloudflare Analytics API と GraphQL に関する参考記事です。

Cloudflare 固有

GraphQL フレームワークの一般情報

役に立ちましたか?