Amazon AppFlowでIncremental Transferを使う

# Amazon AppFlowについて

Amazon AppFlowはSalesforceやSAPなどのSaaSアプリケーションとAmazon S3やAmazon Redshiftなどのサービス間をコーディングなしでデータ転送できるサービスです。
AWSでSaaSからデータをS3に取り込む方法としてはファーストチョイスとなるサービスになります。

# データ連携のトリガについて

Amazon AppFlowではSaaSアプリケーションとデータ連携を行うトリガについて３種類のモードが用意されています。

- オンデマンド
    - ユーザが手動でデータ連携を実行する方法
- イベント
    - SaaSアプリケーションでのイベントをトリガとしてデータ連携を実行する方法
    - イベントが利用できるかどうかはSaaSアプリケーションの機能に依存。Salesforceであれば、[Change Data Capture](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_intro.htm)の設定を行うことでイベントが利用できる
- スケジュール
    - 設定したスケジュールでデータ連携を行う方法
    - 全データを連携する方法かIncremental Transferと呼ばれる増分データだけを連携する方法かを選択できる

ここでは大量データがある場合に有効な設定となる、スケジュールでのIncremental Transferの設定方法、動作内容について見ていきます。

# Incremental Transferの設定方法

AppFlowの設定を行います。ここではSalesforceのデータをS3に取り込む設定を行います。

- Amazon AppFlowから `フローを作成`を選択し手順1でフロー名を入力して次へ進みます。
![スクリーンショット 2022-04-08 18.40.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/fbc98259-2f3b-0d7e-8628-42e3c689a013.png)

- 手順2ではまずは送信元としてSalesforceを選択し、Salesforce接続を選択します。Salesforce接続は初回セットアップ時は存在しないので、接続名とSalesforceへのログイン情報等を入力して接続を作成する必要があります。今回はSalesforceオブジェクトのOpportunityのデータを取得する設定にします。
![スクリーンショット 2022-04-08 18.44.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/df10eeb3-db44-a23b-3f85-fe4ed8aec00e.png)

- 手順2の続きとして送信先の設定を行います。Amazon S3を送信先として設定し送信先バケットを選択します。また、その他の設定の部分で今回は保存されるデータの形式としてParquetを選択しました。
![スクリーンショット 2022-04-08 18.48.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/21124570-f533-d5cd-8d6f-56abee68b79e.png)

- また手順2の続きとして、ここでフロートリガーの設定を行います。スケジュール通りにフローを実行を選択し、開始日、開始時刻を設定します。繰り返しのタイミングはデフォルトの5分毎としています。
    - 転送モードはIncremental Transferである増分転送を選択します。増分転送では何を持って増分かを判断する必要がありますので、ここではOpportunityオブジェクトのLast Modified Date項目を選択します。前回スケジュール実行された時刻よりもLast Modified Date項目の時刻が新しいレコードが増分転送の対象となります。
    - なお、繰り返しの間隔が日次かそれよりも実行間隔が長い設定の時に完全転送モードを選択できます。
![スクリーンショット 2022-04-08 18.52.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/23e29e68-5d42-d1e9-8468-4c76df99347d.png)

- 手順3では取り込むデータのフィールドをマッピングします。ここでは、すべてのフィールドを直接マッピングを選択してそのままデータを取り込む設定とします
    - その他の設定のところで、削除されたレコードのインポートにチェックを入れています。これについてはSalesforce上で削除されたレコードをデータ連携するかの設定になります。チェックを入れると、Opportunityオブジェクトのあるレコードを削除した場合、Delete項目がtrueに設定されたレコードがデータ連携されます。チェックを入れていない場合は削除されたレコードが連携されることはありません。
![スクリーンショット 2022-04-08 19.00.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/a890364e-d5c6-4242-91e7-0b08c041d86a.png)

- 手順4, 手順5については特に設定変更はせずにそのまま進みフロー作成を完了します

- 開始時刻になるとフローが実行され、その後は指定した間隔ごとにフローが実行されます


# Incremental Transferの動作

Incremental Transferがどのようにデータ連携を行うかを解説します。

- 初回実行は指定したオブジェクトの全データを連携する
- 連携されたデータは指定したS3の位置にランダムな文字列のフォルダが作成され、その配下に連携されたデータファイルが配置される
![スクリーンショット 2022-04-08 19.10.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/500ee10c-be5a-1f67-e4bd-6e0ad0cf9c72.png)
- スケジュール実行ごとにデータの更新がある場合は、新しいフォルダが作成されデータファイルが配置される。データの更新がない場合はフォルダは作成されない
![スクリーンショット 2022-04-08 19.09.21.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/276167/322a596b-084c-af33-5183-f47074d18954.png)
- データの更新はレコードの追加、既存レコードの更新、既存レコードの削除があり、それぞれのIncremental Transferの時のデータ連携内容
    - レコードの追加については、追加されたレコードと同じ内容がS3のデータファイル内の1レコードとして追加される
    - 既存レコードの更新については、更新後のレコードと同じ内容がS3のデータファイル内の1レコードとして追加される
    - 既存レコードの削除については、上記に記載の通り削除されたレコードのインポートにチェックを入れるか入れないかで、S3のデータファイル内に追加されるかされないかが決定される

ここで重要なのは、Salesforce上での既存レコードの更新、削除でもS3のデータファイルには**更新内容、削除内容がレコード追加される**ということです。
そのため、S3に連携されるデータについてはデータの履歴のようになっているため、Salesforce上でのデータと全く同一の状態で保持されているわけではありません。
そのため、同一の状態にしたい場合は、連携されたデータの更新内容、削除内容に応じてデータ加工をする必要があることに注意が必要です。