# 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('', 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 ベースの訪問者識別の信頼性が低下しています。私たちはこの問題に対するソリューションを積極的に計画しています。 ## TD コンソールを使用して接続を作成 ### 新しい接続の作成 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 接続を作成する TD Console を使用して接続を設定できます。 ### 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**のファイルのみがインポートされます。