HTTP経由でキューに公開する
HTTPとワーカーを介して直接キューに公開します。
以下の例では、共有シークレットを使用して、任意のHTTPクライアントからキューにメッセージを公開する方法を示します。
これにより、Go、Rust、Python、またはBashスクリプトなど、HTTPをサポートする任意のサービスやプログラミング言語からキューに書き込むことができます。
- Cloudflareダッシュボード ↗またはwrangler CLIを介して作成されたキュー。
- Cloudflareダッシュボードまたは
wrangler.tomlファイルに設定されたプロデューサーバインディング。
wrangler.tomlファイルを次のように設定します:
name = "my-worker"
[[queues.producers]] queue = "my-queue" binding = "YOUR_QUEUE"ワーカーをデプロイする前に、共有シークレットとして使用できるシークレットを作成する必要があります。共有シークレットは、クライアントが認証に使用し、サーバー(あなたのワーカー)が認証のために照合するシークレットです。
暗号的に安全なシークレットを生成するには、opensslコマンドラインツールとwrangler secretを使用して、共有シークレットとして使用できる16進エンコードされた文字列を作成します:
openssl rand -hex 32# これは65文字の長さの16進数文字列を出力しますこの文字列をコピーして、wrangler secretのプロンプトに貼り付けます:
npx wrangler secret put QUEUE_AUTH_SECRET✨ 成功!シークレット QUEUE_AUTH_SECRET をアップロードしましたこのシークレットは、キューに書き込むクライアントアプリケーションでも使用する必要があります:安全に保存してください。
以下のワーカースクリプトは:
- 共有シークレットを使用してクライアントを認証します。
- ペイロードがJSONであることを検証します。
- ペイロードをキューに公開します。
interface Env { YOUR_QUEUE: Queue; QUEUE_AUTH_SECRET: string;}
export default { async fetch(req, env): Promise<Response> { // クライアントが正しい認証キーを持っていることを認証します if (env.QUEUE_AUTH_SECRET == "") { return Response.json( { err: "アプリケーションが構成されていません" }, { status: 500 }, ); }
// 認証キーが無効/不正確/誤って構成されている場合はHTTP 403(禁止)を返します let authToken = req.headers.get("Authorization") || ""; let encoder = new TextEncoder(); // クライアントが提供した認証トークンとシークレットを安全に比較します try { if ( !crypto.subtle.timingSafeEqual( encoder.encode(env.QUEUE_AUTH_SECRET), encoder.encode(authToken), ) ) { return Response.json( { err: "提供された認証トークンが無効です" }, { status: 403 }, ); } } catch (e) { return Response.json( { err: "提供された認証トークンが無効です" }, { status: 403 }, ); }
// オプション:ペイロードがJSONであることを検証します // 本番アプリケーションでは、ライブラリ「zod」を使用してスキーマに対してペイロードをより堅牢に検証することがあります let messages; try { messages = await req.json(); } catch (e) { // ペイロードがJSONでない場合はHTTP 400(不正なリクエスト)を返します return Response.json({ err: "ペイロードは有効なJSONではありません" }, { status: 500 }); }
// キューに公開します try { await env.YOUR_QUEUE.send(messages); } catch (e: any) { console.log(`キューへの送信に失敗しました: ${e}`); // 公開操作が失敗した場合はHTTP 500(内部エラー)を返します return Response.json({ error: e.message }, { status: 500 }); }
// 送信が成功した場合はHTTP 200を返します! return Response.json({ success: true }); },} satisfies ExportedHandler<Env>;このワーカーをデプロイするには:
npx wrangler deploy成功裏に認証し、キューにメッセージを書き込むことができるか確認するために、コマンドラインでcurlを使用します:
# プレースホルダーを共有シークレットに置き換えてくださいcurl -H "Authorization: pasteyourkeyhere" "https://YOUR_WORKER.YOUR_ACCOUNT.workers.dev" --data '{"messages": [{"msg":"hello world"}]}'{"success":true}これによりHTTP POSTリクエストが発行され、成功した場合はHTTP 200とsuccess: trueのレスポンスボディが返されます。
- HTTP 403を受け取った場合、これは
Authorizationヘッダーが無効であるか、シークレットが構成されていないためです。 - HTTP 500を受け取った場合、これはワーカーに対して正しく共有シークレットを作成しなかったか、無効なメッセージをキューに送信しようとしたためです。
wrangler tailを使用してconsole.logの出力をデバッグできます。