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

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

このドキュメントでは、Google Cloud クライアント ライブラリを使用して、フレキシブル環境で動作するアプリで Google 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 beta pubsub topics create YOUR_TOPIC_NAME
    gcloud beta 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 を編集する

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

    // The following environment variables are set by app.standard.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, (req, res, next) => {
      if (!req.body.payload) {
        res.status(400).send('Missing payload');
        return;
      }
    
      publisher.publish(Buffer.from(req.body.payload), (err) => {
        if (err) {
          next(err);
          return;
        }
        res.status(200).send('Message sent');
      });
    });

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

    ローカルで実行する場合は、Google Cloud SDK から認証を行えば、Google Cloud APIs を使うことができます。前提条件で説明したように環境がセットアップしてあれば、この認証を行う 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 ":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.standard.yaml があるディレクトリから次のコマンドを実行します。

    gcloud app deploy app.standard.yaml
    

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

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

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

Node.js 用 App Engine スタンダード環境に関するドキュメント