きっかけ:Pages から Workers へ移行したら、旧プロジェクトが残った
このブログ(Astro 製)はもともと Cloudflare Pages で運用していました。@astrojs/cloudflare が Workers 専用へ寄っていく流れは薄々感じていたのですが、Workers には移行したくなくて、Git 連携(自動ビルド)を使わず、ローカルでビルドした dist を手動アップロードする方法でしのいでいました。
ところが Astro 6 世代の刷新(v13 前後)で @astrojs/cloudflare アダプターが Cloudflare Pages 向けの出力を廃止し、Workers 専用に。Astro 本体とアダプターを上げた結果、出力(dist/client + dist/server)と Pages の配信構成が噛み合わなくなって本番がほぼ全ページ 404 に。観念して Pages → Workers へ移行することで解決しました。
そもそも、いつの間にか Astro 6(@astrojs/cloudflare も v13)に上がっていたこと自体、把握していませんでした。おそらく dev か build を回したときに「アップデートあるよ」的な表示が目に入って、深く考えずそのまま上げてしまったのだと思います。メジャーアップした自覚すらないまま Pages が壊れていた——というのが正直なところです。
移行そのものが終わったあと、残った宿題が「古い Pages プロジェクトの掃除」です。GitHub を切り、カスタムドメインも外したので実害はありませんが、同名で紛らわしいので消しておきたい——そこで詰まりました。
症状:デプロイ数が多すぎてプロジェクトを削除できない
前述のとおり、私は Git 連携を使わず 手動アップロードで本番にデプロイし続けていました。これを延々と繰り返した結果、デプロイ一覧は「Showing 1–15 of 101」、つまり 101 件(しかも Git 連携ではないので全部 Production)。たかが個人ブログで 101 件……と思いつつ、ダッシュボードから削除を試みます。
削除ダイアログでプロジェクト名(blue-bird-data)を入力して「削除」を押すと、確認欄の下に次のエラーが出て止まりました。
Your project has too many deployments to be deleted, follow this guide to delete them: https://cfl.re/3CXesln
「デプロイが多すぎて削除できない」——これは Cloudflare の既知の問題として明記されているもので、ダイアログのリンク(cfl.re/3CXesln)も同じガイドに飛びます。公式ドキュメントの文言はこうです。
You may not be able to delete your Pages project if it has a high number (over 100) of deployments. The Cloudflare team is tracking this issue.
しきい値は 100 件超(over 100)。そして私のデプロイ数は 101 件。……ちょうど 1 件オーバーです。あと一回アップロードを我慢していれば踏まずに済んだやつで、地味に腹が立ちます。手動デプロイでも、こまめに上げ続けていると個人ブログでも意外とあっさり 100 を超えるので油断なりません。

解決策は、Wrangler CLI でデプロイを削っていくことです。一定数まで減らせば、プロジェクト本体の削除が通るようになります。
実際にやったこと
1. プロジェクト名とデプロイ一覧を確認
まず対象の Pages プロジェクト名を確認します(私の場合は blue-bird-data)。
# Pages プロジェクト一覧(ここに出る=Pages 側。同名の Worker と取り違えない)
npx wrangler pages project list
# デプロイ ID 一覧を JSON で取得
npx wrangler pages deployment list --project-name blue-bird-data --json | jq -r '.[].Id'
2. デプロイを個別に削除
公式に案内されるのはこの 1 件ずつの削除コマンドです。
npx wrangler pages deployment delete <DEPLOYMENT_ID> --project-name blue-bird-data
3. 一括で回す(ここで何度もハマった)
手動で2件消して挙動を確認したあと、残りはループで一気に消します。ただし素直にはいかず、3つの罠を踏みました。
罠1:JSONのキーは .id ではなく大文字の .Id
--json の各要素は {"Id": "...", "Environment": "Production", ...} という形。jq -r '.[].id'(小文字)だと全件 null が返り、deployment "null" を消そうとして空振りします。正しくは .Id。
罠2:deployment list は1ページ約25件しか返さない
101件あっても --json で取れるのは最新25件ほど。jq length が 25 でも「残り総数」ではありません(総数はダッシュボードの “of NN” が正)。なので リスト→削除を繰り返す必要があります。
罠3:非対話だと確認が自動で “no” になる
yes | でパイプすると wrangler が非対話と判断し Using fallback value in non-interactive context: no となって削除されません。確認をスキップするには --force を使います。--force はプロンプトを出さずに即削除します。
これらを踏まえた、実際に動いたループがこれです。
while true; do
ids=$(npx wrangler pages deployment list --project-name blue-bird-data --json | jq -r '.[].Id')
[ -z "$ids" ] && break
for id in $ids; do
npx wrangler pages deployment delete "$id" --project-name blue-bird-data --force
done
done
--force は本来「ライブ(alias 付き)のデプロイも消す」ためのフラグですが、確認プロンプトのスキップも兼ねるため、ループ削除では実質必須でした。なお手動で1件ずつ消す場合は対話プロンプト(y/N)が出るので、古い(ライブでない)デプロイなら --force 無しでも y で消せます。
4. 最後にプロジェクトを削除
ループを回すと、最終的にライブ(alias 付き)の本番デプロイ 1 件だけが残ります。これは --force を付けても API エラーで個別削除できません(毎パスこの 1 件でエラーが出続けるので、残りが消えたら Ctrl+C でループを止めます)。
ただ、残数が 1 まで減れば「デプロイが多すぎ」ガードは解けます。そのままプロジェクト本体を削除します。
npx wrangler pages project delete blue-bird-data
確認プロンプトに yes と答えると、
✔ Are you sure you want to delete "blue-bird-data"? This action cannot be undone. … yes
Deleting blue-bird-data
Successfully deleted blue-bird-data
と出て完了。個別削除では消せなかったライブ 1 件も、プロジェクトごと消えました。101 件のデプロイ地獄、ようやく成仏です(条件的には二件消せばよかったのだと思う)。
念のためダッシュボードから該当プロジェクトを開き直すと、次の表示。きれいに消えたことが確認できました。
Project not found. The specified project name does not match any of your existing projects.
気をつけた点
- 同名の Worker を消さない:移行先の Worker と Pages プロジェクトが同名(
blue-bird-data)だと紛らわしい。wrangler pages project listに出るのが Pages 側、という基準で見分けました。 - ドメインは先に外しておく:カスタムドメインを旧 Pages から先に外しておけば、削除作業中も新 Worker 側の配信に影響しません。逆に言えば、ドメインさえ移してあれば旧プロジェクトは無害なので、掃除は急がなくても大丈夫です。
まとめ
- Cloudflare Pages はデプロイが 100 件を超えるとプロジェクト削除に失敗する(既知の問題)。私は 101 件=1 件オーバーで踏んだ。
- 解決は Wrangler でデプロイを削る → 件数を減らしてからプロジェクト削除。
- 一括削除は
jq -r '.[].Id'(大文字Id)、deployment listは25件/ページ、確認スキップに--force——この3点でハマりやすい。 - Pages → Workers 移行の「あと片付け」で遭遇しがちなので、移行を予定している人は頭の片隅に。