
Hightouch で Snowflake のデータを SendGrid に連携してみた
はじめに
SendGrid は、メールサーバーの構築不要でメール配信可能なメール送信サービスです。
SendGrid では Contacts として、メール配信先となるリストを管理できます。Contacts は CSV ファイルのインポートや API から追加できます。
ここでは DWH などすでに他システム上の顧客情報を直接連携する手段としてリバース ETL ツールである Hightouch での連携を試してみたので、本記事で検証内容をまとめてみます。
前提条件
以下の環境で検証しました。
Snowflake 上の顧客情報を想定したサンプルデータを SendGrid 上の Contacts に Hightouch で連携してみます。
- Source:Snowflake
- Destination:SendGrid
試してみる
Hightouch でソースに Snowflake を設定する
こちらは以下に設定手順の記載があります。
事前準備として、Snowflake から Hightouch の接続用にキーペアを作成しておきます。
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
chmod 400 rsa_key.p8
chmod 400 rsa_key.pub
cat rsa_key.pub
Snowflake 側で以下のオブジェクトを作成します。サンプルコマンドは上記のドキュメントに記載があります。
- Hightouch からの接続用ユーザー
- 接続用ユーザーに付与するロール
- ロールへの権限付与
- Hightouch から Snowflake へのクエリ実行時に使用するウェアハウス
- Hightouch 転送するデータを保持するデータベース
-- Edit the following variables
set ht_username='HIGHTOUCH_USER';
set ht_default_warehouse='HIGHTOUCH_WH';
set ht_database='HIGHTOUCH_DB';
set ht_default_role='HIGHTOUCH_ROLE';
set ht_comment='Used for Hightouch integrations';
-- Set role for grants
USE ROLE ACCOUNTADMIN;
-- Create a role for Hightouch
CREATE ROLE IF NOT EXISTS identifier($ht_default_role)
COMMENT = $ht_comment;
-- Only if you want to create a new warehouse for Hightouch to use
CREATE WAREHOUSE IF NOT EXISTS identifier($ht_default_warehouse);
-- Create Hightouch's user
CREATE USER IF NOT EXISTS identifier($ht_username)
TYPE=service
rsa_public_key='XXXXX'
DEFAULT_WAREHOUSE=$ht_default_warehouse
DEFAULT_NAMESPACE=$ht_default_namespace
DEFAULT_ROLE=$ht_default_role
COMMENT=$ht_comment;
-- Grant permissions to the role
GRANT ROLE identifier($ht_default_role) TO ROLE SYSADMIN;
GRANT USAGE ON WAREHOUSE identifier($ht_default_warehouse) TO ROLE identifier($ht_default_role);
GRANT ROLE identifier($ht_default_role) TO USER identifier($ht_username);
-- Only if you want to create a new database for Hightouch to use
CREATE DATABASE IF NOT EXISTS identifier($ht_database);
GRANT USAGE ON DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
GRANT USAGE ON ALL SCHEMAS IN DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
GRANT SELECT ON ALL TABLES IN DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
GRANT SELECT ON FUTURE TABLES IN DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
GRANT SELECT ON ALL VIEWS IN DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
GRANT SELECT ON FUTURE VIEWS IN DATABASE identifier($ht_database) TO ROLE identifier($ht_default_role);
-- Grant write access for the Lightning Sync Engine (faster syncs) & Sync Logs - Optional
USE identifier($ht_database);
CREATE SCHEMA IF NOT EXISTS hightouch_audit;
CREATE SCHEMA IF NOT EXISTS hightouch_planner;
GRANT OWNERSHIP ON SCHEMA hightouch_audit TO ROLE identifier($ht_default_role);
GRANT OWNERSHIP ON SCHEMA hightouch_planner TO ROLE identifier($ht_default_role);
Snowflake 側で各種オブジェクトを作成後、Hightouch 側でソースを作成します。
Hightouch 側で「Integarations > Sources」から「Add source」をクリックします。
Snowflake を選択し上記で設定した各種項目を入力し、接続テストを実施します。
問題なければ次の画面でソースの名前を入力し、設定を完了します。
こちらの手順は以下の記事が参考になります。
Hightouchで Destination に SendGrid を設定する
SendGrid 側の事前準備として、API キーを発行しておきます。
「Settings > API Keys」より「Create API Key」をクリックします。
キーの名称とアクセス権を付与します。※ここでは Full Access としました
キーが発行されるので、値を控えておきます。
キー発行後、Hightouch 側で「Integarations > Destinations」から「Add destination」をクリックします。
宛先として「Twillio SendGrid」を選択します。
次の画面で API キーを入力します。
設定は以上で、最後に Destination の名称を指定します。
同期するテーブルを作成
今回は Contact を連携するので、事前に Snowflake 側で以下からダウンロードできるテンプレートファイル(CSV)のスキーマを持つテーブルを作成し検証用のレコードを追加します。
-- sourceの設定で指定したデータベースにテーブルを作成する
USE SCHEMA hightouch_db.public;
CREATE OR REPLACE TABLE hightouch_db.public.sendgrid_customers (
"email" VARCHAR(255),
"first_name" VARCHAR(255),
"last_name" VARCHAR(255),
"address_line_1" VARCHAR(255),
"address_line_2" VARCHAR(255),
"city" VARCHAR(255),
"state_province_region" VARCHAR(255),
"postal_code" VARCHAR(20),
"country" VARCHAR(255),
"phone_number_id" VARCHAR(20),
"external_id" VARCHAR(255),
"anonymous_id" VARCHAR(255)
);
INSERT INTO hightouch_db.public.sendgrid_customers (
"email",
"first_name",
"last_name",
"address_line_1",
"address_line_2",
"city",
"state_province_region",
"postal_code",
"country",
"phone_number_id",
"external_id",
"anonymous_id"
) VALUES
('<メールアドレス>', 'Test', 'Hightouch', '123 Neverland Lane', 'Suite 42', 'Denver', 'CO', '80202', 'USA', '18778894546', '112', '223');
テーブル作成後、Hightouch 側で「Model」と「Sync」を設定します。
Model の設定
Hightouch ではソースからクエリするデータをModel(モデル)として定義します。「Activation > Models」から「Add model」をクリックします。
作成済みのソースを選択します。
ここではテーブル単位で同期できればよいので「Table Selector」を選択しました。
すると下図の表示となり、ソースで設定したデータベース内の参照権限のあるテーブルが表示されるので、選択し「Continue」をクリックします。
続けてモデルの名称とモデルの主キーを指定します。Hightouch ではモデルの方法に関係なく、主キーを指定する必要があります。
以上でモデルの作成は完了です。
Sync の設定
最後に Sync を設定します。
モデル作成後であれば下図の表示となるので、「Add sync」をクリックします。
Destination には 先の手順で作成した SendGrid を指定します。
SendGrid 向けの設定を行います。具体的には以下を設定します。
- 同期するオブジェクト
- Contacts または Mail
- 紐づける各レコードのキーとなる項目を指定
ここでは下図の通り、Contacts を作成する設定としています。
次の項目では同期するカラムと宛先でのマッピングを指定します。
ここではわかりやすくするため、下図の3カラムの情報を同期してみます。これにより、SendGrid 側で各 Contact の [email], [first_name], [last_name] が同期されます。
この際の注意点として設定画面右上の「Edit as JSON」をクリックします。
すると、以下のようなマッピングが設定されていました。
{
"type": "contacts",
"externalIdMapping": {
"from": "email",
"to": "email"
},
"mappings": [
{
"type": "standard",
"from": "email",
"to": "_rf2_T"
},
{
"from": "first_name",
"to": "_rf0_T",
"type": "standard"
},
{
"type": "standard",
"from": "last_name",
"to": "_rf1_T"
}
],
"customMappings": [
{
"type": "standard"
}
]
}
このままではマッピングの項目が同期できなかったため、to 要素をマッピング先の SendGrid のフィールド名に以下のように置き換えました。(Hightouch でマッピング時に選択できる SendGrid 側の予約名にあわせる)
{
"type": "contacts",
"externalIdMapping": {
"from": "email",
"to": "email"
},
"mappings": [
{
"type": "standard",
"from": "email",
+ "to": "email"
- "to": "_rf2_T"
},
{
"from": "first_name",
+ "to": "first_name",
- "to": "_rf0_T",
"type": "standard"
},
{
"type": "standard",
"from": "last_name",
+ "to": "last_name"
- "to": "_rf1_T"
}
],
"customMappings": [
{
"type": "standard"
}
]
}
その他の項目として SendGrid 側でカスタムフィールドを事前に作成しておくことで、その項目とのマッピングも可能です。
設定後、設定画面下部の「Continue」をクリックし説明を記入し「Finish」をクリックします。
同期を実行する
設定完了後、下図の表示となるので「Run Sync」をクリックします。
しばらくして SendGrid 側で「Marketing > Contacts」から確認すると、Hightouch のモデル名でリストが追加されていることが確認できます。
内容はマスクしていますが、指定のメールアドレスのユーザーが追加されています。
フィールドについても、マッピングし同期対象とした項目で値が反映されていることを確認できました。
さいごに
Hightouch で DWH(Snowflake)上のデータを SendGrid に連携してみました。特に宛先 API の仕様を理解せずとも GUI で簡単に連携できる点は Hightouch の強みと感じました。
こちらの内容が何かの参考になれば幸いです。