Cloud Pub/Sub + Node.jsのローカル開発環境の構築
概要
Google Cloud Pub/Subのローカルでの開発環境の構築手順です。
今回は、Pub/SubのエミュレータとNode.jsのPub/Sub Clientを利用します。
以下のようなフローが一通りできるまでを作成します。
エミュレータのインストール
Cloud Pub/Subでは専用のエミュレータが提供されており、これを用いることでローカルでもPub/Sub環境が利用できます。
事前準備
ローカルエミュレータ利用のための要件に従って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
という名前のトピックを作成します。
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型で作成します。
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型のサブスクリプションなので定期的にメッセージを確認するようにします。
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
トピックへのメッセージの追加
最後にトピックにメッセージを追加するスクリプトを用意し実行します。
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のエミュレータを用いることでローカル環境で開発を行うことができます。
その他の説明や設定等については、ドキュメントに記載されています。
Discussion