コンテンツにスキップ

始める

Pub/Subは、MQTTメッセージング標準の上に構築された柔軟でスケーラブルなメッセージングサービスで、数万台以上のデバイスからメッセージを公開し、Cloudflare Workersを使用してメッセージをフィルタリング、集約、変換するコードをデプロイし、またはファンアウトメッセージングユースケースのためにトピックにサブスクライブすることができます。

このガイドでは:

  • Cloudflare APIを使用して最初のPub/Subブローカーを作成する手順を説明します。
  • <broker>.<namespace>.cloudflarepubsub.comエンドポイントを作成し、MQTT v5.0互換のクライアントを使用して公開およびサブスクライブできるようにします。
  • Pub/Subブローカーに最初のメッセージを送信する手助けをします。

始める前に、コマンドラインの使用と基本的なターミナルコマンドの実行に慣れている必要があります。

前提条件:Cloudflareアカウントを作成する

Pub/Subを使用するには、Cloudflareアカウントが必要です。すでにアカウントをお持ちの場合は、このステップをスキップできます。

1. Pub/Subを有効にする

プライベートベータ版中は、アカウントに明示的にアクセスを付与する必要があります。まだ付与されていない場合は、ウェイトリストにサインアップしてください。アクセスが付与された際にご連絡いたします。

2. Wrangler(Cloudflare CLI)をインストールする

wranglerをインストールすると、Workersプロジェクトをinitdev、およびpublishできます。

wranglerをインストールするには、npmをインストールしていることを確認してください。できれば、VoltanvmのようなNodeバージョンマネージャーを使用してください。バージョンマネージャーを使用すると、権限の問題を回避し、Node.jsのバージョンを簡単に変更できます。その後、次のコマンドを実行します:

Terminal window
npm install wrangler --save-dev

Pub/Subをサポートするwranglerのバージョンを確認します:

Terminal window
wrangler --version
2.0.16 # 2.0.16以上が表示されるべきです - 例:2.0.17または2.1.0

wranglerがインストールされたので、wranglerが使用するPub/Sub APIトークンを作成できます。

3. 認証情報を取得する

Pub/SubでWranglerを使用するには、Pub/Subの読み取りおよび書き込み権限を持つAPIトークンが必要です。wrangler loginフローでは、Pub/Subの有効な権限を持つAPIトークンは発行されません。

  1. Cloudflareダッシュボードにアクセスし、プロフィールアイコンをクリックしてマイプロフィールを選択します。
  2. マイプロフィールの下で、APIトークンをクリックします。
  3. APIトークンページで、トークンを作成をクリックします。
  4. カスタムトークンを作成の隣にある始めるを選択します。
  5. トークンに名前を付けます - 例:“Pub/Sub書き込みアクセス”
  6. 権限の見出しの下で、アカウントを選択し、最初のドロップダウンからPub/Subを選択し、権限として編集を選択します。
  7. 新しく作成した権限の下にあるさらに追加を選択します。最初のドロップダウンからユーザー > メンバーシップを選択し、権限として読み取りを選択します。
  8. ページの下部で要約に進むを選択し、_すべてのアカウント - Pub/Sub:Edit_が権限として表示されることを確認します。
  9. トークンを作成を選択し、トークンの値をコピーします。

ターミナルで、Pub/Subトークンを使用してCLOUDFLARE_API_TOKEN環境変数を設定します。この変数が設定されると、wranglerはCloudflare APIに対して認証に使用します。

Terminal window
export CLOUDFLARE_API_TOKEN="ここにトークンを貼り付け"

この環境変数が設定されたので、最初のPub/Subブローカーを作成できます!

4. 最初の名前空間を作成する

名前空間は、Pub/Subブローカーのコレクションを表し、異なる環境(本番とステージング)、インフラチーム、将来的には権限を分けるために使用できます。

始める前に、次の点を考慮してください:

  • 名前空間を慎重に選択してください。後で変更できますが、ブローカーのホスト名の一部として使用されます。インターネット上で公開できない秘密やデータを使用しないでください。
  • 名前空間名はグローバルです;グローバルに一意です。
  • 名前空間はRFC 1035に従った有効なDNS名でなければなりません。ほとんどの場合、これはa-z、0-9、ハイフンのみが許可されることを意味します。名前は大文字と小文字を区別しません。

例えば、my-namespaceという名前空間とstagingというブローカーを使用すると、クライアントが接続するためのホスト名はstaging.my-namespace.cloudflarepubsub.comになります。

これを考慮して、新しい名前空間を作成します。この例ではmy-namespaceをプレースホルダーとして使用します:

Terminal window
wrangler pubsub namespace create my-namespace
{
"id": "817170399d784d4ea8b6b90ae558c611",
"name": "my-namespace",
"description": "",
"created_on": "2022-05-11T23:13:08.383232Z",
"modified_on": "2022-05-11T23:13:08.383232Z"
}

HTTP 403(禁止)の応答が返された場合は、認証情報が正しいことを確認し、誤ったスペースや文字を貼り付けていないか確認してください。

5. ブローカーを作成する

MQTT用語でのブローカーは、トピックにメッセージを公開する接続されたクライアントのコレクションと、それらのトピックにサブスクライブしてメッセージを受信するクライアントを指します。ブローカーは中継として機能し、Cloudflare Pub/Subでは、Cloudflare Workerが公開されたすべてのメッセージに対してアクションを実行するように構成できます。

このブローカーはTOKEN認証を受け入れるように構成されます。MQTT用語では、これは通常、ユーザー名:パスワード認証として定義されます。Pub/Subは、各クライアントに固有で、取り消し可能なJSON Webトークン(JWT)を使用して、認証をより安全にします。

ブローカー名は次の条件を満たす必要があります:

  • 慎重に選択してください。後で変更できますが、名前はブローカーのホスト名の一部として使用されます。インターネット上で公開できない秘密やデータを使用しないでください。
  • 有効なDNS名である必要があります(RFC 1035に従う)。ほとんどの場合、これはa-z0-9、およびハイフンのみが許可されることを意味します。名前は大文字と小文字を区別しません。
  • 名前空間ごとに一意である必要があります。

上記の例から、my-namespace名前空間にexample-brokerという新しいMQTTブローカーを作成するには:

Terminal window
wrangler pubsub broker create example-broker --namespace=my-namespace
{
"id": "4c63fa30ee13414ba95be5b56d896fea",
"name": "example-broker",
"authType": "TOKEN",
"created_on": "2022-05-11T23:19:24.356324Z",
"modified_on": "2022-05-11T23:19:24.356324Z",
"expiration": null,
"endpoint": "mqtts://example-broker.namespace.cloudflarepubsub.com:8883"
}

上記の例では、mqtts://example-broker.my-namespace.cloudflarepubsub.comというエンドポイントを持つブローカーが作成されます。これは次のことを意味します:

  • 私たちのPub/Sub(MQTT)ブローカーは、MQTTS(TLS上のMQTT)でポート8883を介して到達可能です。
  • ホスト名はexample-broker.my-namespace.cloudflarepubsub.comです。
  • クライアントが接続するためにはトークン認証が必要です。

6. ブローカーの認証情報を作成する

Pub/Subブローカーに接続するには、安全に認証する必要があります。認証情報は各ブローカーにスコープされており、broker-a用に発行された認証情報はbroker-bに接続するためには使用できません。

以下に注意してください:

  • 一度に複数の認証情報を生成できます(APIコールごとに最大100)。これは、複数のクライアント(IoTデバイスなど)を構成する際に便利です。
  • 認証情報は特定のクライアントIDに関連付けられ、署名されたJSON Webトークン(JWT)としてエンコードされます。
  • 各トークンには、特定のトークンを取り消すために使用できる一意の識別子(jti - またはJWT ID)があります。
  • トークンは、関連付けられたブローカー名(例えば、my-broker)でプレフィックスされ、複数のPub/Subブローカー間でトークンを識別しやすくします。

example-brokerというブローカーのために48時間の有効期限で2つのトークンを生成するには:

Terminal window
wrangler pubsub broker issue example-broker --namespace=NAMESPACE_NAME --number=2 --expiration=48h

成功応答が返され、以下のようなクライアントIDとその関連トークンのマップが表示されるはずです。

{
"01G3A5GBJE5P3GPXJZ72X4X8SA": "eyJhbGciOiJFZERTQSIsImtpZCI6IkpEUHVZSnFIT3Zxemxha2tORlE5a2ZON1dzWXM1dUhuZHBfemlSZG1PQ1UifQ.
not-a-real-token.ZZL7PNittVwJOeMpFMn2CnVTgIz4AcaWXP9NqMQK0D_iavcRv_p2DVshg6FPe5xCdlhIzbatT6gMyjMrOA2wBg",
"01G3A5GBJECX5DX47P9RV1C5TV": "eyJhbGciOiJFZERTQSIsImtpZCI6IkpEUHVZSnFIT3Zxemxha2tORlE5a2ZON1dzWXM1dUhuZHBfemlSZG1PQ1UifQ.also-not-a-real-token.WrhK-VTs_IzOEALB-T958OojHK5AjYBC5ZT9xiI_6ekdQrKz2kSPGnvZdUXUsTVFDf9Kce1Smh-mw1sF2rSQAQ",
}

各トークンは、関連するブローカーに対して公開またはサブスクライブすることを許可します。

7. トピックにメッセージをサブスクライブおよび公開する

ブローカーが作成され、認証されたクライアントからのメッセージを受け入れる準備が整いました。Pub/SubはMQTTプロトコルに基づいているため、ほとんどの人気のあるプログラミング言語用のクライアントライブラリがあります。推奨クライアントライブラリのリストを参照してください。

以下の例では、Node.jsを使用してMQTT.jsを使用して、ブローカーのトピックにサブスクライブし、非常に基本的な「こんにちは世界」スタイルのメッセージを公開します。サポートされているNode.jsバージョンがインストールされている必要があります。

Terminal window
# Node.jsがインストールされているか確認
which node
# MQTT.jsをインストール
npm i mqtt --save

環境変数を設定します。

Terminal window
export CLOUDFLARE_API_TOKEN="あなたのAPIトークン"
export CLOUDFLARE_ACCOUNT_ID="あなたのアカウントID"
export DEFAULT_NAMESPACE="作成した名前空間"
export BROKER_NAME="作成したブローカー"

Pub/Subのためのアクセストークンを生成できます。MQTTクライアントから認証するために、クライアントIDとトークン(JSON Webトークン)自体の両方が必要です:

Terminal window
curl -s -H "Authorization: Bearer ${CLOUDFLARE_API_TOKEN}" -H "Content-Type: application/json" "https://api.cloudflare.com/client/v4/accounts/${CLOUDFLARE_ACCOUNT_ID}/pubsub/namespaces/namespace/brokers/is-it-broken/credentials?type=TOKEN&topicAcl=#" | jq '.result | to_entries | .[0]'

これにより、clientIdを表すkeyと、私たちの(秘密の)アクセストークンを表すvalueが出力されます。以下のようになります:

{
"key": "01HDQFD5Y8HWBFGFBBZPSWQ22M",
"value": "eyJhbGciOiJFZERTQSIsImtpZCI6IjU1X29UODVqQndJbjlFYnY0V3dzanRucG9ycTBtalFlb1VvbFZRZDIxeEUifQ....NVpToBedVYGGhzHJZmpEG1aG_xPBWrE-PgG1AFYcTPEBpZ_wtN6ApeAUM0JIuJdVMkoIC9mUg4vPtXM8jLGgBw"
}

valueフィールドをコピーし、BROKER_TOKEN環境変数として設定します:

Terminal window
export BROKER_TOKEN="<VALUE>"

index.jsというファイルを作成し、次のことを確認します:

  • brokerEndpointはあなたのPub/Subブローカーのアドレスに設定されています。
  • clientIdは新しく作成したアクセストークンのkeyです。
  • BROKER_TOKEN環境変数は、あなたのアクセストークンで埋められています。
const mqtt = require("mqtt");
const brokerEndpoint = "mqtts://my-broker.my-namespace.cloudflarepubsub.com";
const clientId = "01HDQFD5Y8HWBFGFBBZPSWQ22M"; // これをあなたのクライアントIDに置き換えてください
const options = {
port: 8883,
username: clientId, // MQTT.jsはこれを必要としますが、Pub/Subは必要ありません
clientId: clientId, // Pub/Subで必要です
password: process.env.BROKER_TOKEN,
protocolVersion: 5, // MQTT 5
};
const client = mqtt.connect(brokerEndpoint, options);
client.subscribe("example-topic");
client.publish(
"example-topic",
`クライアントID ${client.options.clientId} からのメッセージ: ${Date.now()} でこんにちは`,
);
client.on("message", function (topic, message) {
console.log(`トピック ${topic} で受信したメッセージ: ${message}`);
});

例を実行します。ターミナル(stdout)に出力が表示されるはずです。

Terminal window
node index.js
> トピック example-topic で受信したメッセージ: こんにちは from 01HDQFD5Y8HWBFGFBBZPSWQ22M at 1652102228

あなたのクライアントIDとタイムスタンプは上記とは異なりますが、非常に似たメッセージが表示されるはずです。また、複数のトピックにサブスクライブし、同じトピック名をclient.publishに渡すことで、複数のトピックに公開することもできます。クライアントが権限を持っている限り、必要に応じて複数のトピックに同時に公開できます。

公開したメッセージが表示されない場合やエラーメッセージが表示される場合は、次のことを確認してください:

  • BROKER_TOKEN環境変数が空でないこと。ターミナルでecho $BROKER_TOKENを試してください。
  • brokerEndpointを作成したブローカーに一致するように更新したこと。
  • 正しくMQTT.jsをインストールしたこと。

次のステップ

次は何をしますか?