Rulesets API を使い、ゾーン単位で API からレート制限ルールを作成します。
レート制限ルールは、Ruleset Engine が扱う通常のルールに似ていますが、レート制限の設定を持つ ratelimit オブジェクトが追加されます。このフィールドとパラメーターの詳細は レート制限のパラメーター を参照してください。
レート制限ルールは、http_ratelimit フェーズのエントリポイントルールセット にデプロイする必要があります。
レート制限ルールは、ルール一覧の末尾に置く必要があります。
Terraform を使う場合は、Terraform でレート制限ルールを設定する を参照してください。
ゾーンに rate limiting rule を作成するには、http_ratelimit フェーズのエントリポイントルールセットにルール with a ratelimit object を追加します。
-
ゾーンのエントリポイントルールセットを取得する 操作を呼び出し、
http_ratelimitフェーズのエントリポイントルールセットの定義を取得します。この作業には ゾーン ID が必要です。 -
エントリポイントルールセットがすでに存在する場合(つまり
200 OKステータスコードとルールセット定義が返された場合)は、レスポンス内のルールセット ID を控えます。次に、ゾーンルールセットにルールを作成する 操作を呼び出し、既存のルールセットに rate limiting rule を追加します。詳細は以降の例を参照してください。 -
エントリポイントルールセットが存在しない場合(つまり手順 1 で
404 Not Foundステータスコードが返された場合)は、ゾーンルールセットを作成する 操作で作成します。rules配列に rate limiting rule を含めます。例は ルールセットの作成 を参照してください。
この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。
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 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。
この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。
新しいルールは、レート制限でブロックしたリクエスト向けの カスタムレスポンス を定義します。
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 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。
この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。
新しいルールは、レートを計算するとき、キャッシュ済みアセットへのリクエストを数えません("requests_to_origin": true)。
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 呼び出しでルールを定義する手順については、フェーズのエントリポイントルールセットにルールを追加する を参照してください。
この例では、ID が $ZONE_ID のゾーンの http_ratelimit フェーズエントリポイントルールセットに、レート制限ルールを追加します。フェーズエントリポイントルールセットはすでに存在し、ID は $RULESET_ID です。
新しいルールは複雑度ベースのレート制限ルールです。HTTP レスポンスヘッダー my-score を使って、クライアントの合計複雑度スコアを計算します。合計スコアのカウンターは、レート制限ルールのカウント式に一致したときに更新されます(この例では counting_expression が空文字列のため、ルール式と同じです)。60 秒(1 分)の期間中に合計スコアが 400 を超えると、それ以降のクライアントリクエストは 600 秒(10 分)ブロックされます。
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 の各操作を使い、作成したルールを操作できます。次の表は、ゾーン単位のレート制限ルールでよく行う作業の一覧です。
| 作業 | 手順 |
|---|---|
| ルールセット内のすべてのルールを一覧表示する |
詳細は 特定のルールセットを表示する を参照してください。 |
| ルールを更新する | Update a zone ruleset rule オペレーションを使います。 ルールセット ID とルール ID が必要です。これらの ID を取得するには、 詳細は ルールセット内のルールを更新する を参照してください。 |
| ルールを削除する | Delete a zone ruleset rule オペレーションを使います。 ルールセット ID とルール ID が必要です。これらの ID を取得するには、 詳細は ルールセット内のルールを削除する を参照してください。 |
これらのオペレーションは Ruleset Engine のドキュメントで説明しています。Ruleset Engine は rate limiting rules を含む、さまざまな Cloudflare 製品の基盤です。
アカウント単位で API からレート制限ルールをデプロイする手順は、API でレート制限ルールセットを作成する を参照してください。