TL;DR
- Cloudflare Queues の Event Subscription(イベント購読) が、ダッシュボードのSubscriptionsタブにも
wrangler queues subscription listにも出てこない、という状況に陥った - さらに、同じリソースに購読を作ろうとすると
We currently do not support multiple subscriptions on the same resource.(同一リソースに複数の購読は不可)で弾かれる - 「購読は見えないのに重複では弾かれる」=バグか? と疑ったが、真犯人は一覧APIとCLIのページネーションのデフォルト件数だった
-
--per-page(CLI)や?per_page=(API)で件数を上げたら、目的の購読は普通に存在していた - 結論:Cloudflareのイベント購読は、デフォルト表示だけを見て「無い」と判断してはいけない
背景
Workers Builds のビルド失敗・キャンセルを Queue に流して通知に使おうとしていた。
構成はこんな感じ。
- 多数の Worker(
your-worker-a,your-worker-b, ... 30個以上) - それぞれの
build.failed/build.canceledイベントを、1つの Queue(仮にbuild-events)に集約
ある Worker のイベント購読を追加した。が、ダッシュボードのSubscriptionsタブを見ても追加した購読が表示されない。
「あれ、ちゃんと追加できてないのかな?」と思い、同じ購読をもう一度追加しようとした。
すると、今度はこのエラーが出た。
We currently do not support multiple subscriptions on the same resource.
つまり「追加されていないように見えるのに、再追加しようとすると"既にある"と言われて弾かれる」。
表示と実体が食い違っている。これは何かおかしい、と思ったのが沼の入り口だった。
ハマりポイント:3つの確認手段が全部「出てこない」
Cloudflare公式が案内している購読の確認方法は主に2つ。
- ダッシュボードの Queues → 対象キュー → Subscriptions タブ
- Wrangler CLI
npx wrangler queues subscription list build-events
ところが、
- ダッシュボードのSubscriptionsタブ → 表示されない
-
wrangler queues subscription list build-events→ 何も出ない
ならばと、アカウント単位のEvent Subscriptions APIを叩く。
curl "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/event_subscriptions/subscriptions" \
-H "Authorization: Bearer $CF_API_TOKEN"
※
CF_API_TOKENは自分で発行する必要がある。
ダッシュボード右上のプロフィール → My Profile → API Tokens → Create Token で、
Account > Queues > Read(削除までやるなら Edit)権限を付けて作成する。
トークンは発行直後の画面でしか全文表示されないので必ずその場でコピーすること。
前後に空白やクォートが混ざるとAuthentication error(code 10000)になるので注意。
これでようやくJSONが返ってきた。一見すると目的の Worker の購読は入っていない……ように見えた。
ここで「やっぱり一覧に出ない=残骸(孤児化)バグでは?」と疑い始める。
サポートに問い合わせる前に、CloudflareのAIに聞いてみた
「これはもうバグだろう」とサポートへ問い合わせる文面まで用意したが、その前にダッシュボードのAIアシスタントに状況を投げてみた。
すると、AI側は実際にアカウントのEvent Subscriptions APIを叩いて、購読はちゃんと存在していて、しかも目的の events(build.failed / build.canceled)が設定済みだと教えてくれた。
さらに全件を出してもらったところ、自分が「無い」と思っていた購読が普通にリストに入っていた。
つまりこの時点で「実体は存在する」ことが確定し、残骸バグ説は消えた。
あとは「なぜ自分の手元では見えなかったのか」だけが残った問題で、その答えが次のページネーションだった。
真犯人:ページネーションのデフォルト件数
落ち着いてレスポンスをよく見ると、JSONが途中で切れていた。
そして Cloudflare のこのエンドポイントは、ページネーションされる仕様だった。
List Event Subscriptions は paginated(ページネーション配列)で返る。
件数を指定しないとデフォルト件数で先頭だけ返り、残りは次ページに行く。
つまり、
- 購読は30件以上あった
- デフォルトの表示件数を超えた分が、次ページに送られて見えていなかっただけ
- 目的の Worker の購読は、その「見えていない側」に存在していた
ダッシュボードもCLIもAPIも、全部同じ理由(デフォルト件数で頭打ち)で、頭しか見せていなかった。
バグでも残骸でもなく、ただのページネーションだった。
解決:件数を上げて全件取得する
API(curl)の場合
per_page を上げて1ページに寄せ、worker名で grep する。
curl -s "https://api.cloudflare.com/client/v4/accounts/<ACCOUNT_ID>/event_subscriptions/subscriptions?per_page=100" \
-H "Authorization: Bearer $CF_API_TOKEN" \
| python3 -m json.tool | grep -i your-worker
Wrangler CLI の場合
wrangler queues subscription list には --per-page と --json がある。
(デフォルトの --per-page は 20。今回の沼はまさにこれ)
npx wrangler queues subscription list build-events --per-page 100 --json
grep したいときは:
npx wrangler queues subscription list build-events --per-page 100 --json | grep -i your-worker
これで、目的の購読が普通に出てきた。
build.failed / build.canceled も正しく設定済みで、そもそも作り直す必要すらなかった。
「作れない」のは、既に同じものが存在していたから。完全に正しい挙動だった。
⚠️ 注意:
wrangler queues subscription list <queue>はキュー指定コマンドなので、
出てくるのは「そのキューを宛先にしている購読」だけ。
アカウント全体を横断で見たいときは API(/event_subscriptions/subscriptions?per_page=100)を使う。
教訓
- Cloudflareのイベント購読は、デフォルト表示を信用しない。 件数を上げてから「無い」を判断する
- ダッシュボード / CLI / API の「出てこない」は、実体が無いのではなく頭しか見ていない可能性がある
- API が
Authentication errorを返したら、それは「無い」ではなく「まだ何も確認できていない」。先に認証を通す - 公式の「View existing subscriptions」手順には
--per-pageの存在も「デフォルト20件で切れる」注意も書かれていない。新しめの機能なので、ページネーションの存在を頭に入れておくと事故らない
環境
- Cloudflare Queues / Event Subscriptions(2025年8月頃に追加された機能)
- Wrangler(
queues subscription listに--page/--per-page/--jsonオプションあり)
以上、同じく「購読が消えた!」と慌てた人の役に立てば。