本文へ移動

Cloudflare Workflows のインスタンスを最大100件削除、自分自身を消すと後続コードは走らない

Workflow インスタンスの保存状態を消す手段が API と Wrangler 4.125.0 以降に入った。1回100件の上限、自己削除で実行が止まる条件、存在しない ID と重複 ID の扱いを運用側から整理する。

100件 1回の削除で指定できるインスタンスの上限 Cloudflare Docs Changelog(2026年9月17日)。API・Wrangler とも1回あたり最大100 ID で、重複した ID も上限を消費する。

Workflow のインスタンスを削除する手段が、Workflows API と Wrangler 4.125.0 以降に入った。1回で指定できるのは1件から最大100件まで。削除するとそのインスタンスの保存状態が解放され、実行中であれば現在の実行が止まる。バージョンの条件が付いているのは Wrangler 側で、API 側の条件は changelog に書かれていない。

関係するのは、走り終わったインスタンスが消えずに積み上がっているアカウントだ。Cloudflare はストレージの課金を日次ピークの平均で数えると書いている。保存状態を抱えたインスタンスを放置するかどうかは、そのピークに乗る話になる。Wrangler を使わず API から消す場合も、1回あたりの上限は同じ100件だ。

削除は停止も兼ねる。実行中のインスタンスを消せば、その実行はそこで終わる。止めたいだけなのか状態も捨ててよいのかは、呼ぶ前に分けておきたい。解放された保存状態を元に戻せるかどうかは changelog にない。

1件はハンドル、100件までは binding

1件だけなら、インスタンスのハンドルを取って delete() を呼ぶ。

const instance = await env.MY_WORKFLOW.get("instance-abc");
await instance.delete();

まとめて消すなら、Workflow の binding にある deleteBatch() に ID の配列を渡す。

const result = await env.MY_WORKFLOW.deleteBatch([
  "instance-abc",
  "instance-def",
]);

console.log(result.deleted);
console.log(result.errors);

返り値には成功と失敗が同居する。削除できたものは { id } の形で deleted に入り、失敗はインスタンスごとに errors へ入る。呼び出しが例外なく終わったことは、渡した ID が全部消えたことを意味しない。読むべきは errors のほうだ。

消えない ID、枠だけ使う ID、そして自分自身

失敗の形は changelog に三つ書かれている。

  • 存在しない ID は、その分がエラーとして返る。
  • 重複した ID は上限を消費する。削除は一度だけ行われ、結果は入力の位置ごとに繰り返して返る。
  • Workflow が自分のインスタンスを削除すると、実行は await instance.delete() の途中で止まり、呼び出しより後ろのコードは走らない。

重複の扱いは、100件の枠を数えているのが入力の件数のほうだ、という意味になる。同じ ID が混ざったリストをそのまま渡せば、枠は入力の数だけ減り、実際に消えるのは重複を除いた分にとどまる。ID を集める側で一意にしてから渡すほうが早い。重複の結果は入力の位置ごとに返るので、何番目の ID がどうなったかは位置で対応づけられる。

errors に入った ID をそのまま再送してよいかは、理由による。存在しない ID は、もう一度送っても存在しないままだ。

三つ目は delete() について書かれた挙動だ。後始末やログ送信を delete() の後ろに置いた Workflow は、その行まで届かない。deleteBatch() に自分自身の ID を混ぜたときに同じことが起きるかどうかは、changelog にない。

Wrangler は位置引数とファイルを両方受ける

Wrangler 側の渡し方は3通りある。位置引数、トップレベルが文字列の JSON 配列であるファイル、そしてその併用だ。位置引数とファイルを混ぜても、数えられるのは合計の ID 数で、上限は100件のまま変わらない。

渡し方例条件
位置引数my-workflow <INSTANCE_ID>複数並べられる
ファイル--filename ./instance-ids.jsonトップレベルが文字列の JSON 配列
併用位置引数とファイルの両方合計100件まで
最新の1件latest直近に作成されたインスタンス
ローカル--localローカルの wrangler dev セッションに対して

出典:Cloudflare Docs Changelog「Delete Workflow instances individually or in batches」(2026年9月17日)

npx wrangler workflows instances delete my-workflow <INSTANCE_ID>
npx wrangler workflows instances delete my-workflow <INSTANCE_ID> <INSTANCE_ID>
npx wrangler workflows instances delete my-workflow latest
npx wrangler workflows instances delete my-workflow --filename ./instance-ids.json
npx wrangler workflows instances delete my-workflow <INSTANCE_ID> --local
["instance-abc", "instance-def"]

latest は直近に作成されたインスタンスを指す。--local を付けると、ローカルの wrangler dev セッションに対して実行する。latest を個別の ID や --filename と並べられるかどうかは書かれていない。

100件を超える掃除は、呼び出しを分けることになる。分け方や間隔について changelog は何も言っていない。

課金はその日のピークの平均で数えられる

changelog がストレージ課金について言うのは「average daily peak」の一言だけだ。削除が保存状態を解放することは明記されているが、消した分がいつ、どれだけ請求に反映されるかは書かれていない。日次ピークの平均という数え方なら、月末にまとめて消すより終わったインスタンスをためないほうが効くはずだが、これは数え方からの推測で、出典に計算例はない。

手順に落とすと短い。消す対象の ID を決め、重複を落とし、100件ずつに切り、返ってきた errors を確認する。Wrangler から消すなら 4.125.0 以降に上げる。自分自身を消す Workflow を書くなら、delete() は関数の最後に置く。

出典 種別について