Salesforce Pub/Sub API を利用してみる 

※ これから記載する事項は、私が所属する会社とは一切関係のない事柄です。

今回は [Pub/Sub API](https://developer.salesforce.com/docs/platform/pub-sub-api/overview) の[サンプル](https://github.com/developerforce/pub-sub-api/tree/main/go/examples)を実行する方法を紹介したいと思います。

## Pub/Sub API では何ができるの？

Pub/Sub API は gRPC と HTTP/2 に基づいた API で、リアルタイムでイベントを介してデータのやり取りを行うことができます。公開されたイベントはイベントバスに 72 時間保存されるので、一時的に切断されていたとしても過去のイベントを再取得することができます。

ユースケースとしては外部システムとのデータの同期やオブジェクト変更時の通知といったようなことが挙げられます。

Trailhead の「[Pub/Sub API を使用する](https://trailhead.salesforce.com/ja/content/learn/modules/api_basics/api_basics_streaming)」に記載のイベントの種類は下記の通りです。


* **変更データキャプチャ** — 変更データキャプチャを使用すると、サポート対象である変更された項目すべてのレコードの変更を受信します。追跡されるレコード操作は、レコードの作成、更新、削除、復元です。各イベントメッセージには、変更に関する情報を表示するヘッダー項目が含まれます。
* **プラットフォームイベント** — カスタムプラットフォームイベントを使用して、カスタム通知を公開および登録できます。プラットフォームイベントオブジェクトと項目を作成して、イベントデータのスキーマを定義できます。また、リアルタイムイベント監視イベントなど、Salesforce によって定義および公開される標準プラットフォームイベントに登録して、Salesforce 内のユーザー関連アクティビティやセキュリティ関連アクティビティなどを監視できます。



## Pub/Sub API サンプルの使い方

Salesforce は Github は gRPC の定義ファイルである [proto ファイル](https://github.com/developerforce/pub-sub-api/blob/main/pubsub_api.proto) を公開していると同時にさまざまな言語で[サンプル](https://github.com/developerforce/pub-sub-api/tree/main/go/examples)を公開していますので、そちらの使い方を紹介したいと思います。

:::note warn
今回は Go を利用する想定で記載しますが Go のインストール方法については割愛します。
:::

#### 1. 接続アプリケーションの作成

以前紹介した Qiita「Salesforce Bulk API 2.0 を使ってみる」の「[1. 接続アプリケーションの作成とアクセストークンの取得](https://qiita.com/syunyama/items/51fc2bc368de9265e8ec#1-%E6%8E%A5%E7%B6%9A%E3%82%A2%E3%83%97%E3%83%AA%E3%82%B1%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AE%E4%BD%9C%E6%88%90%E3%81%A8%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%83%88%E3%83%BC%E3%82%AF%E3%83%B3%E3%81%AE%E5%8F%96%E5%BE%97)」と同様です。


#### 2. Github から　ソースコードをクローン or ダウンロード

Github レポジトリ「[pub-sub-api](https://github.com/developerforce/pub-sub-api/tree/main)」をクローン or ダンロードしてください。すると下記のようなフォルダ構成のソースコード群が取得できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/f6d4cbb6-54d4-86d2-f0b8-afab8acf4590.png)



#### 3.  Go のサンプルコードの変数を上書きする

`go/common/common.go` ファイルの下記の変数にそれぞれ値を設定します。

|変数名	|説明	|
|---	|---	|
|ClientId	|接続アプリケーションの「コンシューマ鍵」	|
|ClientSecret	|接続アプリケーションの「コンシューマの秘密」	|
|Username	|組織にログインする際のユーザ ID	|
|Password	|組織にログインする際のパスワード	|
|OAuthEndpoint	|「[https://login.salesforce.com](https://login.salesforce.com/)」。サンドボックスの場合は「[https://test.salesforce.com](https://test.salesforce.com/)」	|
|TopicName	|登録するイベントのトピック名（後述）。	|

![スクリーンショット 2023-12-25 16.17.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/81c691a6-64b0-d1d2-151d-156c1386babe.png)



#### 4. 実行する

今回はイベントに登録（サブスクライブ）します。下記のように `go/examples` フォルダ内にあるサブスクライブするためのサンプルを実行します。

```bash
# go フォルダ内に移動
cd go

# 依存関係のダウンロード
go mod vendor

# サブスクライブの実行
go run examples/subscribe/main.go
```


実行すると下記のようにイベントの発生を待つようになります。

:::note warn
この時点で有効なトピック名を設定してない場合はエラーが発生します。
:::

![image (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/b54377ef-0bbb-73be-5662-158d137a53fd.png)




## 「変更データキャプチャ」をサブスクライブしてみる

今回は取引先が変更された想定でどのようにサブスクライブされるかを確認します。

:::note warn
変更データキャプチャで利用できるオブジェクト限られます。一覧は[こちら](https://developer.salesforce.com/docs/atlas.en-us.246.0.object_reference.meta/object_reference/sforce_api_associated_objects_change_event.htm)です。
:::

#### 1. 変更データキャプチャの設定（[ヘルプ](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_select_objects.htm)）

**設定 > 変更データキャプチャ** に遷移し、**[選択されたエンティティ]** として取引先を選択し、保存します。
![スクリーンショット 2023-12-25 16.45.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/5caf1405-9a96-2e42-fa3b-943768f45933.png)


#### 2. Go の変数の上書き

Go の `go/common/common.go` ファイルの `TopicName` に取引先オブジェクトの変更イベントを設定します。
標準オブジェクトの変更イベントは `/data/<Standard_Object_Name>ChangeEvent` のようなフォーマットで入力されるので、取引先 (Accout) オブジェクトの場合は `/data/AccountChangeEvent` となります。

:::note info
その他のフォーマットについては「[Subscription Channels](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_subscribe_channels.htm)」をご覧ください。
:::

![スクリーンショット 2023-12-25 16.52.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/017d17ac-9e93-d8b7-9aaa-75a2f31dd0d6.png)



#### 3. サブスクライブして取引先を変更してみる

再度コマンドを実行します。

```bash
go run examples/subscribe/main.go
```

そして取引先の名前を「A」から「B」に変更してみます。
![スクリーンショット 2023-12-25 16.57.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/81adebfe-8a36-bdbc-9372-f75ef20f59bc.png)

すると、下記のように変更イベントが表示されるのがわかります。
![スクリーンショット 2023-12-25 16.59.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/bb77933a-880b-c729-f80e-5f247cbdeebd.png)



## 「プラットフォームイベント」をサブスクライブしてみる

今回は注文概要オブジェクトの変更を知らせるプラットフォームイベントを作成してそれをフローで公開してみようと思います。

#### 1. プラットフォームイベントの設定（[ヘルプ](https://developer.salesforce.com/docs/atlas.ja-jp.246.0.platform_events.meta/platform_events/platform_events_define_ui.htm)）

**設定 > プラットフォームイベント** から「Order Summary Change」というイベントを作成しました。
![スクリーンショット 2023-12-25 17.09.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/94ee699f-3aec-088f-b6a7-b85c6e0d1ef1.png)

イベントオブジェクトのフィールドとして注文番号 (Order No) と状況 (Status) を設定しました。
![スクリーンショット 2023-12-25 17.11.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/e30be745-36e6-10fc-8abf-051cee3f0b1e.png)



#### 2. Go の変数の上書き

Go の `go/common/common.go` ファイルの `TopicName` に「Order Summary Change」イベントを設定します。
プラットフォームイベントは `/event/`*`Event_Name`*`__e` のようなフォーマットで入力されるので、「Order Summary Change」イベントの場合は `/event/Order_Summary_Change__e` となります。

:::note
- これはプラットフォームイベントの詳細ページの **[API 参照名]** からも確認できます。
- その他のフォーマットについては「[Subscribe to Platform Event Notifications with Pub/Sub API](https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_subscribe_pubsub_api.htm)」をご覧ください。
:::
![スクリーンショット 2023-12-25 17.14.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/2dcdebca-eb39-5a0e-91ba-c377f95a1f6f.png)


#### 3. フローを作成して実行してみる

再度コマンドを実行します。

```bash
go run examples/subscribe/main.go
```

「Order_Summary_Change」オブジェクトレコードを作成するシンプルなフローを作成します。
![スクリーンショット 2023-12-25 17.21.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/676f24f3-b5c5-1975-e2d6-570fa5e70418.png)


「Order_Summary_Change」オブジェクトフィールドの Order No には「1234567」、Status には「Approved」を設定し実行します。
![スクリーンショット 2023-12-25 17.21.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/704ee4a5-8e33-7a0a-6723-f78930b88135.png)


すると下記の通り公開際れたイベントを取得することができます。
![スクリーンショット 2023-12-25 17.22.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2110894/0592dc6e-1f24-1d51-8885-1e8366294932.png)