Hightouchを使ってDWH上のデータをBrazeのユーザーデータとして連携してみた

2022.06.28

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

さがらです。

Reverse ETLサービスであるHightouchを使って、DWH上のデータをBrazeのユーザーデータとして連携してみたので、その方法をまとめてみます。

Hightouchを用いる必要性

始めに「なんでHightouchのような別サービスをわざわざ使う必要があるの?」と感じる方もいると思いますので、Hightouchを用いる必要性について記述しておきたいと思います。

まず前提として、Brazeを使用する上でユーザーデータは欠かせないもので、必ず何かしらの方法でユーザーデータをインポートする必要があります。

ユーザーデータをインポートする方法は「REST API」と「CSVファイルのインポート」の2種類あります。

こちらのブログでは「CSVファイルのインポート」の方法でユーザーデータをインポートしていますが、CSVのためどうしてもマニュアルの操作が発生してきます。(CSVファイルのインポートが取っ掛かりとしては一番手軽なので悪いことばかりではないのですが…)

一方でREST APIを使って、DB/DWHのデータをBrazeへユーザーデータとして連携しようとすると、

  • 対象のDB/DWHからデータを抽出し、BrazeのAPIを叩いてデータ連携する処理の開発
  • 開発した処理を定期実行する環境
  • 抽出するデータの変更やAPIの仕様変更時のコードメンテナンスの対応

といったものが必要となってきます。API周りの開発に慣れていない方からすると、大変かつ時間のかかる工程となります。

そこで、HightouchのようなReverse ETLのサービスの出番です!

Hightouchを使うことで、「DB/DWHからデータを抽出しBrazeのREST APIを用いてデータ連携する」ということをGUIベースの操作で簡単に実現可能です。

もしAPIの仕様変更があったとしても、Hightouch側で仕様変更に対応してくれるため、ユーザー側での対応は不要です。 また、開発したコードのメンテナンスや実行環境の運用も不要となります。

このため、自社でAPI周りの開発・運用を担える体制が整っていない限りは、HightouchのようなReverse ETLのサービスを使うべきだと私は考えています。

Braze側(Destination)に関する設定

ということで、早速Hightouchを用いたユーザーデータの連携を試していきます!

BrazeでAPI KeyとREST Endpointの取得

まず、HightouchはBrazeのREST APIを使ってデータを登録するため、Braze側で必要なAPI KeyとREST Endpointを確認する必要があります。

Brazeの画面の左側のメニューバーから、「SETTINGS」➟「Developer Console」を押します。

新しいREST API Keyを生成するため、「Rest API Keys」欄の右上「+ Create New API Key」を押します。

「API Key Name」に作成するAPI Keyの名前を入力し、パーミッションはユーザーデータの登録に必要なusers.trackusers.export.idsにチェックを入れます。

その後、画面右下の「Save API Key」を押します。

これで、API Keyが生成できました!この情報を後でHightouchで入力する必要がありますので、このBrazeの画面は別タブで残したまま、次工程に行くことをオススメします。

HightouchでのDestination設定

続いて、Hightouch上でのデータ連携先となるDestinationの設定を行います。このDestinationがBrazeになるので、先程生成したAPI KeyとREST Endpointが必要になります。

Hightouchの画面上で、左のメニューバーから「Destinations」を押します。

新しいDestinationを追加するため、右上の「Add destination」を押します。

左上の検索欄に「braze」と入れると、2つ候補が出てきます。この内、Hightouchとのユーザーデータの連携で使用する「Braze」を選択し、右上の「Continue」を押します。

すると、Brazeとの連携に必要な情報を入れる画面が出てきます。それぞれ、以下の情報を入力します。

  • API Key:Brazeの画面で生成した「API Key」の「Identifier」
  • Region:使用しているBrazeのURLに沿った「REST Endpoint」を入力
    • 例えば、BrazeのURLがhttps://dashboard-01.braze.eu/...の場合は、fra-01.braze.euと入力します。
    • Brazeのインスタンスを構築している環境によってREST Endpointが異なります。詳しくは公式Docをご確認ください。

それぞれ入力が完了したら、右上の「Continue」を押します。

最後に、作成するDestinationの名前を入力します。入力を終えたら、右上の「Finish」を押して設定は完了です。

DWH側(Model)の設定

続いて、Brazeに連携したいデータを定義するため、Modelを設定していきます。

連携させるデータ

今回Snowflake上で事前に下図のようなデータを作っておきました。合計100行のデータで、USER_IDをBrazeのユーザーデータにおけるexternal_idとして連携する想定です。

また、Brazeのユーザーデータにおける標準項目であるfirst_namephoneの項目にも対応させるカラムを用意しています。(emailにも対応させたかったのですが、正しいメールアドレスじゃないとSync時にエラーを起こしてしまいました…)

HightouchでのModel設定

先程のSnowflake上のデータを参照するため、Hightouch上でModelとして設定していきます。

Hightouchの画面上で、左のメニューバーから「Models」を押します。

新しいModelを追加するため、右上の「Add model」を押します。

使用するDWH(Source)を選択し、右上の「Continue」を押します。

※Sourceの設定がまだの場合には、Sourceの追加が必要です。詳しくはHightouchの公式Docをご確認ください。

続いて、どうやって抽出するデータを定義するか選択する画面が出てきます。今回はSnowflake上のテーブルをそのまま参照したいため、「Table Selector」を押します。

「Table Selector」を押すと、Sourceの設定で「Database」欄に記述したデータベース内のテーブルの一覧が表示されます。

逆に言うと、Sourceの「Database」欄に何のテーブルも入っていないDatabaseを選択すると何も表示されません。私はSnowflake Partner Connectで構築した環境を使っていたので、SourceのDatabase欄がPC_HIGHTOUCH_DBになっており、何も表示されず焦りました…

連携したいテーブルを選んだ上で、右上の「Continue」を押します。

最後に、作成したModelの名前などを入力し、右上の「Finish」を押します。これで、DWH側の設定は完了です!

Syncしてみる

これまでの作業で、連携先のBrazeをDestinationとして、DWH側で連携させたいデータをModelとして、設定が完了しました。 このDestinationとModelを紐づける、Sync処理を作成していきます。

画面左のメニューバーから「Syncs」を押します。

新しいSyncを追加するため、右上の「Add sync」を押します。

先程作成したModelを選択し、右上の「Continue」を押します。

続いて、先程作成したDestinationを選択し、右上の「Continue」を押します。

すると、Brazeへのユーザーデータ連携用の設定画面が出てきます。

まず、ユーザーデータの連携の場合は下図のように「Object」、「User」と選択します。

ユーザーデータのアップデート方法については、基本的に「Upsert」で良いと思います。

続いて、ユーザーデータのPrimary Keyとなるexternal_idと、選択したModelの内どのカラムが紐づくのかを選択します。

次に、ユーザーデータのemailなどの標準項目と、選択したModelの内どのカラムが紐づくのかを選択します。 「Add mapping」を押すと、マッピングするカラムを増やすことができます。

また、今回は設定しませんがユーザーデータのカスタム属性も新しく作成し紐づけることが可能です。

ここまで設定が終わったら、画面右上の「Test」を押してテストしてみます。

テスト用のポップアップが出てきて、左側にModelで抽出したデータに関する情報が出てきます。

ここで、右上の「Sync as added row」を押すと、DestinationであるBrazeへ登録される値がJSON形式で表示されます。

また、「Sync as changed row」や「Sync as removed row」といったテストに切り換えることもできるようです。

テストが問題なく終わったら、右上の「Continue」を押します。

SyncのスケジュールとSlugの設定を終えたら、右上の「Finish」を押します。

これでSyncの設定は完了したので、早速Syncしてみましょう!画面右上の「Run」を押します。

無事に成功すると、STATUSが「HEALTHY」になります。

Braze上で正しくユーザーデータが反映されているかを検索してみると、無事に登録できていることが確認できました!

DWHのデータを更新した上で、Syncしてみる

続いて、DWH上のデータを更新した上で、Syncするとどうなるのかを試してみます。

  • あるレコードのPHONE_NUMBERを変更(USER_ID9245d9a0-2fb7-4eb7-b9c0-024f22986b21のレコードのPHONE_NUMBER11-111-111-1111に変更)

  • 下図のレコードを削除(USER_IDcfc74531-7239-47ee-8e2f-98bb4733fa3eのレコードを削除)

これらの変更を行った後で、HightouchでSyncをしてみます。

結果としては、Changed:1行、Removed:1行、ということでどちらも検知はされたようです。

この上でBrazeでユーザーデータを確認してみます。

まず、USER_ID9245d9a0-2fb7-4eb7-b9c0-024f22986b21のレコードのPHONE_NUMBER11-111-111-1111に変更したものについては、電話番号が変わっていました。

一方で、USER_IDcfc74531-7239-47ee-8e2f-98bb4733fa3eのレコードを削除したのですが、これは消えていませんでした。

この原因として、Hightouchに付与しているBrazeのAPI Keyにusers.deleteを付与していないことが原因ではないか、と推測しました。私も公式Docに沿ってパーミッションは設定したのですが、この記述通りに設定するとusers.deleteは付与しないようになっていました。

なので、次章でこのusers.deleteパーミッションを付与したときにどうなるか、確かめてみます!

DWHのデータを更新した上で、Syncしてみる(削除検知リベンジ)

今度は、BrazeのAPI Keyのパーミッションにusers.deleteを付与した上で、もう一度対象テーブルからレコードを削除し、該当するユーザーデータが削除されるか試してみます。

BrazeのAPI Keyは下図のように設定します。DestinationのAPI Keyの値も忘れずに変更しておきます。

この上で、Snowflake上で下図のレコードを削除します。(USER_IDe7d7a358-fc3c-4096-a167-14c663dfd81fのレコードを削除)

レコード削除後に、Syncをしてみます。

結果としては、Removed:1行、ということで検知はされたようです。

しかし、Braze上でユーザーは残っていました。つまり、HightouchからBrazeのユーザーデータは削除できない、ということがわかりました。

ユーザーデータはBrazeのGUI画面からも削除ができず、基本的にはAPIを介しての削除しかできません。そのため、削除したレコードの検知はHightouchとして行うものの、実際にBraze上のユーザーデータは簡単に削除できないように設計されているのかもしれませんね。

最後に

Hightouchを使って、DWH上のデータをBrazeのユーザーデータとして連携してみました。

実際のこの処理を自分でつくろうとした場合、下記のリンク先のようなコードを記述しないといけません。これは、S3上のデータを読み込んでBrazeに送るサンプルコードなのですが、正直このようなコードを書いてメンテナンスしていくのは大変ですよね。笑

なので、HightouchのようなReverse ETL製品の良さを更に知ることができたなと感じます。

個人的にも触っていて面白い製品なので、もっと色々試していきたいですね!