【実務・中級編】 Microsoft Graph APIを用いたCASBのテナント監視におけるHTTPステータスコード429(Too Many Requests) – ゼロトラスト&エンタープライズセキュリティ実践ガイド

現場で泣かないための「429 Too Many Requests」攻略:Microsoft Graph APIとCASBの仁義なき戦い

ネットワークの最前線で戦うエンジニア諸君、今日もパケットの荒波を乗りこなしているだろうか。

ゼロトラスト全盛の今、SASEやCASBはもはや「あれば便利」なツールではなく、企業の生命線を守る防波堤だ。特に、Microsoft 365の監査ログをCASBが吸い上げる際、避けて通れないのが「APIレートリミット」という名の壁である。

「なぜかログが歯抜けになる」「監視ダッシュボードが真っ赤に染まる」。その原因の多くは、Microsoft Graph APIから返される無慈悲な 429 Too Many Requests エラーだ。今日は、この泥臭いトラブルをスマートに捌くための「攻めの守り方」を伝授しよう。

—

なぜ「429」は現場のエンジニアを苦しめるのか?

Microsoft Graph APIは、公平なリソース利用のために非常に厳格なスロットリング(帯域制限)を設けている。CASBが広大なテナントのログをポーリングする際、大量のHTTPリクエストを短時間に投げつけると、APIゲートウェイは即座に「お前は喋りすぎだ」と遮断してくる。

ここで重要なのが、429 ステータスコードと共に返される Retry-After ヘッダーだ。多くのエンジニアが見落としがちだが、この値こそが「次にいつなら通信していいか」を教える唯一の救いの手である。

標準的な通信シーケンス

1. Request: CASBが GET /auditLogs/signIns を投げる。
2. Response (429): 「少し落ち着け」という警告と、Retry-After: 30(秒)といった情報が返る。
3. Backoff: クライアント側で待機時間を計算し、その間はリクエストを停止する。
4. Retry: 待機時間経過後に再送。

この「バックオフ制御」を実装していない監視ツールやスクリプトは、ただひたすら再送を繰り返し、ブラックリスト入りする未来しか待っていない。

—

実践:指数バックオフによるエレガントなリトライ

ただ待機するだけでは素人だ。ネットワークの世界では「指数バックオフ(Exponential Backoff)」が定石。リトライのたびに待機時間を倍々に増やしていくことで、サーバー側の負荷を下げつつ、確実に成功率を上げる手法だ。

Pythonの requests ライブラリを使った、現場でそのまま使える実装例を挙げておこう。

import requests
import time

def fetch_logs_with_backoff(url, headers):
    max_retries = 5
    for i in range(max_retries):
        response = requests.get(url, headers=headers)
        
        # 正常終了
        if response.status_code == 200:
            return response.json()
        
        # 429が発生した場合のハンドリング
        elif response.status_code == 429:
            # Retry-Afterヘッダーを優先、なければ指数関数的に待機
            wait_time = int(response.headers.get("Retry-After", 2 ** i))
            print(f"スロットリング発生。{wait_time}秒間待機します...")
            time.sleep(wait_time)
            continue
            
        else:
            response.raise_for_status()
            
    raise Exception("最大リトライ回数を超過しました。")

—

CASB運用における3つの鉄則

コードだけでなく、インフラ運用者として意識しておくべき「現場の知恵」を3つ共有する。

1. Retry-After ヘッダーを正しく解釈せよ

API仕様書に書かれている通り、Retry-After は秒数で返ることもあるし、HTTPの日付形式で返ることもある。これを適切にパースするロジックを入れないと、思わぬ長時間待機や、逆に短すぎる再送間隔で再び 429 を食らうことになる。

2. ログ収集の「粒度」と「頻度」を見直す

CASB側の設定でポーリング間隔を極限まで短くしていないだろうか? 監査ログは数秒の遅延が許容されるケースが多い。監視の目的を再定義し、収集の間隔を広げることで、そもそも 429 を発生させない構成にするのが究極の最適化だ。

3. APIの使用状況を可視化せよ

Microsoft 365 管理センターや Graph Explorer を使い、現在どの程度のクォータを消費しているかを確認する習慣をつけよう。特に大規模テナントでは、CASB以外にも自作の運用自動化ツールがAPIを叩いていて、知らぬ間に競合しているケースが多々ある。

—

最後に:ネットワークは「対話」である

APIとの対話は、人間関係と同じだ。一気に要求を叩きつけるのではなく、相手(Microsoftのサーバー)の状況を推し量り、相手が「今は忙しい」と言えば引き下がり、「準備ができた」と合図があれば進む。

この「謙虚な通信」こそが、堅牢なゼロトラスト環境を構築するエンジニアの条件である。

もし今、ログの欠損に悩んでいるのなら、まずはパケットキャプチャやログを確認し、429 の頻度と Retry-After の値を眺めてみてほしい。そこには、ネットワークという巨大なシステムとの対話のヒントが隠されているはずだ。

諸君のインフラが、今日も安定して稼働することを願っている。現場からは以上だ。

コメント

タイトルとURLをコピーしました