Salesforce Data Cloud における Snowflake との Zero Copy Integration （ゼロコピー統合）の構築手順

## 概要

Salesforce Data Cloud における Snowflake との Zero Copy Integration （ゼロコピー統合）の構築手順を検証したため共有します。今回の検証では、 Salesforce の Trailhead で構築できる環境と Snowflake のトライアル環境で実施しています。

Zero Copy Integration （ゼロコピー統合）を実施することは簡単ですが、セキュリティ要件を満たしているかを確認してから本番利用を開始してください。Saleforce <-> Snowflake の連絡をセキュアに実施する必要があるのですが、現時点では下記の記載があるようにプライベート接続している Snowflake では利用できないようです。 Salesforce 上のデータは企業にとっては大切なデータが格納されていることがあり、データ流出などのリスクなどを適切に評価することが重要です。

> AWS Private Link、Azure Private Link、Google Cloud Private Service Connect などのプライベート接続を使用して Snowflake をリリースしている場合は、データ共有を使用できません。

引用元：[「Share Data with Snowflake Using Zero Copy Integration (Z Zero コピーインテグレーションを使用した Snowflake とのデータの共有)」 (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.c360_a_access_data_from_snowflake.htm&type=5)

## 基本的な知識

### Salesforce における Zero Copy Integration とは

Zero Copy Integration については、下記の記事が参考になります。他のクラウドサービスとの連携も実施できるようになるようですが、現時点では BigQuery 、Snowflake、及び、 Amazon Redshift がサポートされているようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/1ca69294-a411-46e0-bad6-cb332a500ac1.png)

引用元：[Salesforce、「Zero Copy Partner Network」を発表 - Salesforce](https://www.salesforce.com/jp/news/press-releases/2024/04/25/zero-copy-partner-network/)


### 実施手順

実施手順として下記の手順が Salesforce のドキュメントにて紹介されています。

1. [Snowflake からのユーザーログイン情報の取得 (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.c360_a_get_user_details_snowflake.htm&type=5)
1. [データ共有対象の作成と Snowflake との接続 (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.c360_a_create_data_share_target_snowflake.htm&type=5)

下記の動画がステップごとに紹介されているため参考になりためです。最初が BigQuery の手順紹介であり、11分15秒あたりから Snowflake での手順が紹介されています。

<iframe width="560" height="315" src="https://www.youtube.com/embed/OPH95cvHj1Y?si=qoVkBaQEtl36gFm8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>


## 実施手順

### 1. 環境の準備

#### 1-1. Salesforce Data Cloud 環境の準備

無料の Trailblazer アカウントを作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e803e46f-13d9-8811-49d0-962b3399ff14.png)

引用元：[Log in (salesforce.com)](https://tbid.digital.salesforce.com/oauth2/aus5v9466wdqLdY0O697/v1/authorize?response_type=code&response_mode=query&nonce=760afe7b-3ddc-4743-a7f4-873d50f921a1&client_id=0oa5v93ebgAGqkFSn697&redirect_uri=https%3A%2F%2Fiis.digital.salesforce.com%2Fservices%2Foauth2%2Fcallback&state=eyJyZWZlcnJlciI6Imh0dHBzOi8vdHJhaWxoZWFkLnNhbGVzZm9yY2UuY29tL2phIiwiY2xpZW50SWQiOiIzTVZHOWc5cmJzVGtLbkFYUlVfaE9MdkhSWWo3SFMxY3NOMExsaE9TZUJSdjVOcDJteFB1cmNJZmZBNVYwem44LnVJRHRibVh5U1dteHFfWGRBOHd4IiwicmVkaXJlY3RVcmkiOiJodHRwczovL3RyYWlsaGVhZC5zYWxlc2ZvcmNlLmNvbS9hdXRoL3RiaWRzaWdudXAvY2FsbGJhY2s_cHJvbXB0PWxvZ2luJmxvY2FsZT1qYSIsInN0YXRlIjoiNmU1YzU5YmNhOTc4YmEwMjQyM2JmYTMxZjdjNjRmNDVmMzdiMDBjNzk5YmUyMzVjIiwiY29ycmVsYXRpb25JZCI6ImY3YzVhYjhlLTg0OTItNGZkZC1iZTQ5LWIzNTIyYmQ5NGRkNyIsInN0YXJ0VGltZSI6MTcyNTc3MTgwMjkwMCwiaWRwcyI6WyJJZFAgLSBHb29nbGUiLCJJZFAgLSBTYWxlc2ZvcmNlIiwiSWRQIC0gTXVsZXNvZnQtVVMiLCJJZFAgLSBNdWxlc29mdC1FVSIsIklkUCAtIFRhYmxlYXUiLCJJZFAgLSBMaW5rZWRpbiIsIklkUCAtIEFwcGxlIiwib3RwIl19&scope=openid+email+profile+address+phone+offline_access&intent=register)

[はじめての Data Cloud Developer Edition](https://trailhead.salesforce.com/ja/content/learn/projects/create-a-data-stream-in-data-cloud/get-started-with-a-data-cloud-developer-edition) というモジュールの上部にて、Data Cloud Developer Edition を構築します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/aca8cdc3-5b4e-a220-bc20-86c22326de10.png)

引用元：[Get Started with Data Cloud Developer Edition | Salesforce Trailhead](https://trailhead.salesforce.com/ja/content/learn/projects/create-a-data-stream-in-data-cloud/get-started-with-a-data-cloud-developer-edition)

作成された環境におけるインスタスの場所を確認してください。そのインスタンスの場所に応じて、 Snowflake にてリージョンを選択する必要があります。確認する方法としては、 Salesforce にログイン後、 Setup -> Company Information で表示された画面における右下の instace （例：`Instance	EU55`）で確認できます。環境に構築タイミングなどの要因により、 EU に割り振られる方と US に割り振られる方がいるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b7296f9c-aca8-02c1-cd63-981dd7de82be.png)

#### 1-2. Snowflake 環境の準備

下記のリンク先から Snowfalke のトライアル環境を申し込みます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/34621dd3-7e1b-b14a-cc18-57c17d06387d.png)

引用元：[Snowflake Trial](https://signup.snowflake.com/)

クラウドリージョンを選択する画面にて、 Salesforce の環境が EU55 であることから、 AWS の EU (Frankfurt)で構築しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/113d4f9e-aab8-ab2d-b09e-c0b63a8098a5.png)

引用元：[Snowflake Trial](https://signup.snowflake.com/)

下記のような内容のメールが届くため、クリックしてユーザーを作成すると Snowflake を利用できるようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e6ea82af-e954-6443-0b66-1af668f5b034.png)

US リージョンに Salesforce 環境が構築された方は、下記のドキュメントを参考に Snowflake のクラウドリージョンを選択してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/8a22cc92-a7f1-caa5-53b6-e566be2858b1.png)

引用元：[Data Cloud で Snowflake がサポートされる領域 (salesforce.com)](https://help.salesforce.com/s/articleView?id=sf.c360_a_data_shares_aws_supportability_snowflake.htm&type=5)

対応していないリージョンの Snowflake を Data Share Target で指定しようとすると下記のようなエラーが発生します。

> We currently do not support the region your Snowflake account is in. Contact your Salesforce Admin for the list of supported Snowflake regions.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/2f4a28c3-d7e5-8652-cc9e-b910a0e852d9.png)


### 2. Snowflake にて認証情報の作成

#### 2-1. Snowflake にログイン後に右上の`+ Create` -> `SQL Worksheet`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dbddb37c-5c60-e383-a08c-50113ad62efe.png)

#### 2-2. 下記の SQL を記述して、そのコードを選択した上で実行してユーザーを作成

```sql
CREATE OR REPLACE USER sf_data_cloud 
  PASSWORD = '+U8Xi0VWdUmazDnP8ffFKsC2bRE='
  LOGIN_NAME = 'sf_data_cloud'
  DISPLAY_NAME = 'sf_data_cloud'
  FIRST_NAME = 'sf_data_cloud'
  MIDDLE_NAME = 'sf_data_cloud'
  LAST_NAME = 'sf_data_cloud'
  EMAIL = 'manabian.test@test.com'
  DEFAULT_ROLE = 'PUBLIC';
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0c5471c0-1c91-2f36-7a74-3597d0df7a52.png)

#### 2-3. 下記の SQL を記述して、そのコードを選択した上で実行して認証情報を作成

```sql
CREATE OR REPLACE SECURITY INTEGRATION
  SFDATACLOUD
  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; 
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5b420c88-f82e-a184-0860-08f7f9570d75.png)

#### 2-4. 下記の SQL を記述して、そのコードを選択した上で実行して`OAUTH_AUTHORIZATION_ENDPOINT`列の値をコピー

```sql
DESC SECURITY INTEGRATION SFDATACLOUD;
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/e6929e65-afc7-8e23-527b-aef2fd4479d9.png)

#### 2-5. 下記の SQL を記述して、そのコードを選択した上で実行して認証情報

```sql
SELECT SYSTEM$SHOW_OAUTH_CLIENT_SECRETS( 'SFDATACLOUD');
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a871e3b5-f5ab-72d7-4816-47d6ef61ebb2.png)

下記のような json 形式で出力され、`OAUTH_CLIENT_ID`と`OAUTH_CLIENT_SECRET`の値をコピーする。

```json
{"OAUTH_CLIENT_SECRET_2":"XXX","OAUTH_CLIENT_SECRET":"YYY","OAUTH_CLIENT_ID":"ZZZ"}
```

### 3. （省略可能）共有するオブジェクトの定義

#### 3-1. Salesforce Data Cloud にて、`Data Streams`タブにて`New`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6f1c44c5-0465-96f5-0698-526661f10cd6.png)

#### 3-2. `Salesforce CRM`を選択して`Next をクリック`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/16af2cc3-608f-4af0-1261-a25da305b652.png)

#### 3-3. `Sales`を選択して`Next`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c142a61c-c371-b2a8-9da1-b2d4de17a70a.png)

#### 3-4. `Next`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/635bacd7-1481-8b7e-1438-54a3d5429e95.png)

#### 3-5. `Deploy`をクリック

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c3eb0ffd-214e-62ee-9205-661d4ca229ca.png)

#### 3-6. 作成された`Lead Home`という Data Stream を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/81527a90-d8a9-2293-296b-65f43d546fc3.png)

#### 3-7. 右側にある`Refresh Now`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/351b6091-dbab-91b8-0006-b59764e040c3.png)

#### 3-8. `Satatus`が`Success`になるまで待機

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/fab6b8a3-1f39-943e-62be-c5edb29294c0.png)

#### 3-9. `Query Editor`タブにて`New`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ff8f919e-1c98-8855-d981-f9a10a446829.png)

#### 3-10. 適当なクエリ名を入力した上で`Save`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/af1fd165-b434-8d21-17e1-38b64760fde9.png)

#### 3-11. `Lead`の右側の矢じり（▼） -> `Create Query(*)`を選択し、表示されたクエリにて`Run Query`を選択後にデータが表示されることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c5d97d4d-7d1f-1fbe-34a6-4ccc03c06f5b.png)

### 4. Salesforce Data Cloud にて Data Share Targets の作成

#### 4-1. `Data Share Targets`タブにて右側の`New`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c9cf60d3-0f26-3c72-088a-426a96164be2.png)

#### 4-2. `Snowflake`を選択した上で`Next`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61403abc-357d-7758-a727-a40a32740ff8.png)

#### 4-3. `Account URL`に 2-4 の手順で取得した URL の一部を記述

2-4 の手順で取得した URL の`/oauth/authorize`を除いた URL を記述します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/adc364f1-6f83-13a6-6d26-54fb70e575c3.png)

2-4 では下記の修正前の URL が取得できますが、 `/oauth/authorize`の部分は不要であるためその箇所を取り除きます。

```text
修正前）https://rd15062.eu-central-1.snowflakecomputing.com/oauth/authorize
```

```text
修正後）https://rd15062.eu-central-1.snowflakecomputing.com
```

`/oauth/authorize`を含めた場合には`Authentication Status`が`error`となってしまうため、Data Share Targets を再作成してください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/bf6769d4-e678-b64c-296a-ed7b0f3f3add.png)


#### 4-4. `Label`に適当な名前を設定後、`Cilent ID`と`Client Sercret`に 2-5 で取得した値を入力し`Save`を選択


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d57bc210-35b6-8d26-6bbb-1a841ebfcda7.png)

#### 4-5. Snowflake のログイン画面に遷移するため、 2-2 の手順で作成したユーザーでログイン

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dcbda146-3bab-e37b-331a-e22c431ec7c7.png)

#### 4-6. `許可`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/9505c283-6849-a5d2-b781-4b171ad90bb0.png)

#### 4-7. `Authentication Status`が`Successful`であることを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/a913517a-6624-a172-52a3-2d4b81ff0630.png)

### 5. Salesforce Data Cloud にて Data Share の作成

#### 5-1. `Data Shares`タブにて`New`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/ea194bb8-6a10-8cef-4e1c-6157fe3617a4.png)

#### 5-2. Label に適当な名前を入力し`Next`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/4c9959f1-58d3-3a38-737b-180dd21f6fd5.png)

#### 5-3. `Lead`を選択し`Save`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/57e33b16-0e00-df06-764c-0f208624b53c.png)

#### 5-4. 作成された Data Share にて`Link/unlink Data Share Target`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/0d503477-aef4-de6f-7c48-486763214429.png)

#### 5-5. 作成した Data Share Target を選択した上で`Save`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/95f6b837-0cc0-fb92-39f0-8c8e3f982526.png)

#### 5-6. `Data Share Status`が`Active`になるまで待機

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/b0108faf-624e-bc17-6794-b1e7777c4eb1.png)

#### 5-7. Snowflake の画面に移動し、`Private Sharring`タブにて作成した Data Share の名前で始まるオブジェクト（例`snowflake_share_01*`）のダウンロードボタン（`Get Data`）を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/36263473-8927-75ad-966b-672b445c88b9.png)

#### 5-8. `View Database`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/dda2641d-1561-4751-cbb9-a9fa888c5e0a.png)

#### 5-9. `Get Data`を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/6709e7ff-de4d-67fd-790b-9080d5127940.png)

#### 5-10. データベースにオブジェクトが追加されたことを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/002337e7-7249-1bc6-cdd7-c78a332e2036.png)

#### 5-11. 共有した Lead のデータを取得することを確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/30c5ac8c-f7f1-f085-00ab-40bda440bbbb.png)