コンテンツにスキップ

HTTP経由でキューに公開する

HTTPとワーカーを介して直接キューに公開します。

以下の例では、共有シークレットを使用して、任意のHTTPクライアントからキューにメッセージを公開する方法を示します。

これにより、Go、Rust、Python、またはBashスクリプトなど、HTTPをサポートする任意のサービスやプログラミング言語からキューに書き込むことができます。

前提条件

wrangler.tomlファイルを次のように設定します:

name = "my-worker"
[[queues.producers]]
queue = "my-queue"
binding = "YOUR_QUEUE"

1. 共有シークレットを作成する

ワーカーをデプロイする前に、共有シークレットとして使用できるシークレットを作成する必要があります。共有シークレットは、クライアントが認証に使用し、サーバー(あなたのワーカー)が認証のために照合するシークレットです。

暗号的に安全なシークレットを生成するには、opensslコマンドラインツールとwrangler secretを使用して、共有シークレットとして使用できる16進エンコードされた文字列を作成します:

Terminal window
openssl rand -hex 32
# これは65文字の長さの16進数文字列を出力します

この文字列をコピーして、wrangler secretのプロンプトに貼り付けます:

Terminal window
npx wrangler secret put QUEUE_AUTH_SECRET
成功!シークレット QUEUE_AUTH_SECRET をアップロードしました

このシークレットは、キューに書き込むクライアントアプリケーションでも使用する必要があります:安全に保存してください。

2. ワーカーを作成する

以下のワーカースクリプトは:

  1. 共有シークレットを使用してクライアントを認証します。
  2. ペイロードがJSONであることを検証します。
  3. ペイロードをキューに公開します。
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>;

このワーカーをデプロイするには:

Terminal window
npx wrangler deploy

3. テストメッセージを送信する

成功裏に認証し、キューにメッセージを書き込むことができるか確認するために、コマンドラインでcurlを使用します:

Terminal window
# プレースホルダーを共有シークレットに置き換えてください
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の出力をデバッグできます。