GitHub REST APIの403・429を一次・二次Rate Limitで切り分ける

GitHub REST APIの403・429を一次・二次rate limitと別の拒否に分け、応答ヘッダーと要求量で再開条件を確認します。

AIものさし編集部

GitHub REST APIの403や429が続くときは、権限を追加する前に、応答本文とrate-limit関連ヘッダーを確認します。403は権限エラーにもrate limitにも使われるため、状態だけで修正先を決めると、必要のない権限変更や再試行を増やしてしまいます。

この記事では、APIを使うCIや連携処理の担当者が、一次制限・二次制限・別の拒否を分け、再開時刻と要求量を調整する手順を扱います。tokenの発行・権限拡大・契約変更は行いません。

失敗応答を機密を除いて残す

method、endpoint、時刻、HTTPステータス、本文のエラー種別、認証方式を記録します。Authorizationやtoken全文、署名付きURLを貼らず、どのjob・アプリの要求か追える識別子を使います。

表は横にスクロールできます

応答項目確認する意味
本文のmessagerate limitなのか、別の拒否なのか
x-ratelimit-remaining対象枠の残量
x-ratelimit-reset枠のreset時刻を示すUTC epoch秒
x-ratelimit-resourceどのresourceの枠か
retry-after指定された待機秒数

ヘッダーの欠落や、clientが本文を捨てている場合は、分かっていない項目を補って判断しません。安全に取得できる応答情報を残すよう、呼出し元のログ設計を確認します。

一次制限と二次制限を分ける

GitHubの公式資料は、一次制限を認証方式やresource等に応じた時間枠の要求量、二次制限を同時・短時間の要求等に対する追加の制限として説明しています。一次の残量があることだけでは、二次制限に達していない証明にはなりません。GitHub:Rate limits for the REST API(新しいタブで開く)

表は横にスクロールできます

観察次の確認
403/429でremainingが0reset時刻と対象resource
本文がsecondary rate limitを示すretry-after、要求の集中、再試行量
403だが本文が権限・resource accessを示す認証・権限・対象repositoryの別診断
401や別のvalidation errorそのエラーの原因。rate limitと決めない

同じtokenを使う複数jobや連携処理が、同じ枠や要求の集中に関係する場合があります。自分の一つのscriptだけを数えず、どの認証主体・resourceへ要求が集まるかを整理します。検索endpoint等の枠も、一般のREST APIと一律に扱いません。

待機条件を満たしてから再開する

一次制限でremainingが0なら、resetで示された時刻より前に再試行しません。resetは待機秒数そのものではなく時刻なので、現在のUTC時刻と単位を合わせて扱います。

二次制限では、retry-afterがあればその秒数を待ちます。remainingが0ならresetも確認し、それらの指定がない場合の扱いは公式資料に従います。現行資料は、その場合少なくとも一分待ち、失敗が続くときは待機を指数的に増やし、有限回でエラーとして終了するよう案内しています。

待機中に別workerが同じ要求を連打していれば、単一jobのsleepだけでは要求集中を抑えられません。client内部の再試行と、job・queue側の再試行が重なっていないかも確認します。

要求の出し方を小さく変える

回復確認では、まず並列度と不要なpollingを見直します。GitHubの公式ベストプラクティスは、二次制限を避けるための要求の直列化や、条件付きrequest、webhook等を利用した不要なpollingの削減を案内しています。endpointごとに利用できる方法を確認してください。GitHub:Best practices for using the REST API(新しいタブで開く)

表は横にスクロールできます

見直す箇所観察する変化
同時に動くjob瞬間的な要求集中が減るか
更新確認のpolling必要のない同一取得を減らせるか
ページング同じpageの再取得や取りこぼしがないか
二重の再試行一回の失敗が多数の要求へ増幅しないか
更新操作の再送既に作成・変更済みの対象を重ねないか

tokenを増やしたり別アカウントへ要求を分散したりすることを、制限回避の自動対処にはしません。APIの利用ルールと必要な認証方式を守り、要求量や実行間隔を見直します。

残量確認のAPI自体も連打しない

現行のGitHub資料では、rate-limit状態を調べるendpointは一次枠を消費しなくても、二次制限に関係する場合があると説明しています。状態を知るために短い間隔で呼び続けるより、既に受け取った応答ヘッダーを活用します。

応答ごとのremainingは、常に一ずつ単調に減る数字とは限りません。別処理や処理region等の影響を考慮し、一つの値だけを厳密な残回数保証として使わず、403/429と待機指定を扱える設計にします。

再開後は成功と処理件数を確認する

許可された小さな要求から再開し、状態、待機時間、再試行回数、成功・失敗件数を記録します。書込みを伴う処理では、通信結果が不明な要求を、明確なrate-limit拒否と同じように再送しないでください。対象の状態と重複の有無を確認します。

完了時は、どの枠・どの要求集中が関係し、どの待機条件と要求量で再開できたかを残します。本文は公式仕様に基づく診断・設計手順で、実際のGitHub APIへの要求、制限再現、待機後の成功を検証した報告ではありません。