HightouchでSlackをDestinationとして設定し、レコードの追加・変更・削除に対して動的にSlackへメッセージを送信してみた

2023.12.01

さがらです。

HightouchのDestinationとしてSlackを設定し、Syncを行ってみたので本記事でその内容をまとめてみます。

HightouchでのSlack連携について

HightouchでのSlack連携ですが、4パターンの連携が可能です。

  • Message
    • Modelとして設定したクエリ・テーブルに対し、前回のSync以降に追加、変更、削除されたレコードごとに個別のメッセージを送信する。初回実行時にはメッセージは送信されない。
  • Batch Message
    • Modelとして設定したクエリ・テーブルが返す結果をすべてメッセージに含めて送信する
  • Table
    • Modelとして設定したクエリ・テーブルが返す結果をすべて表形式に変換して送信する
  • CSV
    • Modelとして設定したクエリ・テーブルが返す結果をすべてCSVに変換して添付し、送信する

より詳しくは下記の公式ドキュメントをご覧ください。

検証すること

上述の「Message」を試してみます。

前準備として、SourceはSnowflakeを設定し、Snowflake上で事前に1つ簡単なテーブルを作成しておき、それをModelとして使用します。(使用するテーブルは、dbtのチュートリアルで使うjaffle_shopのordersテーブルです。)

本記事では以下の3項目について確認します。

  • DestinationとしてSlackを設定
  • Syncの設定
  • レコードの追加・削除でどのような挙動をするか

DestinationにSlackを追加する

Destinationの設定

まず、DestinationとしてSlackを追加していこうと思います。

Hightouchの左メニューのDestinationsを押し、Add destinationを押します。

Slackを選択し、Continueを押します。

すると、OAuthによる認証でHightouchとSlackを設定しますよ、という画面が出てきます。Log in to Slackを押します。

下図のような画面に移動しますので、問題なければ許可するを押します。

すると、Hightouchの画面に戻りますので、右下のContinueを押します。

※注意点:私はこの画面ではなくDestinationの一覧画面に戻ってしまうことがありました。Hightouch社のサポートに問い合わせたところ、Hightouchと対象のSlackワークスペースどちらも一度ログアウト&再ログインをすることで解決しました。

最後にDestination nameに任意の名前を入力し、右下のFinishを押します。

Slack上での通知先のチャンネルへのHightouchアプリの追加

上述のOAuth認証が無事に成功すると、Hightouchのアプリが対象のSlack Workspaceにインストールされます。

この状態で、Hightouch経由でSlackの宛先としたいチャンネルにHightouchアプリを追加する必要があります。

対象のSlackチャンネル上で右クリックし、チャンネル詳細を表示するをクリックします。

インテグレーションタブから、アプリを追加するを押します。

アプリを選択して追加する画面が表示されますので、Hightouchの行で追加を押します。

これで準備はOKです!

Syncの設定

続けて、Syncの設定をしていきます。

Hightouchの左メニューのSyncsを押し、Add syncを押します。

使用するModelを選択します。

先程作成したSlackのDestinationを選択します。

詳細な設定に移ります。

How do you want to update the records in Slack?では、今回Messageを試すためMeassageを選択します。

Which channel would you like to send updates to?では、メッセージの送信先となるSlackチャンネルを指定します。これはHightouchのSlackアプリを入れたチャンネルしか選択できないようになっています。

Is the content for the message plaintext or Slack Block Kit?では、メッセージの記述に普通のテキスト形式を用いるか、SlackのBlock Kit Builderの形式を用いるかを選択できます。

今回はPlaintextで行います。こちらでもLiquidを用いたレコードの値に応じた動的な制御などは可能です。

What content would you like to send when a record is added/changed/removed?では、実際にSlackに送信されるメッセージを記入します。

{{と入れると、Modelに含まれるカラム名をサジェストしてくれる仕様ですので、入力しやすいですね!

今回は、addedis changedについて、以下のように記入しておきます。

<@name>とすると、対象のユーザーに対してメンションすることもできます。今回は使っていませんが、<@{{ userId }}>のように記述すると、メンション先も動的に変更することが可能です。

※2023/12/7追記:Slackのユーザーにメンションさせたい場合は、「Slackのmember ID」が必要となります。より詳しくは本ブログの末尾で追記しておりますのでそちらをご覧ください。

Would you like to customize the sender's Slack profile?では、送信を行う際の表示名(Display name)などを変更することができます。

今回は以下のように設定しました。:mega:はメガホンの絵文字が表示されます、Slackのデフォルトの絵文字です。

ここまで設定を行ったら、Continueを押します。

最後に、DescriptionSchedule typeを設定して、右下のFinishを押します。

これで、Syncの設定は完了です!

Syncしてみる

では、実際にSyncをしてみたいと思います!

初回Sync

HightouchのSlack連携でMessageを選んだ場合の注意点として、初回のSync時にはメッセージは何も送信されません。

これは、初回のSyncで大量のメッセージが送信されることを防ぐためです。

そのため、MessageのSyncの設定を行ったらまず一度Run syncを押してSyncしましょう。

2回目のSync

では、続けて2回目のSyncを行います。

2回目のSyncの前に、Snowflake上でレコードの差分を作っておきたいため、対象のテーブルに対して以下のクエリを実行しておきます。2行新しいレコードを追加、2行既存のレコードを変更、しています。

insert into orders 
values 
  (101, 30, '2018-04-11', 'placed'), 
  (102, 55, '2018-04-12', 'placed');

update 
  orders 
set 
  status = 'completed' 
where 
  id in (71, 72);

この状態で、Hightouch上でもう一度Syncをしてみます。

すると、下図のようにSlackチャンネルにメッセージが送信されました!レコード1つにつき、1メッセージが送信されています。

※ただ、メンションが効いていないんですよね…こちらについてはHightouch社に確認中です。

2023/12/7追記:メンションを機能させる方法について

Hightouch社から回答を得られ、Slackのユーザーの「member ID」を記入すれば良いということがわかりました!

Slackのmember IDの取得方法ですが、対象ユーザーの画面でCopy member IDを押すか、SlackのAPIを叩くことでも取得可能です。

この上で、Hightouchのメッセージの編集で@<取得したmember ID>のように記入すればOKです!

最後に

HightouchのDestinationとしてSlackを設定し、Syncを行ってみることを試してみました。

今回試したMessageでは、設定したModelでレコードの追加・変更・削除があった場合にそれぞれで条件を分けてメッセージをSlackに送ることができるため、とても汎用性が高い機能だと感じました!

HightouchにおいてSlackはFree Destinationのため、気軽に試しやすいと思います。(Syncの数が増えると課金が発生するため、ご注意ください。)