レート制限ポリシーの操作

Fastly エッジレート制限機能を使用して、レート制限ポリシーを作成することができます。レート制限ポリシーを作成する際、リクエストの数と時間を追跡する条件を定義します。累積したカウント数は、1秒、10秒、または60秒のうち、設定した時間枠に基づいて計算された推定レートに変換されます。レートは、1秒あたりのリクエスト数 (RPS) で測定されます。レート制限を超えた場合、Fastly はイベントをログに記録し、指定した期間中の後続リクエストをブロックすることもできます。

レート制限ポリシーの作成

これらの手順に従って、レート制限ポリシーを作成します。

  1. Fastly コントロールパネルにログインし、Secure リンクをクリックします。Secure ページでは、Fastly のセキュリティ製品の概要が表示されます。
  2. Manage rate limiting policies をクリックします。
  3. Add Rate Limiting to a service をクリックします。Rate limiting ページが表示されます。

    Rate limiting ページ

  4. Policy name フィールドにポリシーの分かりやすい名前を入力します。この名前はレート制限ダッシュボードに表示されます。
  5. Service メニューから、ポリシーを適用するサービスとバージョンを選択します。検索ボックスを使用して ID または名前を検索します。
  6. Detect セクションのフィールドに入力し、レート制限ポリシーの検出条件を定義します。
    • Destination to protect フィールドで、オリジンへのすべてのトラフィックを保護するか、エッジディクショナリを介して特定のリクエストを保護するかを選択します。選択したサービスにディクショナリがない場合、このオプションは無効になります。
    • HTTP methods フィールドで、検出するリクエストの種類の隣のチェックボックスを選択します。
    • Requests per second フィールドに、レート制限を適用する前に検出ウィンドウ内でカウントする 1 秒あたりの最大リクエスト数を入力します。効果的な動作を実証するためにこの機能でサポートされている最低レート制限は 100 RPSです。100 RPS を超える制限を使用すると、予測不可能な精度と検出時間が発生する可能性があります。
    • Detection window フィールドで、レート制限ウィンドウの期間を選択します。ウィンドウに設定される期間によって、お客様のオリジンへの過度のトラフィックを検知するのにかかる時間 (TTD) を割り出すことができます。短い時間枠を使用することで正確さは多少損なわれますが、検知までの時間を短縮することができます。詳細については、制約と注意事項をご参照ください。
    • Client keys メニューから、IPUser-Agent、または IP and User-Agent を選択します。
  7. Response セクションで、レート制限ポリシーを超える Fastly がどのように対応するかを選択し、表示される追加フィールドに入力します。
    • Block with custom response: レート制限を超えた場合にリクエストがブロックされ、ブラウザにカスタムレスポンスが表示されます。ブロックしてカスタムレスポンスを返すを参照してください。
    • Block with response object: レート制限を超えた場合にリクエストがブロックされ、ブラウザにレスポンスオブジェクトが表示されます。このオプションを使用するには、レスポンスオブジェクトが作成されている必要があります。ブロックしてレスポンスオブジェクトを返すを参照してください。
    • Log only: レート制限を超えた場合、ログに記録されるだけでリクエストはそのまま処理されます。ログのみを参照してください。
  8. Save policy をクリックします。

より具体的な保護のためのディクショナリの使用

エッジレート制限では、エッジディクショナリを使用して保護するパスを指定できます。ディクショナリ内のキーと値のペアにキーとして保護するパスを指定する必要があります。例えば /checkout など、特定の API を保護したい場合は、キーが /checkout で値が Checkout のキーと値のペアを作成します。

以下の点に注意してください。

  • キーは相対パスを使用して指定し、末尾に / を使用しないでください。
  • クエリ文字列は除外されます。
  • 正規表現を使用するキーはサポートされていません。

ブロックしてカスタムレスポンスを返す

Block with custom response を選択すると、レート制限を超えた場合にリクエストがブロックされ、カスタムレスポンスが表示されます。このオプションを選択すると、以下のフィールドが利用可能になります。

Block with custom response フィールド

  • Status フィールドに、ブラウザに表示する HTTP ステータスコードを入力します。
  • MIME type フィールドにメディアタイプの識別子を入力します。すべての MIME タイプは、Response フィールドに入力したテキストと互換性がある場合に限り指定することができます。
  • Response フィールドに、レート制限を超えた場合にブラウザに表示されるカスタムレスポンスを入力します。
  • Response duration フィールドに、レートリミッターがリセットされ、ブロックが解除されるまでカスタムレスポンスが表示される時間を分単位で入力します。

ブロックしてレスポンスオブジェクトを返す

Block with response object を選択すると、レート制限を超えた場合にリクエストがブロックされ、レスポンスオブジェクトが表示されます。このオプションを使用するには、レスポンスオブジェクトが作成されている必要があります。このオプションを選択すると、以下のフィールドが利用可能になります。

Block with response object フィールド

  • Response object メニューから、レート制限を超えた場合にブラウザに表示されるレスポンスオブジェクトを選択します。
  • Response duration フィールドに、レートリミッターがリクエストをリセットおよびブロック解除する前にカスタムレスポンスが表示される時間を分単位で入力します。

ログのみ

Log only を選択すると、レート制限を超えた場合、ログに記録されるだけでリクエストはそのまま処理されます。デフォルトでは、timestamppolicy_nameurllimitwindowentryrate のフィールドがログに記録されます。

このオプションを選択すると、Logging provider メニューが利用可能になります。ログの送信先として設定したいログエンドポイントを選択します。Save policy をクリックすると、指定したプロバイダーのログエンドポートを作成するため、略された形式で表示されます。フィールドに入力し、Save をクリックします。

Log only フィールド

ログ形式

Log only オプションを選択すると、以下の JSON ログ形式が使用されます。これらのスキーマは、異なるログプロバイダーにデータが書き込まれる方法を理解するのに役立ちます。

別段の指定がない場合、デフォルトフォーマットを使用して、レート制限を超える特定のポリシーに関する情報をログに記録します。

デフォルト

{
  "timestamp": “%{strftime({"%Y-%m-%dT%H:%M:%S"}, time.start)}V”,
  "policy_name": "%{json.escape(“<rate limiter name>”)}V”,
  "url": “%{json.escape(req.url)}V”,
  "limit": <limit>,
  "window": <window>,
  "entry": "<entry>",
  "rate":  “<rate>"
}

Datadog

{
  "time_start": “%{strftime({"%Y-%m-%dT%H:%M:%S%Z"}, time.start)}V”,
  "ddsource": "fastly",
  "service": “%{req.service_id}V",
  "policy_name": "%{json.escape(“<rate limiter name>”)}V”,
  "url": “%{json.escape(req.url)}V”,
  "limit": <limit>,
  "window": <window>,
  "entry": "<entry>",
  "rate":  “<rate>"
}

Honeycomb

{
  "time": “%{strftime({"%Y-%m-%dT%H:%M:%SZ"}, time.start)}V”,
  "data":{
    "service_id": “%{req.service_id}V",
    "policy_name": "%{json.escape(“<rate limiter name>”)}V”,
    "url": “%{json.escape(req.url)}V”,
    "limit": <limit>,
    "window": <window>,
    "entry": "<entry>",
    "rate":  “<rate>"
  }
}

セキュリティープロダクトに関する追記

WAF や DDoS 緩和などのすべてのセキュリティサービスは、Fastly が提供するものも含め、あらゆる悪意ある攻撃や脅威を検知することが可能なわけではありません。サブスクライバーとして、すべての Web アプリケーションとオリジンに対して適切なセキュリティコントロールを確保する必要があります。Fastly のセキュリティ製品の使用は、この義務を免除されません。サブスクライバーとして、これらのサービスを本番環境にデプロイする前に、可能な限り Fastly のセキュリティサービスの有効性をテストおよび検証し、パフォーマンスを継続的にモニタリングし、Web アプリケーション、オリジンサービス、および Fastly サービスのその他の要素の変更に対処するようにこれらのサービスを調整する必要があります。

Back to Top