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リクエスト
対処方法
即時対応
時間をおいて再実行する
- GitHub APIは
retry-afterヘッダーで待機すべき秒数を返します - 推奨: 数分~数十分待機後に再実行
- GitHub APIは
指数バックオフの実装
- 1回目の失敗: 1分待機
- 2回目の失敗: 2分待機
- 3回目の失敗: 4分待機
- 継続的に失敗する場合は指数関数的に待機時間を増やす
恒久対策
頻発する場合は、以下の運用方法を検討してください:
PRコメントの最適化
- PRコメントをサマリとしてまとめる
- 詳細なPlan結果はCIのログで確認する運用に変更
- コメント投稿頻度を制御する仕組みを導入
GitHub Actions ワークフローの改善
retry-afterヘッダーを尊重する実装を追加- 並行実行数を制限(最大100並行リクエストを超えないように)
- バッチ処理でコメントをまとめて投稿
分割実行
- Terraform planの対象を分割して複数のジョブに分ける
- 時間をずらしてワークフローを実行