Pub/Sub 通知

  • API 設定 Codelab を完了して Google Cloud プロジェクトを設定し、Cloud Channel API を呼び出すサービス アカウントを作成します。

  • この Codelab には、Test Partner Sales Console を使用することをおすすめします。

  • Pub/Sub のコンセプトを十分に理解します。

概要

Cloud Channel API は Pub/Sub を使用して、さまざまな顧客イベントと利用資格イベントに関する通知を配信します。

これは特に次のような場合に役立ちます。

  • ご利用のシステムで Partner Sales Console で直接行われた変更(サポートチーム誰かが Google Workspace の利用資格をキャンセルするなど)を反映します。
  • 販売パートナー経由で購入されたお客様によってトリガーされた重要なイベントを検出します。次に例を示します。
    • 利用規約に同意する Google Workspace のお客様。
    • ドメインの所有権を証明する Google Workspace のお客様。
    • フレキシブルな利用資格でユーザーを追加している Google Workspace のお客様。
    • 移行する Google Workspace のお客様。

Pub/Sub の設定は、次の 3 つのステップで構成されます。

  1. Pub/Sub API を有効にして、サービス アカウントを準備します。

  2. Pub/Sub トピックを作成します。このトピックはチャネル サービスによって所有されています。サブスクリプションを作成できるサービス アカウントを指定します。

  3. Pub/Sub サブスクリプションを作成します。 このサブスクリプションは、Webhook(推奨)または pull を使用して push できます。

push サブスクリプションの場合、チャネル サービスによって出力されたイベントを受信する Webhook をホストします。

チャネル サービスのプッシュ通知

通知形式

Pub/Sub 通知の例を次に示します。メッセージ データは、Base64 エンコードの JSON 文字列として送信されます。

{
  "message": {
    "attributes": {
      "event_type": "LICENSE_ASSIGNMENT_CHANGED",
      "subscriber_event_type": "ENTITLEMENT_EVENT"
    },
    "data": "eyJlbnRpdGxlbWVudF9ldmVudCI6eyJldmVudF90eXBlIjoiTElDRU5TRV9BU1NJR05NRU5UX0NIQU5HRUQiLCJlbnRpdGxlbWVudCI6ImFjY291bnRzL0MwMTIzNDU2L2N1c3RvbWVycy9TMDEyMzQ1NjcvZW50aXRsZW1lbnRzL1NhYmNkZWYxMjM0NSJ9fQ==",
    "message_id": 1918124788439510,
    "publish_time": "2021-01-14T01:23:45.678Z"
  },
  "subscription": "projects/project/subscriptions/channel-pubsub-test"
}

これは同じメッセージ データで、デコードされています。

{
  "entitlement_event": {
    "event_type": "LICENSE_ASSIGNMENT_CHANGED",
    "entitlement": "accounts/C0123456/customers/S01234567/entitlements/Sabcdef12345"}
  }
}

ステップ 1: Pub/Sub API を有効にしてサービス アカウントを準備する

この Codelab を実行するには、次のものが必要です。

  • プロジェクトのサービス アカウントのメールアドレス。このアドレスは、service-account@project.iam.gserviceaccount.com のようになります。
  • 販売パートナー ドメインの特権管理者アカウント(Test Partner Sales Console が望ましい)へのアクセス権。
  • アカウント ID。これは、Partner Sales Console の設定で確認できます。

サービス アカウントを準備するには:

  • Google Cloud コンソールで [API ライブラリ] セクションに移動し、Pub/Sub API を有効にします。
  • サービス アカウントにプロジェクトの Pub/Sub IAM ロールを付与します。 この Codelab コードラボでは、roles/pubsub.editor(ロール名 = 'Pub/Sub 編集者')の付与で十分ですが、本番環境の統合では、よりきめ細かな権限を使用することができます。IAM ロールの詳細については、Pub/Sub のアクセス制御のページをご覧ください。
  • 代わりにカスタムロールを適用する場合は、そのロールにサブスクリプションを作成する pubsub.subscriptions.create 権限を付与する必要があります。

これらのロールと権限がアカウントに適用されるまでに時間がかかることがあります。

ステップ 2: アカウントのトピックを作成する

Pub/Sub トピックを作成するには、accounts.register メソッドを使用する必要があります。このメソッドは、サービス アカウントのメールアドレスをパラメータとして受け取ります。新しいトピックには、このメソッドを介して承認されたサービス アカウントのみ登録できます。

  1. accounts.register ドキュメントに移動して、[試してみる] をクリックします。
  2. account フィールドに「accounts/ACCOUNT_ID」と入力します。ACCOUNT_ID はアカウント ID に置き換えます。
  3. [リクエスト本文のパラメータを追加] をクリックし、serviceAccount を選択してサービス アカウントのメールアドレスを入力します。
  4. [実行] をクリックし、販売パートナー ドメインの特権管理者としてログインします。

次のような 200 のレスポンスが返されます。

{
  "topic": "projects/cloud-channel-pubsub/topics/C0123456-notify"
}

これは、イベントが送信される Pub/Sub トピックです。

ステップ 3: トピックに登録する

Pub/Sub トピックを作成したら、アプリケーションの変更イベントの使用方法を設定する必要があります。この場合は、次のどちらかを行ってください。

  • push サブスクリプション: HTTP POST コールバックを指定します。Pub/Sub はこれを使用して、新しいイベントをアプリケーションに通知します。
  • pull サブスクリプション: アプリケーションは定期的に HTTP 呼び出しを行い、キューに入れられた変更を取得します。

この Codelab では、push を使用してすべてのイベントを Cloud Functions に送信し、Cloud Logging にログを記録します。

チャネル サービス通知の Cloud Functionsへの push

ステップ 3a: Cloud Functions の関数を作成する

このステップでは、受信したメッセージをログに記録する Cloud Functions の関数を作成します。

  1. Google Cloud コンソールの Cloud Functions セクションに移動します。Cloud Functions API の有効化が必要になる場合があります。
  2. [ファンクションを作成] をクリックします。
  3. [構成] 画面で次の操作を行います。
    1. 関数の名前を変更します。必要に応じて、別のリージョンを選択します。
    2. HTTP トリガーで、[認証] を [未認証の呼び出しを許可] に変更して、[保存] をクリックします。
    3. [トリガー URL] をメモしておきます。次のステップでこれが必要になります。
    4. [次へ] をクリックします。
  4. [コード] 画面で次の操作を行います。

    1. 任意の Node.js ランタイムを選択する
    2. [エントリ ポイント] を log に変更します。
    3. index.js ファイルで、サンプルコードを次のように置き換えます。
    exports.log = (req, res) => {
      if (req.body && req.body.message) {
        console.log(req.body);
        const message = req.body.message;
        // data is base64-encoded JSON
        const data = new Buffer.from(message.data, 'base64').toString();
        console.log(data);
      }
      res.status(200).send('OK');
    };
    

Cloud Functions の関数がデプロイされている間、次の手順に進みます。

ステップ 3b: サブスクリプションを作成する

チャネル サービス トピック(ステップ 2 を参照)に登録されたサービス アカウントのみ、サブスクリプションを作成できます。

これを行うには、サービス アカウントの認証情報を使用して Pub/Sub API を呼び出します。販売パートナー ドメインの特権管理者の権限を借用しないようにしてください。これは、Cloud Channel API を呼び出すときに必要になります。

この Codelab では、Cloud Shell で gcloud CLI ツールを使用します。

  1. Google Cloud コンソールの上部にある [Cloud Shell をアクティブにする] アイコンをクリックします。

  2. シェルの準備ができたら、次のコマンドを実行します。SERVICE_ACCOUNT の値はサービス アカウントのメールアドレスに、TOPIC はステップ 2 で作成したトピックに置き換え、PUSH_ENDPOINT は 手順 3a で作成した Cloud Functions 関数のトリガー URL に置き換えます。

    SERVICE_ACCOUNT=service-account@project.iam.gserviceaccount.com
    TOPIC=projects/cloud-channel-pubsub/topics/C0123456-notify
    PUSH_ENDPOINT=https://us-central1-project.cloudfunctions.net/pubsub
    
  3. シェルでサービス アカウントを有効にします。

    gcloud iam service-accounts keys create sa-keys.json \
        --iam-account=$SERVICE_ACCOUNT
    gcloud auth activate-service-account --key-file=sa-keys.json
    
  4. サブスクリプションを作成します。

    gcloud pubsub subscriptions create channel-pubsub-test \
        --topic=$TOPIC \
        --push-endpoint=$PUSH_ENDPOINT
    

Pub/Sub サブスクリプション セクションに移動すると、サブスクリプションが設定されていることを確認できます。

データを生成する

前の手順を完了すると、データを受信できるようになります。

最も簡単な方法は、Partner Sales Console 顧客を作成し、プロダクトをプロビジョニングすることです。エンドツーエンドの Workspace プロビジョニング Codelab が完了したら、サンプルコードを実行して Google Workspace で顧客を作成できます。

Google Cloud コンソールで関数に移動し、[ログ] タブを開きます。 表示される内容の例を次に示します。

Pub/Sub イベントのサンプルログ

クリーンアップ

  • Cloud Functions の関数を削除する
  • サブスクリプションを削除する

トピックは、サブスクライバーがなくなると自動的にクリーンアップされます。

次のステップ

この Codelab では、チャネル サービスが Pub/Sub を活用して、リアクティブかつ大規模に統合を構築する方法を説明しました。

イベント リファレンス

チャネル サービスによって生成されるイベントのリストについては、RPC リファレンスをご覧ください。

API リファレンス

この Codelab では Google Cloud コンソールを使用しますが、これらの手順はプログラムで実行できます。手順は次のとおりです。

Pub/Sub の保証とベスト プラクティス

イベントとその通知の間の遅延は保証されません。同様に、通知の順序は保証されません。最後に、メッセージが複数回配信される可能性があります。

push エンドポイントのベスト プラクティス:

  • メッセージの遅延、送信の順不同、複数回の送信の可能性があるため、エンドポイントはべき等とし、customers.get および entitlements.get を使用する必要があります。

  • push のデフォルトの Pub/Sub タイムアウトは 10 秒ですが(Pub/Sub サブスクリプションの ackDeadline を使用して増やすことが可能)、メッセージ ベースのアーキテクチャを使用し、エンドポイントが可能な限り迅速に応答するようにすることをおすすめします。

  • エンドポイントが停止するか 5xx エラーを返した場合、Pub/Sub は再試行します。詳細については、Pub/Sub のドキュメントで push を介してメッセージを受信する方法をご覧ください。

pull を使用する場合は、Pub/Sub のドキュメントで pull でメッセージを受信する方法をご覧ください。

イベント フィルタリング

チャネル サービスの通知には attributes が含まれているため、Pub/Sub フィルタリングを使用して特定の Pub/Sub サブスクリプションを作成することで、きめ細かいサブスクリプションを作成できます。

たとえば、attributes.event_type = "LICENSE_ASSIGNMENT_CHANGED" でフィルタリングすると、Google Workspace のすべてのシート変更を追跡できます。