Azure Data Factory にて Salesforce をソースとした場合のデータ連携パターン

## 概要

Azure Data Factory にて Salesforce をソースとした場合のデータ連携パターンを共有します。

## 基本的な方針

### データ連携パターン

Azure Data Factory にて Salesforce をソースとする場合には、下記の方法があります。

1. Salesforce コネクタ（Salesforce Bulk API 2.0）によるコピーアクティビティ
2. REST API コネクタ（Salesforce REST API）によるコピーアクティビティ

### Salesforce Bulk API 2.0 利用したパイプラインの利用方針

REST API コネクタ等にて Salesforce Bulk API 2.0 を利用することが、出力結果が CSV であることや Web アクティビティにより出力結果を直接書き込む場合に 4 MB が上限となることから連携パターンに含めていません。

Salesforce のドキュメントにて CSV 形式の出力結果であることが記述されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5b35c617-59b3-1029-4cea-6d8d5d345ca4.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/d1293035-fade-331d-a7ab-e2de73efd397.png)

引用元：[クエリジョブの結果の取得 | Bulk API 2.0 および Bulk API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_asynch.meta/api_asynch/query_get_job_results.htm)

REST API により Storage に直接書き込むことも可能ですが、サイズ上限が 4 MB となるため実装が厳しいと判断しました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/57b56ce5-517e-4fd0-ad13-271cac3ca023.png)

引用元：[Web アクティビティ - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/control-flow-web-activity)

## データ連携パターン

### 1. Salesforce コネクタ（Salesforce Bulk API 2.0）によるコピーアクティビティ

#### 利用する Salesforce の API 

Salesforce コネクタを利用する場合には Salesforce Bulk API 2.0 が利用されます。

> Salesforce Bulk API 2.0 を使用して、データのクエリと取り込みを行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/708f961b-7195-1224-f780-b81e4c7eae6d.png)

引用元：[Salesforce との間でデータをコピーする - Azure Data Factory & Azure Synapse | Microsoft Learn](https://learn.microsoft.com/ja-jp/azure/data-factory/connector-salesforce?tabs=data-factory#salesforce-bulk-api-20-limits)

#### パイプライン

##### パイプラインの全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/f555af46-8d1f-134b-3ce1-de86ab19586c.png)

#### 実行確認

##### パイプラインを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/328af106-0dca-383b-9ebc-a75df8856639.png)

##### データの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/7ea20f50-adf9-3f9f-c58e-f62b7119ec72.png)

### 2. REST API コネクタ（Salesforce REST API）によるコピーアクティビティ

#### 利用する Salesforce の API

差分連携を実施することを目的として、削除済みのデータを取得する場合には QueryALL を利用し、削除済みデータが不要の場合には Query を利用します。

- [QueryAll | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/resources_queryall.htm)
- [Query | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/resources_query.htm)

REST API 実行時には最大 2000 レコードを取得でき、それ以上のレコードを取得するためにはリターン値の一部である`nextRecordsUrl`を再帰的に実行する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c375851b-ffcc-757d-82d7-99175e745696.png)

引用元：[SOQL クエリを実行する | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/dome_query.htm#retrieve_remaining_results_title)

> QueryAll 要求が実行された場合、同期要求で一度に最大 2,000 個のレコードが返されます。

引用元：[QueryAll | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/resources_queryall.htm)

> SOQL クエリが実行された場合、同期要求で一度に最大 2,000 個のレコードが返されます。

引用元：[Query | REST API 開発者ガイド | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.api_rest.meta/api_rest/resources_query.htm)

#### パイプライン

##### パイプラインの全体像

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/58c577c0-f269-e055-8434-b3e55fcd6f3e.png)

##### コピーアクティビティにて改ページの規則の設定

コピーアクティビティの改ページの規則にて、`AbsoluteUrl`に `body`と`['nextRecordsUrl']`を設定します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/5c0b18b0-bdf1-bc79-eb47-6afe4f9f7d28.png)

#### コピーアクティビティにてマップの設定

CSV などの表形式へシンクする場合には、下記の記事を参考にマップの設定を実施します。

- [Azure Data Factory にて階層構造をソースとしたコピーアクティビティ実施時の表形式へのシンク方法 #Salesforce - Qiita](https://qiita.com/manabian/items/cbc1863e3eb96e5eee8a)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/294e8f39-d90f-0723-b1f6-75ae9d3578f3.png)


#### 実行確認

##### パイプラインを実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/c45af6a7-0592-0101-8285-b16a2dd09faa.png)

##### データの確認

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/24031/61673b32-dc00-9a83-c48f-cdbe7917c7ee.png)