一括 IP ルックアップ API:レート制限を考えた設計
一括 IP ルックアップ API を使うと、アドレスごとに1回ずつ呼び出すのではなく、多数のアドレスを1回のリクエストで解決できます。その周辺のアーキテクチャは、最大バッチサイズ、使用できるリクエスト予算、同じ問い合わせを繰り返さずに済む度合いという3つの制約に集約されます。この記事では、具体的な数値に ipto の一括エンドポイントを用いて、実用的な設計を順に説明します。
一括 IP ルックアップエンドポイントが受け付けるもの
ipto の一括ルックアップは、IP 文字列の JSON 配列を付けて /v1/ip/bulk に POST するものです。1回のリクエストで最大100アドレスまで受け付け、重複は処理前に取り除かれ、レスポンスは IP アドレスをキーとするオブジェクトで、各エントリーは、国、都市、ASN、組織、そして is_vpn、is_tor、is_abuser、is_datacenter と bogon の各フィールドを含む単一ルックアップの結果と同じ形をしています。一括は有料プランの機能で Pro と Enterprise で利用でき、Free プランはサインアップ不要で1日1,000リクエストの単一ルックアップを対象としています。現在のリクエスト形式は API ドキュメントで確認してください。
重要な課金上の注意点として、一括は項目ごとに課金されます。100アドレスのバッチは、100回の個別ルックアップとまったく同じく、1日の予算に対して100とカウントされます。したがって、バッチ処理でクォータが伸びることはありません。節約できるのは往復回数、接続の確立、クライアント側の調整であり、ログファイルや顧客リストを補完する際には、これが実際のボトルネックになることがよくあります。
予算を軸にパイプラインを設計する
どのアドレスも予算を消費するため、最も安いリクエストは送らないリクエストです。まずはフィルタリングから始めましょう。プライベートアドレスや予約アドレスには意味のあるジオロケーションがないため、ローカルで除外するか、bogon IP チェッカーで分類すれば、コストをかけずに済みます。残ったセットは重複を排除してください。本番のログでは、少数のリピート訪問者、クローラー、NAT ゲートウェイが大半を占めるためです。バッチ処理の前段にハッシュセットを置くのが、通常は最も効果の高い変更になります。
次に、関心のあるデータの変化の速さに見合った有効期間(TTL)を持つ、アドレスをキーとしたキャッシュを追加します。国と ASN の対応は長期間安定しているため、数日で問題ありません。評判フラグはより速く変わります。ipto の脅威フィードは6時間ごと、IP と ASN のデータセットは毎日更新されるため、判定を数時間より長くキャッシュすると、節約できる分は少なく、古さだけが増えます。可能ならフィールドごとに別々の TTL を持たせるか、結果全体を短いほうの TTL でキャッシュしてください。
- bogon と明らかに無効な入力はローカルでフィルタリングする。
- ジョブ内およびキャッシュに対して重複を排除する。
- 残ったアドレスを最大100件ずつのグループに分割する。
- チャンクは一度にすべてではなく、並行数に上限を設けて送信する。
- 結果を、アドレスをキーにしてキャッシュと保存先のストアに書き込む。
並行処理、バックオフ、1日のウィンドウ
1日の予算は固定ウィンドウなので、設計上注意すべき失敗パターンは、ジョブの途中で予算を使い切ることです。開始前にコストを見積もってください。ユニークで bogon でないアドレスの数が、そのジョブが消費するリクエスト数になります。それが今日の残りを超える場合は、ジョブを複数のウィンドウに分割するか、最も価値の高いアドレスを優先するか、最もリスクの高いものだけ単一ルックアップに切り替えます。進捗は永続化し、再起動したジョブが最初からではなく最後に完了したチャンクから再開できるようにしてください。
並行数は控えめにします。各チャンクがすでに100件のルックアップを含んでいるため、数個の並列チャンクでほぼ常に十分で、際限のない並列化は障害の原因究明を難しくするだけです。一時的なエラーや予算超過のレスポンスには、ジッター付きの指数バックオフでリトライし、予算の枯渇は、すぐに再試行を繰り返すのではなく、停止して後で再開するというシグナルとして扱ってください。リトライされたチャンクが行を二重に挿入しないよう、すべての書き込みを冪等にしてください。
一括と単一ルックアップの使い分け
サインアップフォームやチェックアウトのようなリアルタイムの経路では、イベントごとに単一ルックアップを使います。遅延が小さく、キャッシュが繰り返しを吸収し、実際に届いたアドレスにだけ予算を使います。一括はオフライン作業向けで、テーブルのバックフィル、1日分のログのスコアリング、許可リストの監査などです。生の補完ではなくリスクスコアリングが目的なら、不正スコアチェッカーが IP、メール、電話、User-Agent のシグナルを0~100の単一スコアにまとめるため、複数の個別呼び出しの代わりになります。プロバイダー間の無料枠の制限をより詳しく比較したものは、無料枠のレート比較をご覧ください。
最後に、自分の利用状況を記録してください。ジョブごとに消費したリクエスト数、キャッシュヒット率、bogon や重複として除外されたアドレスの割合を追跡します。この3つの数値を見れば、予算のアラームが鳴るよりずっと前に、アーキテクチャが機能しているかどうかがわかります。
大きなバッチをスクリプト化する前に、まず少数のアドレスを手作業で試してみてください。ASN ルックアップを使えば、ログに繰り返し現れるレンジを所有しているネットワークがわかり、何千もの単一ルックアップの代わりに、ネットワーク全体を1つの判断で扱えることがよくあります。