Skip to content

[review] fix: ECR Public のレート制限による push 失敗に対処 - #50

Merged
dkan75 merged 1 commit into
mainfrom
fix-ecr-throttling
Aug 18, 2026
Merged

[review] fix: ECR Public のレート制限による push 失敗に対処#50
dkan75 merged 1 commit into
mainfrom
fix-ecr-throttling

Conversation

@dkan75

@dkan75 dkan75 commented Aug 12, 2026

Copy link
Copy Markdown
Contributor

背景

Docker build and pushtoomanyrequests: Rate exceeded による失敗が頻発していました。

  • 直近の失敗 3 件( 31548782825 / 30328933960 / 30180945661 )はすべて同じ原因
  • 原因は ECR Public の push 系 API クォータ超過。PutImage / InitiateLayerUpload / CompleteLayerUpload はいずれも 10 req/secservice quotas
  • 43 バージョン × 2 arch = 86 ジョブが一斉に push し、さらに no-cache: true で毎回全レイヤーが新規アップロードになるため、ピークで容易に上限を超える

なお 31548782825 で実際に失敗したジョブは 3.3.2, arm64 の 1 つだけで、残りの X は fail-fast による巻き添えキャンセルです。

変更内容

同時実行数を絞る

build_and_push( 86 leg )と create_manifest( 43 leg )の両方に max-parallel: 8 を設定。docker manifest pushPutImage を消費するため、そちらにも入れています。

push にリトライを追加

docker/build-push-action 自体にリトライ機構がないため、push: false + load: true でビルドのみ行い、push を独立ステップに分離しました。15s → 30s → 45s → 60s のバックオフで最大 5 回リトライします。docker manifest push にも同じリトライを適用しています。

リトライの待ち時間( 最大 150s )を見込んで create_manifesttimeout-minutes を 5 → 10 に延長しました。

確認したこと

  • YAML.safe_load_file でパース、bash -n で両スクリプトの構文チェック
  • リトライループの挙動をローカルで実行確認( 全失敗なら 4 回スリープして exit 1 、3 回目で成功すれば余計なスリープなしで exit 0 )
  • load: true が default builder( docker driver )で動作し、ローカルイメージストアにタグ付きで載ることを確認。ログ上この repo の runner は pushing ... with docker: = docker driver

今回入れていないもの

  • fail-fast: false: 1 leg の失敗で残りのバッチが巻き添えキャンセルされる挙動は残ります。create_manifest は matrix の全 leg 成功が条件なので、付けても付けなくても manifest の整合性には影響しません( 逆に create_manifestif: always() を付けるのは、--amend が前回 run の古い arch タグと混ざる危険があるため NG )
  • push イベント時に差分バージョンのみビルドする最適化
  • Service Quotas からのクォータ引き上げ申請

🤖 Generated with Claude Code

全バージョンを一斉に push すると ECR Public の API クォータ
(PutImage / InitiateLayerUpload / CompleteLayerUpload はいずれも 10 req/sec)
を超えて "toomanyrequests: Rate exceeded" で失敗していた。

- build_and_push / create_manifest に max-parallel: 8 を設定
- build-push-action では push せず、リトライ付きの docker push に分離
- docker manifest push にも同様のリトライを追加
- リトライの待ち時間を見込んで create_manifest の timeout を 10 分に延長

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>

@morikiyo morikiyo left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@dkan75
dkan75 merged commit a3f326e into main Aug 18, 2026
87 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants