レート制限ポリシーの操作
最終更新日 2023-03-31
Fastly レート制限機能を使用して、レート制限ポリシーを作成することができます。レート制限ポリシーを作成する際、リクエストの数と時間を追跡する条件を定義します。累積したカウント数は、1秒、10秒、または60秒のうち、設定した時間枠に基づいて計算された推定レートに変換されます。レートは、1秒あたりのリクエスト数 (RPS) で測定されます。レート制限を超えた場合、Fastly はイベントをログに記録し、指定した期間中の後続リクエストをブロックすることもできます。
レート制限ポリシーの作成
これらの手順に従って、レート制限ポリシーを作成します。
- Fastly コントロールパネルにログインし、Secure リンクをクリックします。Secure ページでは、Fastly のセキュリティ製品の概要が表示されます。
- Manage rate limiting policies をクリックします。
- Add Rate Limiting to a service をクリックします。Rate limiting ページが表示されます。
- Policy name フィールドにポリシーの分かりやすい名前を入力します。この名前はレート制限ダッシュボードに表示されます。
- Service メニューから、ポリシーを適用するサービスとバージョンを選択します。検索ボックスを使用して ID または名前を検索します。
- Detect セクションのフィールドに入力し、レート制限ポリシーの検出条件を定義します。
- Destination to protect フィールドで、オリジンへのすべてのトラフィックを保護するか、エッジディクショナリを介して特定のリクエストを保護するかを選択します。選択したサービスにディクショナリがない場合、このオプションは無効になります。
- HTTP methods フィールドで、検出するリクエストの種類の隣のチェックボックスを選択します。
- Requests per second フィールドに、レート制限を適用する前に検出ウィンドウ内でカウントする 1 秒あたりの最大リクエスト数を入力します。効果的な動作を実証するためにこの機能でサポートされている最低レート制限は 100 RPSです。100 RPS を超える制限を使用すると、予測不可能な精度と検出時間が発生する可能性があります。
- Detection window フィールドで、レート制限ウィンドウの期間を選択します。ウィンドウに設定される期間によって、お客様のオリジンへの過度のトラフィックを検知するのにかかる時間 (TTD) を割り出すことができます。短い時間枠を使用することで正確さは多少損なわれますが、検知までの時間を短縮することができます。詳細については、制約と注意事項をご参照ください。
- Client keys メニューから、IP、User-Agent、または IP and User-Agent を選択します。
- Response セクションで、レート制限ポリシーを超える Fastly がどのように対応するかを選択し、表示される追加フィールドに入力します。
- Block with custom response: レート制限を超えた場合にリクエストがブロックされ、ブラウザにカスタムレスポンスが表示されます。ブロックしてカスタムレスポンスを返すを参照してください。
- Block with response object: レート制限を超えた場合にリクエストがブロックされ、ブラウザにレスポンスオブジェクトが表示されます。このオプションを使用するには、レスポンスオブジェクトが作成されている必要があります。ブロックしてレスポンスオブジェクトを返すを参照してください。
- Log only: レート制限を超えた場合、ログに記録されるだけでリクエストはそのまま処理されます。ログのみを参照してください。
- Save policy をクリックします。
より具体的な保護のためのディクショナリの使用
エッジレート制限では、エッジディクショナリを使用して保護するパスを指定できます。ディクショナリ内のキーと値のペアにキーとして保護するパスを指定する必要があります。例えば /checkout
など、特定の API を保護したい場合は、キーが /checkout
で値が Checkout
のキーと値のペアを作成します。
以下の点に注意してください。
- キーは相対パスを使用して指定し、末尾に
/
を使用しないでください。 - クエリ文字列は除外されます。
- 正規表現を使用するキーはサポートされていません。
ブロックしてカスタムレスポンスを返す
Block with custom response を選択すると、レート制限を超えた場合にリクエストがブロックされ、カスタムレスポンスが表示されます。このオプションを選択すると、以下のフィールドが利用可能になります。
- Status フィールドに、ブラウザに表示する HTTP ステータスコードを入力します。
- MIME type フィールドにメディアタイプの識別子を入力します。すべての MIME タイプは、
Response
フィールドに入力したテキストと互換性がある場合に限り指定することができます。 - Response フィールドに、レート制限を超えた場合にブラウザに表示されるカスタムレスポンスを入力します。
- Response duration フィールドに 1 から 60 までの値を入力し、レートリミッターがリセットされてブロックが解除されるまでの間、カスタムレスポンスが表示される時間を分単位で決定します。
ブロックしてレスポンスオブジェクトを返す
Block with response object を選択すると、レート制限を超えた場合にリクエストがブロックされ、レスポンスオブジェクトが表示されます。このオプションを使用するには、レスポンスオブジェクトが作成されている必要があります。このオプションを選択すると、以下のフィールドが利用可能になります。
- Response objectメニューから、レート制限を超えるとブラウザに表示されるレスポンスオブジェクトを選択します。選択されたレスポレスポンスオブジェクトに条件が付いていること、あるいはすべてのリクエストに対してレスポンスが返されることを確認
注意
してください。
- Response duration フィールドに、レートリミッターがリクエストをリセットおよびブロック解除する前にカスタムレスポンスが表示される時間を分単位で入力します。
ログのみ
Log only を選択すると、レート制限を超えた場合、ログに記録されるだけでリクエストはそのまま処理されます。デフォルトでは、timestamp
、policy_name
、url
、limit
、window
、entry
、rate
のフィールドがログに記録されます。
注意
timestamp
フィールドの代わりに、Datadog は time_start
を、Honeycomb は time
をログに記録します。
このオプションを選択すると、Logging provider メニューが利用可能になります。ログの送信先として設定したいログエンドポイントを選択します。Save policy をクリックすると、指定したプロバイダーのログエンドポートを作成するため、略された形式で表示されます。フィールドに入力し、Save をクリックします。
ログ形式
Log only オプションを選択すると、以下の JSON ログ形式が使用されます。これらのスキーマは、異なるログプロバイダーにデータが書き込まれる方法を理解するのに役立ちます。
別段の指定がない場合、デフォルトフォーマットを使用して、レート制限を超える特定のポリシーに関する情報をログに記録します。
デフォルト
1{2 "timestamp": “%{strftime({"%Y-%m-%dT%H:%M:%S"}, time.start)}V”,3 "policy_name": "%{json.escape(“<rate limiter name>”)}V”,4 "url": “%{json.escape(req.url)}V”,5 "limit": <limit>,6 "window": <window>,7 "entry": "<entry>",8 "rate": “<rate>"9}
Datadog
1{2 "time_start": “%{strftime({"%Y-%m-%dT%H:%M:%S%Z"}, time.start)}V”,3 "ddsource": "fastly",4 "service": “%{req.service_id}V",5 "policy_name": "%{json.escape(“<rate limiter name>”)}V”,6 "url": “%{json.escape(req.url)}V”,7 "limit": <limit>,8 "window": <window>,9 "entry": "<entry>",10 "rate": “<rate>"11}
Honeycomb
1{2 "time": “%{strftime({"%Y-%m-%dT%H:%M:%SZ"}, time.start)}V”,3 "data":{4 "service_id": “%{req.service_id}V",5 "policy_name": "%{json.escape(“<rate limiter name>”)}V”,6 "url": “%{json.escape(req.url)}V”,7 "limit": <limit>,8 "window": <window>,9 "entry": "<entry>",10 "rate": “<rate>"11 }12}