はじめに
Upstash QStashで予約を登録しようとしたところ、次のエラーが出ました。
Error [QstashError]: {"error":"user (xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx) not found in this region (eu-central-1). Check that you are using the correct endpoint. Learn more: https://upstash.com/docs/qstash/howto/multi-region"}
トークンは正しくコピーしたはずなのに、「ユーザーが見つからない」と言われてしまいます。
この記事では、エラーの原因と解決方法をまとめます。
問題
Vercel Cronが毎日決まった時刻に呼び出すAPIの中で、QStashに通知の予約を登録していました。
import { Client } from "@upstash/qstash";
// QStashのクライアントを作る(トークンだけを渡している)
const qstash = new Client({ token: process.env.QSTASH_TOKEN! });
// 指定した時刻にAPIを呼ぶ予約を登録する
await qstash.publishJSON({
url: notificationUrl,
body: {},
notBefore,
});
このAPIを呼ぶと、publishJSON のところで冒頭のエラーが出て、予約を登録できませんでした。
最初に試したこと
エラーに「user not found」と書かれていたので、トークンが間違っていると考えました。Upstash Consoleからトークンをコピーし直し、Vercelの環境変数を貼り直して再デプロイしましたが、同じエラーのままでした。
エラーの意味
エラーメッセージを落ち着いて読むと、次のように書かれています。
user not found in this region (eu-central-1) (このリージョン(eu-central-1)にはユーザーがいません)
トークンが間違っているのではなく、接続先のリージョンにアカウントが存在しないという意味でした。
解決方法
原因:接続先のリージョンが違っていた
QStashは、ヨーロッパやアメリカなど、複数のリージョン(サーバーが置かれている地域)で動いています。アカウントのQStashがどのリージョンにあるかによって、接続するURL(エンドポイント)が変わります。
筆者の環境では、Client に接続先のURLを指定していなかったため、eu-central-1(ヨーロッパ)のエンドポイントに接続していました。しかし、筆者のQStashは別のリージョンにあったため、「このリージョンにはユーザーがいない」と言われていました。
対応:QSTASH_URL で接続先を指定する
Upstash ConsoleのQStashの画面には、QSTASH_TOKEN と一緒に QSTASH_URL も表示されています。これが、自分のアカウントに合った接続先のURLです。
1. 環境変数を追加する
QSTASH_URL をコピーして、.env.local とVercelの環境変数に追加します。
# Upstash QStash(Upstash ConsoleのQStashの画面からコピー)
QSTASH_URL=
QSTASH_TOKEN=
2. Client に baseUrl を渡す
Client を作るときに、baseUrl として QSTASH_URL を渡します。
import { Client } from "@upstash/qstash";
const qstash = new Client({
token: process.env.QSTASH_TOKEN!,
// 自分のアカウントのリージョンに合った接続先を指定する
baseUrl: process.env.QSTASH_URL,
});
これで予約を登録できるようになりました。
Vercelの環境変数を追加・変更したあとは、再デプロイしないと反映されません。 環境変数を直したのにエラーが変わらないときは、再デプロイしたかを確認してください。
まとめ
- QStashを使うときは、
QSTASH_TOKENとQSTASH_URLの両方を設定する - エラーメッセージの
not found in this regionは、トークンの間違いではなく接続先のリージョンの違いを表している
おわりに
「user not found」という言葉だけを見て、トークンの間違いだと思い込んでいました。エラーメッセージを最後まで読めば、リージョンの問題だと書いてあったので、メッセージを読むことの大切さを改めて感じました。
参考
