# Salesforce DMP Krux インポート連携

Salesforce DMP (Krux) から、メディアキャンペーン、ペイドサーチキャンペーン、サイトキャンペーン、ユーザーオーディエンスセグメントマップ、セグメントマッピングファイル、または不同意リストを Treasure Data にインポートできます。

## 前提条件

- Treasure Data の基礎知識([Toolbelt](https://toolbelt.treasuredata.com/) および [JavaScript SDK](https://docs.treasuredata.com/smart/project-product-documentation/getting-started-with-website-tracking) を含む)
- アクセスキーIDとシークレットアクセスキーを持つS3認証情報
- Salesforce DMP のクライアント名


## 連携の概要

この連携には2つのパートがあります:

1. **Salesforce DMP と Treasure Data CDP 間の Cookie 同期**: Salesforce DMP ID と Treasure Data ID の td_global_id および td_client_id 間のマッピングを作成するために必要です
2. **Salesforce DMP から Treasure Data CDP へのデータインポート:** 取り込み可能な様々なデータフィードがあります。データエンリッチメントの目的では、セグメントIDとその名前のマッピングが重要なファイルです。


![](/assets/image-20190923-192248.037c2a6dff6b3b60c8a7538021bc396756b5712ea081e6ab29c40c4415cfd243.d081385e.png)

## Cookie 同期タグの実装

まず、[ウェブサイトトラッキングの開始](/products/customer-data-platform/integration-hub/streaming/td-javascript-sdk/getting-started-with-tracking-and-the-td-javascript-sdk) の「ウェブサイトトラッキングの設定と Treasure Data JavaScript SDK のインストール」に記載されているように、Treasure Data の JavaScript タグを設定する必要があります。

次に、Salesforce DMP のタグが既にインストールされているウェブサイトに、以下のコードを追加します。


```javascript
(function(window, document, td){

var kruxProperties = {};
for ( var k in window.localStorage ) {
    if ( k.startsWith('YOUR KRUX PREFIX HERE') ) {
        kruxProperties[k] = window.localStorage.getItem(k)
    }
}
td.trackEvent('<TD TABLE NAME FOR TRACKING KRUX ID/TD ID map>', kruxProperties);

var successCb = function(tdGlobalId) {
  // This is createImage in TDWrapper
  var el = document.createElement('img');
  el.src = '//beacon.krxd.net/usermatch.gif?partner=treasuredata&partner_uid=' + tdGlobalId;
  el.width=1;
  el.height=1;
  el.style.display='none';
  document.body.appendChild(el);
}

function isSafari() {
  var ua = window.navigator.userAgent.toLowerCase();
  return ua.indexOf('safari') !== -1 && ua.indexOf('chrome') === -1 && ua.indexOf('edge') === -1;
}

if (isSafari() ) {
  // TODO: Safari-specific handling due to ITP 2.1
} else {
  td.fetchGlobalID(successCb, function(err) { console.log(err) });
}

})(window, document, td);
```

上記のコードサンプルには、Safari ブラウザ向けの Cookie 同期は含まれていません。Safari の Intelligent Tracking Prevention (ITP) 機能により、サードパーティドメインの Cookie ベースの訪問者識別の信頼性が低下しています。私たちはこの問題に対するソリューションを積極的に計画しています。

## Treasure コンソールを使用して接続を作成

### 新しい接続の作成

Integrations Hub > Catalog に移動し、Salesforce DMP を検索して選択します。

![](/assets/image-20190923-192557.6c99bd10dd317889671b412d06bdef80e38689e2d74d8cda7c505eaee34c2546.d081385e.png)

**Create** を選択します。認証済み接続を作成しています。

以下のダイアログが開きます。

![](/assets/image-20190923-192618.915080c94fa2666ffba006e78f7878c8775d6adc8a6b76fc702ea352866e68d9.d081385e.png)

Salesforce DMP から取得したクライアント名、アクセスキーID、およびシークレットアクセスキーを編集します。

**Continue** を選択します。

![](/assets/image-20190923-192703.fa238aa47270a321506bdf6ca59a252c45aa7e208dc8c0db8f819840eb983743.d081385e.png)

新しい Salesforce DMP 接続に名前を付けます。**Done** を選択します。

### Treasure Data へのデータ転送

認証済み接続を作成すると、自動的に Authentications タブに移動します。作成した接続を探して **New Source** を選択します。

インポートするデータを指定します:

- セグメントマッピングファイル
- ユーザーオーディエンスセグメントマップ
- メディアキャンペーン、ペイドサーチキャンペーン、サイトキャンペーン、または不同意リスト


### セグメントマッピングファイルのインポート

Source には、セグメントマッピングファイルを選択します。

![](/assets/mceclip6.84539345d3104f7ba8fea0da416cd42e52159467ee6af627c19f4cbad1f6b790.d081385e.png)

### ユーザーオーディエンスセグメントマップのインポート

`Source` には、ユーザーオーディエンスセグメントマップを選択します。

![](/assets/image-20190923-192736.c4342b0d6c3059d373e070f6b1af33c0d8c2f149e0e694956f1fc310f81b8a04.d081385e.png)

パラメータ:

- **Import Date**: この日付から作成されたデータをインポートします。


### メディアキャンペーン、ペイドサーチキャンペーン、サイトキャンペーン、不同意リストのインポート

`Source` には、メディアキャンペーン、ペイドサーチキャンペーン、サイトキャンペーン、または不同意リストを選択します。

![](/assets/image-20190923-192809.d9c6a496fcb11e4e13a5dd38d791e513dbbd0bc06240d160c38a1d3374bed22f.d081385e.png)

パラメータ:

- **Start Date**: この日付以降に作成されたデータをインポートします。
- **End Date**: この日付までに作成されたデータをインポートします。
- **Incremental Loading**: スケジュールに基づいてデータをインポートする場合、取得されるデータの時間枠は実行ごとに自動的に前進します。例えば、初期の開始日を1月1日、終了日を1月10日に指定した場合、最初の実行では1月1日から1月10日までのデータを取得し、2回目の実行では1月11日から1月20日までのデータを取得するといった具合です。


### プレビュー

データプレビューはオプションであり、必要に応じて **Next** をクリックしてダイアログの次のページに進むことができます。

1. インポートを実行する前に、**Generate Preview** を選択してデータのプレビューを表示します。
データプレビューに表示されるデータは、ソースから近似されたものです。実際にインポートされるデータではありません。
2. データが期待通りであることを確認します。
![](/assets/snippet-data-preview-2024-02-09.27dc5fd8772fca4f7f44ab28c00476ae1894744fe1e75d06932628929cc7bff1.4e139be3.png)
3. **Next** を選択します。


### 詳細設定

![](/assets/image-20190923-193141.27f12a027e6398552418665e03dcf3532cab2158f3e260d642ab6f38d7d47b61.d081385e.png)

以下のパラメータを指定できます:

- Maximum retry times. 各APIコールの最大リトライ回数を指定します。
  - 型: number
  - デフォルト: 7
- Initial retry interval millisecond. 最初のリトライの待機時間を指定します。
  - 型: number
  - デフォルト: 1000
- Maximum retry interval milliseconds. リトライ間の最大待機時間を指定します。
  - 型: number
  - デフォルト: 120000


### ターゲットデータベースとテーブルの選択

既存のものを選択するか、新しいデータベースとテーブルを作成します。

![](/assets/image-20190923-193250.c96b094df49f14d2621028c14175a20717b9a6d70bf6fdadb7cfb3f936aa4f96.d081385e.png)

新しいデータベースを作成し、データベース名を付けます。**Create new table** についても同様の手順を実行します。

既存のテーブルにレコードを **append**(追加)するか、既存のテーブルを **replace**(置換)するかを選択します。

デフォルトキーではなく、異なる **partition key seed** を設定したい場合は、ポップアップメニューを使用して指定できます。

### スケジューリング

**When** タブでは、1回限りの転送を指定するか、自動的に繰り返される転送をスケジュールすることができます。

パラメータ

- **Once now**: 1回限りのジョブを設定します。
- **Repeat…**
  - **Schedule**: *@hourly*、*@daily*、*@monthly* の3つのオプションとカスタム *cron* を使用できます。
  - **Delay Transfer**: 実行時間の遅延を追加します。
- **TimeZone**: 'Asia/Tokyo' などの拡張タイムゾーン形式をサポートしています。
![](/assets/image-20190923-194054.e58d3768035b844efdc69f8fff99a48edcc931b40428fd406fbb3c2965274ffc.d081385e.png)


### Details

Transfer に名前を付けて **Done** を選択して開始します。

![](/assets/mceclip13.5ca8bfbad25bde2c23b6bfbf04bbf8f9f368e270270b3390f08502f263c47fac.d081385e.png)

Transfer の実行後、**Databases** タブで Transfer の結果を確認できます。

## コマンドラインを使用して Salesforce DMP 接続を作成する

Treasure コンソール を使用して接続を設定できます。

### Treasure Data Toolbelt のインストール

最新の [TD Toolbelt](https://toolbelt.treasuredata.com/) をインストールします。

### 設定ファイル (load.yml) の作成

設定ファイルには、Salesforce DMP からコネクタに入力される内容を指定する in: セクションと、コネクタから Treasure Data のデータベースに出力される内容を指定する out: セクションが含まれます。利用可能な out モードの詳細については、付録を参照してください。

次の例は、インクリメンタルスケジューリングなしで Media Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx  client_name: xxxxxxxxxxx
  target: mc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: false
out: mode: append
```

次の例は、インクリメンタルスケジューリングありで Media Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: mc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: true
out: mode: append
```

次の例は、インクリメンタルスケジューリングなしで Paid Search Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: psc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: false
out: mode: append
```

次の例は、インクリメンタルスケジューリングありで Paid Search Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: psc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: true
out: mode: append
```

次の例は、インクリメンタルスケジューリングなしで Site Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: sc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: false
out:
  mode: append
```

次の例は、インクリメンタルスケジューリングありで Site Campaign をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: sc
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: true
out:
  mode: append
```

次の例は、インクリメンタルスケジューリングなしで Dissent Lists をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: dl
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: false
out:
  mode: append
```

次の例は、インクリメンタルスケジューリングありで Dissent Lists をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: dl
  start_date: 2019-01-17
  end_date: 2019-01-27
  incremental: true
out:
  mode: append
```

次の例は、User Audience Segment Map をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: uasm
  import_date: 2019-01-17
out:
  mode: append
```

次の例は、Segment Mapping File をインポートする方法を示しています。


```yaml
in:
  type: krux_dmp
  access_key_id: xxxxxxxxxxx
  secret_access_key: xxxxxxxxxxx
  client_name: xxxxxxxxxxx
  target: smf
out:
  mode: append
```

### インポートするデータのプレビュー（オプション）

`td connector:preview`コマンドを使用して、インポートするデータをプレビューできます。


```bash
$ td connector:preview load.yml
```

### ロードジョブの実行

`td connector:issue`を使用してジョブを実行します。

ロードジョブを実行する前に、データを保存するデータベースとテーブルを指定する必要があります。例：td_sample_db、td_sample_table


```
$ td connector:issue load.yml \      --database td_sample_db \      --table td_sample_table \      --time-column date_time_column
```

Treasure Dataのストレージは時間によってパーティション化されているため、--time-columnオプションを指定することを推奨します。このオプションが指定されていない場合、データコネクタは最初のlong型またはtimestamp型のカラムをパーティショニング時間として選択します。--time-columnで指定するカラムのタイプは、long型またはtimestamp型のいずれかである必要があります（使用可能なカラム名とタイプを確認するには、プレビュー結果を使用してください。一般的に、ほとんどのデータタイプにはlast_modified_dateカラムがあります）。

データに時間カラムがない場合は、add_timeフィルタオプションを使用してカラムを追加できます。詳細については、[add_timeフィルタ](https://docs.treasuredata.com/smart/project-product-documentation/add_time-filter-function)プラグインを参照してください。

`td connector:issue`は、データベース（sample_db）とテーブル（sample_table）がすでに作成されていることを前提としています。データベースまたはテーブルがTDに存在しない場合、`td connector:issue`は失敗します。そのため、データベースとテーブルを手動で作成するか、`td connector:issue`で--auto-create-tableを使用してデータベースとテーブルを自動的に作成する必要があります。


```
 $ td connector:issue load.yml \       --database td_sample_db \       --table td_sample_table \       --time-column date_time_column \      --auto-create-table
```

コマンドラインから、ロードジョブを送信します。データサイズに応じて、処理に数時間かかる場合があります。

### 統合のスケジュール実行

定期的なMedia Campaign、Paid Search Campaign、Site Campaignのインポートのために、データコネクタの定期実行をスケジュールできます。高可用性を確保するために、スケジューラを慎重に構成しています。この機能を使用することで、ローカルデータセンターにcronデーモンを用意する必要がなくなります。

スケジュール実行では、Salesforce DMPからデータを取得する際のデータコネクタの動作を制御する設定パラメータをサポートしています：

- `incremental` この設定は、ロードモードを制御するために使用されます。これは、各オブジェクトに関連付けられたネイティブタイムスタンプフィールドの1つに基づいて、データコネクタがSalesforce DMPからデータを取得する方法を管理します。
- `columns` この設定は、Treasure Dataにインポートされるデータのカスタムスキーマを定義するために使用されます。ここでは、関心のあるカラムのみを定義できますが、取得するオブジェクトに存在することを確認してください。そうでない場合、これらのカラムは結果に含まれません。
- `last_record` この設定は、前回のロードジョブからの最後のレコードを制御するために使用されます。オブジェクトには、カラム名の`key`とカラムの値の`value`を含める必要があります。`key`は、Salesforce DMPデータのカラム名と一致する必要があります。


詳細と例については、「インクリメンタルローディングの仕組み」を参照してください。

### スケジュールの作成

`td connector:create`コマンドを使用して、新しいスケジュールを作成できます。スケジュールの名前、cron形式のスケジュール、データが保存されるデータベースとテーブル、およびデータコネクタ設定ファイルが必要です。

`cron`パラメータは、次のオプションを受け入れます：`@hourly`、`@daily`、`@monthly`。

デフォルトでは、スケジュールはUTCタイムゾーンで設定されます。-tまたは--timezoneオプションを使用して、タイムゾーンでスケジュールを設定できます。`--timezone`オプションは、'Asia/Tokyo'、'America/Los_Angeles'などの拡張タイムゾーン形式のみをサポートしています。PST、CSTなどのタイムゾーンの略語は*サポートされておらず*、予期しないスケジュールにつながる可能性があります。


```
$ td connector:create \
    daily_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml
```

Treasure Dataのストレージは時間によってパーティション化されているため、*--time-column*オプションを指定することも推奨されます。


```
$ td connector:create \
    daily_import \
    "10 0 * * *" \
    td_sample_db \
    td_sample_table \
    load.yml \
    --time-column created_at
```

### スケジュールのリスト表示

`td connector:list`コマンドを入力すると、スケジュールされたエントリのリストを表示できます。


```
$ td connector:list
```

### スケジュールの設定とスケジュール履歴の表示

`td connector:show`は、スケジュールエントリの実行設定を表示します。


```bash
td connector:show daily_import
```

`td connector:history`は、スケジュールエントリの実行履歴を表示します。個々の実行の結果を調査するには、`td job jobid`を使用します。


```bash
td connector:history daily_import
```

### スケジュールの削除

`td connector:delete`は、スケジュールを削除します。


```bash
$ td connector:delete daily_import
```

### インクリメンタルローディングの仕組み

インクリメンタルローディングは、ファイルの最後のインポート日を使用してレコードを単調にロードし、最新の実行後のファイルを挿入または更新します。

最初の実行時、このコネクタは**Filename Regex**と**Modified After**に一致するすべてのファイルをロードします。**incremental**`: true`が設定されている場合、最新の変更日時が新しい**Modified After**値として保存されます。

例：

- インポートフォルダに含まれるファイル：

```
+--------------+--------------------------+
|   Filename   |     Last update          |
+--------------+--------------------------+
| File0001.csv | 2019-05-04T10:00:00.123Z |
| File0011.csv | 2019-05-05T10:00:00.123Z |
| File0012.csv | 2019-05-06T10:00:00.123Z |
| File0013.csv | 2019-05-07T10:00:00.123Z |
| File0014.csv | 2019-05-08T10:00:00.123Z |
```
- Filename Regex: File001.*.csv
- Modified After: 2019-05-01T10:00:00.00Z


この場合、**File0011.csv**、**File0012.csv**、**File0013.csv**、**File0014.csv**のファイルがインポートされます。これらはFilename Regexに一致し、すべて最終更新日 > 2019-05-01T10:00:00.00Zです。

ジョブが終了すると、新しい**Modified After = 2019-05-08T10:00:00.123Z**が保存されます。

次回の実行時には、最終更新日 > **2019-05-08T10:00:00.123Z**のファイルのみがインポートされます。

例：

- インポートフォルダに新しく更新および追加されたファイル：

```
+--------------+--------------------------+
|   Filename   |     Last update          |
+--------------+--------------------------+
| File0001.csv | 2019-05-04T10:00:00.123Z |
| File0011.csv | 2019-05-05T10:00:00.123Z |
| File0012.csv | 2019-05-06T10:00:00.123Z |
| File0013.csv | 2019-05-09T10:00:00.123Z |
| File0014.csv | 2019-05-08T10:00:00.123Z |
| File0015.csv | 2019-05-09T10:00:00.123Z |
```
- Filename Regex: File001.*.csv
- Modified After: **2019-05-08T10:00:00.123Z**


この場合、**File0013.csv**と**File0015.csv**のファイルのみがインポートされます。