Salesforce Data Cloud から Snowflake へのデータ共有を試してみる
はじめに
Salesforce Data Cloud では Zero Copy Integration として主要な DWH と双方向でデータ連携できる機能が提供されています。このうち Data Cloud から Snowflake へのデータ共有機能を試してみましたので、本記事で内容をまとめてみます。
なお、以下の記事でも同様の検証が解説されており、本記事での検証時もこちらの内容を参考とさせていただきました。
概要
Data Cloud では Zero Copy Integration として Snowflake や BigQuery などの DWH と双方向でデータ連携が行えるサービスを提供しています。
この機能の要素として以下があります。
- Data Shares(Bring Your Own Lake Data Shares)
- Data Cloud 内のオブジェクトを DWH に共有できる機能
- 各 DWH 側から Data Cloud のデータをクエリできる
- Zero Copy Data Federation(Bring Your Own Lake Data Federation)
- 外部のデータレイクまたは DWH のデータに Data Cloud からクエリできる機能
本機能の概要については、以下の Salesforce 社の方の記事が参考になります。
デモ動画も公開されています。
前提条件
ここでは以下の環境で Data Shares(Bring Your Own Lake Data Shares) を試してみます。
- Data Cloud Playground を使用
- Trailhead という Salesforce 社が提供する無料のオンライン学習サービスで使用できる環境
- 以下よりサインインします
サインイン後は、以下の講座で構築される一時的な環境を使用します。
- Snowflake
- Data Cloud の環境が準備できたら、同じクラウドリージョンに Snowflake アカウントを作成します
- 本検証では ap-south-1: Asia Pacific (Mumbai) にアカウントを作成
Data Cloud インスタンスの場所は、環境ログイン後に画面右上のセットアップをクリックし、会社情報メニューより確認できます。
「Company Information > Instance」に記載があります。
※何度か検証しているため下図では別リージョンの記載です
リージョン情報は以下に記載があります。
Snowflake 側の事前準備
Snowflake 側でのアカウント作成後、以下の作業を行います。
- 認証用ユーザーの作成
- Snowflake OAuth の構成
手順は以下に記載があります。
認証用ユーザーの作成
ユーザーについては、TYPE = SERVICE も試したのですが、うまく認証できませんでした。そのため、ここでは TYPE = PERSON として作成しました。権限については特に明記されていませんでしたが、おそらく認証できればよいので、以下のドキュメント記載のサンプルのように最小権限のロール(PUBLICなど)を付与でよいと思われます。
CREATE OR REPLACE USER <Data Cloud Admin or Data Aware Specialist>
PASSWORD = '<string>'
LOGIN_NAME = <string>
DISPLAY_NAME = <string>
FIRST_NAME = <string>
MIDDLE_NAME = <string>
LAST_NAME = <string>
EMAIL = <string>
DEFAULT_ROLE = <Any Public Role With Low Privileges>;
Snowflake OAuth の構成
ACCOUNTADMIN で以下を実行します。
CREATE OR REPLACE SECURITY INTEGRATION <Integration名>
TYPE = OAUTH
OAUTH_CLIENT = CUSTOM
OAUTH_CLIENT_TYPE = 'CONFIDENTIAL'
OAUTH_REDIRECT_URI = 'https://login.salesforce.com/services/cdpSnowflakeOAuthCallback'
ENABLED = TRUE
OAUTH_ISSUE_REFRESH_TOKENS = TRUE;
続けて以下を実行しOAUTH_CLIENT_ID
とOAUTH_CLIENT_SECRET
を控えておきます。
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS( '<Integration名>');
{
"OAUTH_CLIENT_SECRET_2":"XXXXX",
"OAUTH_CLIENT_SECRET":"XXXXX",
"OAUTH_CLIENT_ID":"XXXXX"
}
Data Cloud 側の作業
Data Cloud 側では以下の作業を行います。
- 共有対象のオブジェクトを作成
- Data Share Targets の作成
- Data Share の作成とリンク
共有対象のオブジェクトを作成
こちらはオプションですが、共有対象のデータストリームを作成します。「Data Streams > New」をクリックし、ここでは下図の通り「Salesforce CRM」を選択します。
検証環境では「Sales」を選択できたので、こちらを選択し「Next」をクリックします。
その他はデフォルトの設定でデプロイします。
しばらく待機すると「Data Stream Status」が「Active」になります。
Data Share Targets の作成
Data Share Targets という設定を通して Snowflake アカウントとの認証を行います。こちらの手順は以下に記載があります。
DataCloudメニューから「Data Share Targets > New」をクリックします。
Snowflake を選択すると下図の表示になるので、以下の通り入力します。
- Label:任意の名称
- Account URL:Snowflake アカウントの URL
- 図では
snowflakecomputing.com
以降もありますが、ドメイン名まででよくパス以降は不要です。パス以降があると認証ステータスがエラーとなります
- 図では
- Client ID:Snowflake OAuth の構成で取得した
OAUTH_CLIENT_ID
- Client Secret:Snowflake OAuth の構成で取得した
OAUTH_CLIENT_SECRET
「Save」をクリックすると下図の表示になるので、先の手順で作成したユーザーで認証します。
問題なければ認証後「Authentication Status」が「Successful」となります。
Data Share の作成とリンク
次に Data Share として共有対象のオブジェクトをまとめます。「Data Share > New」をクリックします。
「New」をクリックします。
任意のラベルを指定します。Snowflake 側ではこのラベルでどの共有オブジェクトか判断できます。
Data Share に共有対象のオブジェクトを追加し「Save」をクリックします。
作成した Data Share を Data Share Target とリンクします。Data Share タブから任意の Data Share を選択し下図のメニューから「Link/Unlink Data Share Target」をクリックします。
作成済みの Data Share Target 表示されるので選択し「Save」をクリックします。
設定後、対象の Data Share の Data Share Targets タブからステータスを確認すると「Active」となっていました。
Data Cloud 側の作業は以上です。
Snowflake 側:共有データへのアクセス
Snowflake 側で「Data > Private Sharing」を開きます。デフォルトで権限のある ACCOUNTADMIN であればこのタイミングで共有オブジェクトが表示されるはずです。
以降は通常のデータ共有からデータベースを作成する手順です。ここでは GUI で作業しました。
データを確認します。Data Share 名を含むスキーマに共有オブジェクトがビューとして格納されていました。
さいごに
Data Cloud から Snowflake へのデータ共有機能を試してみました。
Federation(Data Cloud から Snowflake へのクエリ)については以下に手順と概要がまとめられています。
こちらの内容が何かの参考になれば幸いです。
参考