[Cloudflare Pages] デプロイが多すぎてCloudflare Pagesプロジェクトが削除できないときの対処手順

Cloudflare PagesからWorkersに移行したあと、不要になったPagesプロジェクトを削除しようとしたところ、デプロイ数が多すぎて削除できない状態になった。
削除ボタンを押せば終わる想定だったため、最初は少し詰まった。

本記事では、実際に解決した手順をまとめる。

背景

  • Cloudflare Pagesを運用していた
  • Workersへ移行したため、Pagesプロジェクトが不要になった
  • Dashboardから削除しようとしたが失敗した

症状:Pagesプロジェクトが削除できない

Cloudflare Pagesには既知の制限があり、デプロイ数が多いプロジェクトは削除できないことがある。

公式Known Issuesにも明記されている。

解決方針

削除できない場合は以下の順序になる。

  1. デプロイを先に削除する
  2. デプロイ数が減ったらPagesプロジェクトを削除する

Cloudflareが公式に提供しているNode.jsスクリプトで一括削除できる。

手順まとめ(全体像)

やることは大きく分けて以下。

  • スクリプトを取得する
  • API Tokenを作成する(Pages Edit権限が必要)
  • Account IDを正しく取得する(ここが一番ハマる)
  • デプロイを一括削除する
  • Dashboardからプロジェクト削除する

実行手順

1. 公式スクリプトを取得する

今回は、CloudflareのKnown Issuesページから直接zipファイルをダウンロードした。

ページ内に delete-all-deployments.zip へのリンクがあり、そこから取得できる。

curl でも直接ダウンロードできるらしい。

curl -O https://pub-505c82ba1c844ba788b97b1ed9415e75.r2.dev/delete-all-deployments.zip
unzip delete-all-deployments.zip
cd delete-all-deployments

2. 依存関係をインストールする

npm install

3. 必要な環境変数を準備する

スクリプト実行には以下の環境変数が必要。

  • CF_API_TOKEN:Cloudflare API Token(Pagesを操作するための認証情報)

  • CF_ACCOUNT_ID:CloudflareのAccount ID(32桁の英数字文字列)

  • CF_PAGES_PROJECT_NAME:削除対象のPagesプロジェクト名(slug)

  • (任意)CF_DELETE_ALIASED_DEPLOYMENTS:alias付きデプロイも削除するかどうか(true で有効)

    • aliasとは、ブランチ名などに紐づいたプレビュー用URLの別名が付いているデプロイのこと
    • 例:通常のpreview URLが https://abcd1234.example.pages.dev のとき、aliasが付くと https://feature-login.example.pages.dev のようなURLでも参照できる

4. CF_API_TOKENを作成する

Cloudflare Dashboardから作成する。

  • My Profile
  • API Tokens
  • Create Token
  • Custom Token

必須権限

最低限これが必要。

  • Account → Pages → Edit

WorkersのEditやDNSのEditでは代替できない。

注意:Tokenは漏洩したら即失効する。記事に貼らない。

5. CF_ACCOUNT_ID を取得する

CF_ACCOUNT_ID はアカウント名ではない。ここで一度ハマった。

最初、私は次のように自分のアカウント名をそのまま入れてしまった。

CF_ACCOUNT_ID="onidazo"

しかしこれは誤りで、名前を入れると失敗する。この状態で実行すると Failed to list deployments エラーになる。

正しくはDashboard URLに含まれる 32桁の ID

https://dash.cloudflare.com/<ACCOUNT_ID>/workers-and-pages

この <ACCOUNT_ID> をコピーする。

例:

CF_ACCOUNT_ID="1234567890abcdef1234567890abcdef"

6. CF_PAGES_PROJECT_NAME を確認する

Pagesのプロジェクト一覧に表示されるslugをそのまま使う。

例:

CF_PAGES_PROJECT_NAME="ofurousagi"

7. デプロイを一括削除する

エイリアス付きも含めて削除する場合

Previewデプロイが多い場合、aliasが付いていることが多い。

完全削除するなら true を付ける。

CF_API_TOKEN="xxxxx" \
CF_ACCOUNT_ID="1234567890abcdef1234567890abcdef" \
CF_PAGES_PROJECT_NAME="ofurousagi" \
CF_DELETE_ALIASED_DEPLOYMENTS="true" \
npm start

実行すると以下のようにページングしながら削除が進む。

Listing next 30 deployments, this may take a while...
Deleting deployment ...
Deleting deployment ...

よくあるエラーと原因

Failed to list deployments...

Failed to list deployments on page 1...
Error: Could not fetch deployments

原因はだいたい次のどれか。

1. CF_ACCOUNT_ID が間違っている

アカウント名を入れてしまっているケースが多い。

  • onidazo
  • 32桁の Account ID

2. API Tokenの権限不足

Account → Pages → Edit がないとlist / deleteが通らない。

3. Project名が違う

別アカウントに存在している可能性もあるので再確認する。

デプロイ削除後:Pagesプロジェクトを削除する

デプロイが減ったらDashboardから削除できるようになる。

  • Workers & Pages → Pages → 対象プロジェクト
  • Settings → Delete project

まとめ

  • Pagesプロジェクトが削除できない場合は、まずデプロイを減らす
  • 公式スクリプトで一括削除できる
  • CF_ACCOUNT_ID はアカウント名ではなく32桁のID
  • デプロイ削除後にDashboardからプロジェクトを削除する