
dbt Cloud のジョブ完了をトリガーに Hightouch の同期を実行する
はじめに
リバース ETL ツールの Hightouch では dbt Cloud と連携し、dbt Cloud 側のジョブが完了したことをトリガーに同期を実行するように構成できます。こちらの機能を試してみたので、本記事で内容をまとめてみます。
機能概要
こちらの機能は以下に記載があります。
Hightouch の dbt Cloud 拡張機能を使用すると以下が可能になります。
- dbt Cloud のジョブが完了すると Hightouch の同期が実行されるようにスケジュール設定できる
- DWH 側で dbt Cloud を使用する場合に、Hightouch は常に最新のデータが利用可能になった時点で同期を実行できる
- dbt Cloud から Hightouch にモデルを同期できる
- Hightouch では宛先(Destination)に連携するデータ(テーブル)を Model(モデル)として定義
- Model を定義する際は、Hightouch 側で SELECT 文を定義したりソース側のテーブルをそのまま指定することができます。dbt Cloud と連携することで、dbt におけるモデルを Hightouch のモデルとして指定できます
検証環境
以下の環境で検証しました。
- ソース(DWH):Snowflake
- 宛先:SendGrid
上記の設定手順は以下をご参照ください。
事前準備
事前に検証用のサンプルデータの定義とその加工処理を作成します。
Snowflake 側:ソースデータを作成
Snowflake 側で以下を実行しソースとして使用するテーブルを定義します。
-- RAW_DB データベースを使用
USE SCHEMA RAW_DB.PUBLIC;
CREATE OR REPLACE TABLE CUSTOMER_MASTER (
CUSTOMER_ID VARCHAR(255) NOT NULL,
EMAIL VARCHAR(255) NOT NULL,
FIRST_NAME VARCHAR(255),
LAST_NAME VARCHAR(255),
CITY VARCHAR(255)
);
-- サンプルデータの挿入
INSERT INTO CUSTOMER_MASTER (
CUSTOMER_ID, EMAIL, FIRST_NAME, LAST_NAME, CITY
) VALUES
('CUST001', '<メールアドレス>', 'Test1', 'Test1', 'Nara'),
('CUST002', '<メールアドレス>', 'Test2', 'Test2', 'Osaka');
dbt Cloud 側
dbt Cloud と Snowflake の接続設定後、検証用のプロジェクトを作成し、下図の通りモデルを作成しました。右端のモデル(customer_sendgrid.sql
)を Hightouch における宛先(SendGrid)への同期対象のテーブルとします。
version: 2
sources:
- name: customer
database: raw_db
schema: public
tables:
- name: customer_master
description: One record per customer.
select
email,
first_name,
last_name,
city
from {{ ref("stg_customer_master") }}
モデル作成後、開発環境でビルドし問題なければ、本番環境と上記のモデルをビルドするジョブを作成します。ここでは同じ Hightouch のソースとして指定したデータベース内のProd
スキーマを本番環境としました。
ジョブを実行すると下図のテーブルが Snowflake 側に作成されます。
Hightouch と dbt Cloud の接続設定
dbt Cloud 側:サービストークンの取得
Hightouch と dbt Cloud の接続のために、dbt Cloud 側でサービス トークンを取得します。
ユーザー名をクリック後、下図の表示となるので「API tokens > Service tokens」を開き「+ Create service token」を押下します。
トークン名を指定しアクセス許可を設定します。ここでは下図の通り、指定のプロジェクトに対する読み取り権限を与えました。
公式ドキュメントにある通り、読み取り専用の権限で問題ありません。注意点としてこの権限設定は現在のワークスペースに反映されます(その他の権限を持つ他トークンの設定はできない)。
Hightouch 側:dbt Cloud との接続設定
Hightouch 側で「Integrations > Extensions」から dbt Cloud を選択します。
Configuration タブで以下を設定し設定を保存します。
- dbt Cloud のアカウントURL
- トークン
接続後は下図の表示となります。
以上で接続設定は完了で、この時点から Sync(同期)のスケジュールで API トークンのアクセス権範囲内の dbt Cloud のジョブを選択可能となります。
Hightouch の Model に dbt Cloud のモデルを指定
上記の設定で dbt Cloud のジョブ完了後のスケジュール設定は可能ですが、合わせて dbt Cloud のモデルを Hightouch 側のモデルに指定した上でこのスケジュール連携を使うのが一般的と思います。
こちらについては以下に記載があります。
また、近い内容として Git リポジトリを連携することで、Hightouch のモデルに dbt のモデルを指定することも可能です。こちらは以下で紹介されています。
dbt Cloud のモデルを同期する
dbt Cloud のモデルを指定する際は、上記の接続設定後「Integrations > Extensions」からdbt Cloud と接続したい Hightouch 上のソース(Source)を選択します。
ソースを選択すると下図の表示となるので改めて接続先アカウントとdbt のモデルがビルドされるジョブを選択します。
最後の項目(Database Overrides)はここでは試していませんが、dbt 側でモデルのカスタムデータベースも指定している場合、このオプションを有効化することで、Hightouch のソースとして指定したデータベースと異なるデータベースにモデルがビルドされる場合でも対応できるようです。
上記の設定後「Activation > Models」より Hightouch におけるモデルを作成します。ソースには、先の手順で dbt Cloud と紐づけたソースを指定し、モデルの方法として「dbt Cloud model」を選択します。
次のページでは関連付け時に指定したジョブで作成されるモデルが選択できるので、ここでは事前準備で作成したcustomer_sendgrid
を指定しました。
次の画面でモデル名を指定し、設定を完了します。
Sync の設定
最後に、dbt Cloud から同期したモデルを宛先(今回であれば SendGrid)に連携するための Sync を作成します。
宛先に SendGrid を指定し、下図の通り設定しました。その他はデフォルトです。
注意点として、SendGrid においてフィールドを同期する場合は上図の「Edit as JSON 」から JSON を開き、to 要素を SendGrid 側の予約語に指定する必要がありました。
{
"type": "contacts",
"externalIdMapping": {
"from": "EMAIL",
"to": "email"
},
"mappings": [
{
"from": "FIRST_NAME",
"to": "first_name",
"type": "standard"
},
{
"from": "CITY",
"to": "city",
"type": "standard"
},
{
"type": "standard",
"from": "LAST_NAME",
"to": "last_name"
},
{
"type": "standard",
"from": "EMAIL",
"to": "email"
}
],
"customMappings": [
{
"type": "standard"
}
]
}
SendGrid 側の予約語はマッピング時に確認できます。
設定完了後 Schedule タブで「dbt Cloud」を指定し、このモデルが作成されるジョブを選択します。
dbt Cloud のジョブを実行
この状態で dbt Cloud 側でジョブを実行します。
完了後、Snowflake 側に以下のテーブルが作成されます。
続けて Hightouch 側の同期がトリガーされます。
同期完了後、宛先である SendGrid 側を確認すると Hightouch 側のモデルの名称で Contact のリストが作成されていました。
Contact には dbt で作成したテーブルに含まれるユーザーが含まれます。
マッピングしたフィールドも反映されています。
続けて、ソースとなるテーブルが更新されたとして、レコードを追加し dbt Cloud のジョブを実行してみます。
Snowflake 側で以下を実行し、dbt でソースとして定義したテーブルを更新します。
-- サンプルデータの挿入
INSERT INTO CUSTOMER_MASTER (
CUSTOMER_ID, EMAIL, FIRST_NAME, LAST_NAME, CITY
) VALUES
('CUST004', '<メールアドレス>', 'Test4', 'Test4', 'Chiba'),
('CUST005', '<メールアドレス>', 'Test5', 'Test5', 'Saitama');
dbt Cloud でジョブを実行すると、モデルも更新されます。
Hightouch 側の同期もキックされます。
同期完了後、SendGrid 側で確認するとこちらのリストも更新されています。
さいごに
Hightouch と dbt Cloud を連携し、dbt Cloud 側のジョブが完了したことをトリガーに Hightouch 同期を実行するように構成してみました。
モデルが最新化されたタイミングで同期を実行できるので、これらのツールを組み合わせて使う際はぜひとも使いたい機能と思います。
こちらの内容が何かの参考になれば幸いです。