Skip to content

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

API でレート制限ルールを作成する

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

Rulesets API を使い、ゾーン単位で API からレート制限ルールを作成します。

レート制限ルールは、Ruleset Engine が扱う通常のルールに似ていますが、レート制限の設定を持つ ratelimit オブジェクトが追加されます。このフィールドとパラメーターの詳細は レート制限のパラメーター を参照してください。

レート制限ルールは、http_ratelimit フェーズのエントリポイントルールセット にデプロイする必要があります。

レート制限ルールは、ルール一覧の末尾に置く必要があります。

Terraform を使う場合は、Terraform でレート制限ルールを設定する を参照してください。

レート制限ルールを作成する

ゾーンに rate limiting rule を作成するには、http_ratelimit フェーズのエントリポイントルールセットにルール with a ratelimit object を追加します。

  1. ゾーンのエントリポイントルールセットを取得する 操作を呼び出し、http_ratelimit フェーズのエントリポイントルールセットの定義を取得します。この作業には ゾーン ID が必要です。

  2. エントリポイントルールセットがすでに存在する場合(つまり 200 OK ステータスコードとルールセット定義が返された場合)は、レスポンス内のルールセット ID を控えます。次に、ゾーンルールセットにルールを作成する 操作を呼び出し、既存のルールセットに rate limiting rule を追加します。詳細は以降の例を参照してください。

  3. エントリポイントルールセットが存在しない場合(つまり手順 1 で 404 Not Found ステータスコードが返された場合)は、ゾーンルールセットを作成する 操作で作成します。rules 配列に rate limiting rule を含めます。例は ルールセットの作成 を参照してください。

例 A - リクエストプロパティに基づくレート制限

この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。

Create a zone ruleset rulebash
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"description": "My rate limiting rule",
		"expression": "(http.request.uri.path matches \"^/api/\")",
		"action": "block",
		"ratelimit": {
				"characteristics": [
						"cf.colo.id",
						"ip.src",
						"http.request.headers[\"x-api-key\"]"
				],
				"period": 60,
				"requests_per_period": 100,
				"mitigation_timeout": 600
		}
	}'

新しいルールの位置を指定するには、ルールセット内のルールの順序を変更する のガイドラインに従い、リクエストボディに position オブジェクトを含めます。

エントリポイントルールセットを作成し、1 回の API 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。

例 B - カスタムレスポンス付きのレート制限

この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。

新しいルールは、レート制限でブロックしたリクエスト向けの カスタムレスポンス を定義します。

Create a zone ruleset rulebash
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"description": "My rate limiting rule",
		"expression": "(http.request.uri.path matches \"^/api/\")",
		"action": "block",
		"action_parameters": {
				"response": {
						"status_code": 403,
						"content": "You have been rate limited.",
						"content_type": "text/plain"
				}
		},
		"ratelimit": {
				"characteristics": [
						"cf.colo.id",
						"ip.src",
						"http.request.headers[\"x-api-key\"]"
				],
				"period": 60,
				"requests_per_period": 100,
				"mitigation_timeout": 600
		}
	}'

新しいルールの位置を指定するには、ルールセット内のルールの順序を変更する のガイドラインに従い、リクエストボディに position オブジェクトを含めます。

エントリポイントルールセットを作成し、1 回の API 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。

例 C - キャッシュ済みアセットを除外するレート制限

この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。

新しいルールは、レートを計算するとき、キャッシュ済みアセットへのリクエストを数えません("requests_to_origin": true)。

Create a zone ruleset rulebash
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"description": "My rate limiting rule",
		"expression": "(http.request.uri.path matches \"^/api/\")",
		"action": "block",
		"ratelimit": {
				"characteristics": [
						"cf.colo.id",
						"ip.src",
						"http.request.headers[\"x-api-key\"]"
				],
				"period": 60,
				"requests_per_period": 100,
				"mitigation_timeout": 600,
				"requests_to_origin": true
		}
	}'

新しいルールの位置を指定するには、ルールセット内のルールの順序を変更する のガイドラインに従い、リクエストボディに position オブジェクトを含めます。

エントリポイントルールセットを作成し、1 回の API 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。

例 D - 複雑度ベースのレート制限ルール

この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。

新しいルールは複雑度ベースのレート制限ルールです。HTTP レスポンスヘッダー my-score を使って、クライアントの合計複雑度スコアを計算します。合計スコアのカウンターは、レート制限ルールのカウント式に一致したときに更新されます(この例では counting_expression が空文字列のため、ルール式と同じです)。60 秒(1 分)の期間中に合計スコアが 400 を超えると、それ以降のクライアントリクエストは 600 秒(10 分)ブロックされます。

Create a zone ruleset rulebash
curl "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/rulesets/$RULESET_ID/rules" \
	--request POST \
	--header "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
	--json '{
		"description": "My complexity-based rate limiting rule",
		"expression": "(http.request.uri.path wildcard \"/graphql/*\")",
		"action": "block",
		"ratelimit": {
				"characteristics": [
						"cf.colo.id",
						"http.request.headers[\"x-api-key\"]"
				],
				"score_response_header_name": "my-score",
				"score_per_period": 400,
				"period": 60,
				"mitigation_timeout": 600,
				"counting_expression": ""
		}
	}'

新しいルールの位置を指定するには、ルールセット内のルールの順序を変更する のガイドラインに従い、リクエストボディに position オブジェクトを含めます。

エントリポイントルールセットを作成し、1 回の API 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。


次のステップ

Rulesets API の各操作を使い、作成したルールを操作できます。次の表は、ゾーン単位のレート制限ルールでよく行う作業の一覧です。

作業 手順
ルールセット内のすべてのルールを一覧表示する

http_ratelimit フェーズ名を指定して Get a zone entry point ruleset オペレーションを使い、設定済みの rate limiting rules とその ID の一覧を取得します。

詳細は 特定のルールセットを表示する を参照してください。

ルールを更新する

Update a zone ruleset rule オペレーションを使います。

ルールセット ID とルール ID が必要です。これらの ID を取得するには、http_ratelimit フェーズ名を指定して Get a zone entry point ruleset オペレーションを使います。

詳細は ルールセット内のルールを更新する を参照してください。

ルールを削除する

Delete a zone ruleset rule オペレーションを使います。

ルールセット ID とルール ID が必要です。これらの ID を取得するには、http_ratelimit フェーズ名を指定して Get a zone entry point ruleset オペレーションを使います。

詳細は ルールセット内のルールを削除する を参照してください。

これらのオペレーションは Ruleset Engine のドキュメントで説明しています。Ruleset Engine は rate limiting rules を含む、さまざまな Cloudflare 製品の基盤です。

関連リソース

アカウント単位で API からレート制限ルールをデプロイする手順は、API でレート制限ルールセットを作成する を参照してください。

役に立ちましたか?