📢

Cloud Pub/Sub + Node.jsのローカル開発環境の構築

2021/07/06に公開

概要

Google Cloud Pub/Subのローカルでの開発環境の構築手順です。
今回は、Pub/SubのエミュレータとNode.jsのPub/Sub Clientを利用します。

以下のようなフローが一通りできるまでを作成します。
https://cloud.google.com/pubsub/docs/overview?hl=ja#concepts

エミュレータのインストール

Cloud Pub/Subでは専用のエミュレータが提供されており、これを用いることでローカルでもPub/Sub環境が利用できます。

https://cloud.google.com/pubsub/docs/emulator?hl=ja

事前準備

ローカルエミュレータ利用のための要件に従ってcloud sdkを利用できるようにしておきます。

インストール

以下のコマンドでエミュレータをインストールします。

gcloud components install pubsub-emulator
gcloud components update

エミュレータの起動

以下のコマンドでエミュレータを起動します。
projectはローカル用なので実在しないprojectIdでも利用できます。
今回は、sample-project-local にします。

gcloud beta emulators pubsub start --project=sample-project-local

起動後、メッセージに起動ポートが表示されます。

[pubsub] 情報: Server started, listening on 8085

環境変数の設定

gcloud cliからエミュレータのホストを環境変数に設定します。

$(gcloud beta emulators pubsub env-init)
# PUBSUB_EMULATOR_HOST=localhost:8085

Pub/Subクライアントライブラリのインストール

任意のNodeプロジェクトでPub/Subクライアントライブラリをインストールします。

npm install --save @google-cloud/pubsub

トピックの作成

インストールしたクライアントライブラリ経由で、トピックを作成します。
※ローカルエミュレータの場合、gcloud cliからはトピックを作成できません。
今回は、my-topic という名前のトピックを作成します。

createTopic.js
const { PubSub } = require('@google-cloud/pubsub');

const topicName = 'my-topic';
const pubSubClient = new PubSub();

const createTopic = async () => {
  await pubSubClient.createTopic(topicName);
}

createTopic();
node createTopic.js

サブスクリプションの作成

先程作成したトピックのサブスクリプションを作成します。
今回は、my-subという名前のサブスクリプションを作成します。
サブスクリプションにはpush型とpull型がありますが、今回はpull型で作成します。

createSubscription.js
const { PubSub } = require('@google-cloud/pubsub');

const topicName = 'my-topic';
const subscriptionName = 'my-sub';
const pubSubClient = new PubSub();

const createSubscription = async () => {
  await pubSubClient.topic(topicName).createSubscription(subscriptionName);
};

createSubscription();
node createSubscription.js

サブスクライバの作成と起動

次にサブスクリプションからメッセージを受信し確認応答を返すスクリプトを用意します。
今回は、pull型のサブスクリプションなので定期的にメッセージを確認するようにします。

messageListener.js
const { PubSub } = require('@google-cloud/pubsub');

const subscriptionName = 'my-sub';
const pubSubClient = new PubSub();

const listenMessages = () => {
  const subscription = pubSubClient.subscription(subscriptionName);

  const messageHandler = (message) => {
    console.log(`Received message ${message.id}:`);
    console.log(`\tData: ${message.data}`);
    console.log(`\tAttributes: ${message.attributes}`);

    message.ack();
  };

  subscription.on('message', messageHandler);
}

listenMessages();

スクリプトを実行し、メッセージを取得するワーカープロセスを立ち上げます。

node messageListener.js

トピックへのメッセージの追加

最後にトピックにメッセージを追加するスクリプトを用意し実行します。

pushMessage.js
const { PubSub } = require('@google-cloud/pubsub');

const topicName = 'my-topic';
const pubSubClient = new PubSub();

const pushMessage = async () => {
  await pubSubClient.topic(topicName).publish(Buffer.from('Test message!'));
};

pushMessage();
node pushMessage.js

実行すると、先程立ち上げたサブスクライバのワーカープロセスの方でメッセージを受信していることが確認できます。

$ node messageListener.js
Received message 1:
	Data: Test message!
	Attributes: [object Object]

このようにして、Pub/Subのエミュレータを用いることでローカル環境で開発を行うことができます。
その他の説明や設定等については、ドキュメントに記載されています。
https://cloud.google.com/pubsub/docs?hl=ja

Discussion