Skip to content

GitHub運用Tips

GitHub Actions Rate Limit問題

概要

PRのpush時に実行されるGitHub ActionsによるTerraform planで、plan対象が多数の場合、セカンダリレート制限に引っかかる可能性があります。

実際のエラーメッセージ

You have exceeded a secondary rate limit and have been temporarily blocked from content creation. Please retry your request again later.

参照: https://docs.github.com/rest/overview/rate-limits-for-the-rest-api#about-secondary-rate-limits

原因

一定期間内のPRコメント投稿数が多く、悪用防止と全ユーザーへのAPI可用性確保のため、セカンダリレート制限で制限されます。

セカンダリレート制限の具体的な制限値

  • コンテンツ生成リクエスト:
    • 分間80件まで
    • 時間500件まで
    • PRコメント投稿はこのカテゴリに該当
  • 並行リクエスト数: 最大100件(REST API + GraphQL API 共有)
  • CPU時間: 60秒間で90秒分のCPU時間まで

プライマリレート制限(併用される)

GitHub Actionsでは、セカンダリ制限とは別に以下のプライマリ制限も適用されます:

  • 通常: リポジトリあたり時間1,000リクエスト
  • Enterprise Cloud: リポジトリあたり時間15,000リクエスト

対処方法

即時対応

  1. 時間をおいて再実行する

    • GitHub APIは retry-after ヘッダーで待機すべき秒数を返します
    • 推奨: 数分~数十分待機後に再実行
  2. 指数バックオフの実装

    • 1回目の失敗: 1分待機
    • 2回目の失敗: 2分待機
    • 3回目の失敗: 4分待機
    • 継続的に失敗する場合は指数関数的に待機時間を増やす

恒久対策

頻発する場合は、以下の運用方法を検討してください:

  1. PRコメントの最適化

    • PRコメントをサマリとしてまとめる
    • 詳細なPlan結果はCIのログで確認する運用に変更
    • コメント投稿頻度を制御する仕組みを導入
  2. GitHub Actions ワークフローの改善

    • retry-after ヘッダーを尊重する実装を追加
    • 並行実行数を制限(最大100並行リクエストを超えないように)
    • バッチ処理でコメントをまとめて投稿
  3. 分割実行

    • Terraform planの対象を分割して複数のジョブに分ける
    • 時間をずらしてワークフローを実行