Pub/Sub メッセージの作成と応答

Cloud Pub/Sub は、信頼できる多対多の非同期メッセージングをアプリケーション間で行います。パブリッシャー アプリケーションはメッセージを「トピック」に送信し、その他のアプリケーションはそのトピックをサブスクライブしてメッセージを受信できます。

このドキュメントでは、Google Cloud クライアント ライブラリを使用して、フレキシブル環境で動作中のアプリで Cloud Pub/Sub メッセージを送受信する方法を説明します。

前提条件

  • App Engine の Node.js 用「Hello, World!」の説明に沿って環境とプロジェクトを設定し、App Engine での Node.js アプリの構造を理解してください。
  • このドキュメントで説明しているサンプルアプリを実行する際に必要となるため、プロジェクト ID をメモして保存しておきます。

サンプルアプリのクローン作成

サンプルアプリをローカルマシンにコピーし、pubsub ディレクトリに移動します。

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/appengine/pubsub

トピックとサブスクリプションの作成

トピックとサブスクリプションを作成します。Pub/Sub サーバーがリクエストを送信するエンドポイントも指定します。

gcloud pubsub topics create YOUR_TOPIC_NAME
gcloud pubsub subscriptions create YOUR_SUBSCRIPTION_NAME \
    --topic YOUR_TOPIC_NAME \
    --push-endpoint \
    https://YOUR_PROJECT_ID.appspot.com/pubsub/push?token=YOUR_TOKEN \
    --ack-deadline 10

YOUR_TOKEN は、ランダムなシークレット トークンで置き換えます。push エンドポイントがこれを使用してリクエストを検証します。

環境変数の設定

app.flexible.yaml を編集して、プロジェクト ID、トピック、検証トークンの各環境変数を設定します。

env_variables:
  PUBSUB_TOPIC: YOUR_TOPIC_NAME
  # This token is used to verify that requests originate from your
  # application. It can be any sufficiently random string.
  PUBSUB_VERIFICATION_TOKEN: YOUR_VERIFICATION_TOKEN

コードのレビュー

サンプルアプリでは、Google Cloud クライアント ライブラリを使用しています。

このサンプルアプリでは、app.flexible.yaml ファイルに設定された値を使用して環境変数を構成します。push リクエスト ハンドラは、これらの値を使用して、Pub/Sub からのリクエストで、信頼できる送信元から送信されていることを確認します。

// The following environment variables are set by app.flexible.yaml when
// running on App Engine, but will need to be manually set when running locally.
var PUBSUB_VERIFICATION_TOKEN = process.env.PUBSUB_VERIFICATION_TOKEN;
var pubsub = gcloud.pubsub({
    projectId: process.env.GOOGLE_CLOUD_PROJECT
});
var topic = pubsub.topic(process.env.PUBSUB_TOPIC);

このサンプルアプリは、グローバル リストを使用して、このインスタンスで受信したメッセージを保存します。

// List of all messages received by this instance
var messages = [];

このメソッドは、push されたメッセージを受信し、messages グローバル リストに追加します。

app.post('/pubsub/push', jsonBodyParser, (req, res) => {
  if (req.query.token !== PUBSUB_VERIFICATION_TOKEN) {
    res.status(400).send();
    return;
  }

  // The message is a unicode string encoded in base64.
  const message = Buffer.from(req.body.message.data, 'base64').toString(
    'utf-8'
  );

  messages.push(message);

  res.status(200).send();
});

このメソッドは、App Engine ウェブアプリと連携して新しいメッセージを公開し、受信したメッセージを表示します。

app.get('/', (req, res) => {
  res.render('index', {messages: messages});
});

app.post('/', formBodyParser, async (req, res, next) => {
  if (!req.body.payload) {
    res.status(400).send('Missing payload');
    return;
  }

  const data = Buffer.from(req.body.payload);
  try {
    const messageId = await topic.publish(data);
    res.status(200).send(`Message ${messageId} sent.`);
  } catch (error) {
    next(error);
  }
});

サンプルをローカルで実行する

ローカルで実行する場合、Google Cloud API を使用するための認証を行うには、Cloud SDK を利用します。前提条件に記載されているとおりに環境をセットアップしていれば、この認証を行う gcloud init コマンドはすでに実行されています。

次に、アプリケーションを起動する前に環境変数を設定します。

export GOOGLE_CLOUD_PROJECT=[your-project-id]
export PUBSUB_VERIFICATION_TOKEN=[your-verification-token]
export PUBSUB_TOPIC=[your-topic]
npm install
npm start

プッシュ通知のシミュレート

アプリケーションは、ローカルでメッセージを送信できますが、push メッセージを受信することはできません。push メッセージをシミュレートするには、ローカルのプッシュ通知エンドポイントに HTTP リクエストを送信します。このサンプルには、sample_message.json というファイルが含まれています。

curl または httpie を使用して、HTTP POST リクエストを送信できます。

curl -H "Content-Type: application/json" -i --data @sample_message.json "localhost:8080/pubsub/push?token=[your-token]"

または

http POST ":8080/pubsub/push?token=[your-token]" < sample_message.json

レスポンス:

HTTP/1.1 200 OK
Connection: keep-alive
Date: Mon, 31 Aug 2015 22:19:50 GMT
Transfer-Encoding: chunked
X-Powered-By: Express

リクエストの完了後、localhost:8080 を更新すると、受信メッセージのリストにメッセージが表示されます。

App Engine 上で実行する

gcloud コマンドライン ツールを使用してデモアプリを App Engine にデプロイするには、app.flexible.yaml が配置されているディレクトリから次のコマンドを実行します。

gcloud app deploy app.flexible.yaml

これで、https://[YOUR_PROJECT_ID].appspot.com のアプリケーションにアクセスできます。フォームを使用してメッセージを送信できますが、アプリケーションのどのインスタンスが通知を受信するかはわかりません。複数のメッセージを送信してページを更新すると、受信メッセージを確認できます。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Node.js ドキュメントに対応した App Engine フレキシブル環境