Salesforceレコードデータをパッケージ化して任意の組織へロードする方法

## 概要

Salesforceで構築したシステムのテスト環境を用意する際、複数組織に渡って統一されたデータ環境を準備するのは困難です。Sandbox組織でも Full / Partial Copyができない環境のことも多く、また組織コピーには時間がかかり、回数にも制限があります。かといってデータローダーでのインポートは手作業が多く、特に参照関係をまたがったデータのローディングは熟練者でもなかなか至難の業です。

一方、Salesforceではパッケージという仕組みで、カスタムオブジェクトやカスタム項目などのメタデータ定義をまとめ、さらにそのパッケージをアップロードして配布用のURLを作成し、他組織に配布することができます。

ここではその仕組を利用して、ある組織で作成したレコードデータをパッケージ化し、そのパッケージをインストールすることで、誰でもSalesforceデータの初期ロード（移入）とセットアップが容易にできるようにします。

## 活用シーン

* テストデータの配布
* デモデータの配布
* チュートリアルコンテンツの配布
* 本番環境から(Developer) Sandbox組織へのデータ移行

## 事前セットアップ

レコードデータをバンドルしたパッケージを作成するには、Salesforce CLIおよびプラグインを利用します。
これはパッケージの作成者のみが必要なものであり、作成されたパッケージをインストールしてデータをロードするユーザには必要ありません（Salesforceの管理者アカウントとWebブラウザのみでOK）。

### Salesforce CLIのインストール
https://developer.salesforce.com/docs/atlas.ja-jp.sfdx_setup.meta/sfdx_setup/sfdx_setup_install_cli.htm

### sfdx-migration-automatic プラグインのインストール
```shell-session
$ sfdx plugins:install sfdx-migration-automatic
```

### Salesforce CLIからSalesforce組織へのログイン
```shell-session
$ sfdx auth:web:login
```
ブラウザ画面が立ち上がるので、デモデータを作成したSalesforce組織の管理者ユーザでログインしておきます。

## パッケージの作成

### CSVデータのエクスポート
（事前にSalesforce上で対象となるレコードがオブジェクトに保存されている前提）
Salesforce CLIから以下のコマンドを実行し、オブジェクトに含まれるレコードデータを全部CSVファイルとして排出します。

```shell-session
$ sfdx automig:dump \
   --objects CustomObj01__c,CustomObj02__c \
   --outputdir dump \
   --targetusername {Salesforce組織ユーザ名} 
```

`--objects` 以下にデータをCSVファイルとしてエクスポートしたいオブジェクトのAPI参照名をカンマ区切りで列挙します。`--outputdir` にCSVの排出先のディレクトリ名を指定します。

エクスポート対象のデータに他オブジェクトのレコードへの参照が含まれている場合、以下のようにオブジェクト名の後に `:related` と付与することで、参照しているレコードのみをエクスポートします。

```shell-session
$ sfdx automig:dump \
   --objects CustomObj01__c,CustomObj02__c,Account:related,Contact:related \
   --outputdir dump \
   --targetusername {Salesforce組織ユーザ名} 
```
コマンド実行後、`dump` ディレクトリ以下にCSVファイルが生成されていることを確認します。

### CSVデータをバンドル化してパッケージを作成

以下のコマンドを実行して、CSVデータをパッケージにバンドルして追加します。

```shell-session
$ sfdx automig:package \
   --inputdir dump \
   --packagename {パッケージ名} \
   --targetusername {Salesforce組織ユーザ名} 
```

`--packagename` オプションで新規作成するパッケージの名前を指定します。既存のパッケージ名を指定した場合はそのパッケージにバンドルされたCSVデータがコンポーネントとして追加されます。

パッケージ作成に成功するとパッケージIDがコンソール表示されます。

```shell-session
$ sfdx automig:package --inputdir dump --packagename="デモ用パッケージ" --targetusername=admin@example.com
Creating Migration App Package... done

Status: Succeeded
Success: true
Done: true
Number Component Errors: 0
Number Components Deployed: 3
Number Components Total: 3
Number Test Errors: 0
Number Tests Completed: 0
Number Tests Total: 0

Deployed Package ID: 0332J000000DSeBQAW
```

Salesforce組織の 設定 > アプリケーション > パッケージ > パッケージマネージャ から該当のパッケージ名を検索し、詳細画面に以下のようにコンポーネントが含まれていることを確かめます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/015c4b91-b16e-7653-30f0-30d6d24df170.png)

## パッケージのアップロード
パッケージの詳細画面から、「アップロード」ボタンをクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/464a1b92-4420-fc24-d1eb-70ad79523ae8.png)

パッケージ名、パッケージバージョンを適当に入力し、「アップロード」を実行。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/7b6ee96e-818a-0ecf-c82e-4bcd6c6d5479.png)

しばらくするとインストール用URLが表示されます。
このインストールURLを利用して、他の組織に対しても簡単にデモデータを配布可能となります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/74cb3180-63fd-31bd-7e72-fb43fb95329c.png)

## パッケージのインストール

先のステップで得られたインストールURLにアクセスし、デモデータをインポートしたいSalesforce組織に管理者アカウントでログインします。
Sandbox組織やScratch組織の場合、URL中の login.salesforce.com を test.salesforce.com に置き換えてアクセスする必要があります。

パッケージ詳細画面が現れたらそのまま「インストール」を実行

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/456950a6-5a78-7e83-12de-0c231b9d6066.png)

インストール完了したら、アプリケーションランチャーから「Migration Commander」タブを検索し、選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/31a54247-665f-fa3f-5931-ef9b2fe1e753.png)

タブの画面内にパッケージされたCSVデータのリストが表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/d347d5aa-7d65-22cb-219c-b17b32e6c31c.png)

## データのロード

Migration Commander内の Load Data ボタンをクリックすると、ダイアログが表示され、パッケージされているCSVデータのローディングが開始されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/33f0bec4-a3db-b38c-d469-f86938c956fc.png)

ロード完了後、エラーなどがある場合は Failuresタブ内に情報が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/aab4a890-11ce-a6ef-5078-61f375372b78.png)

実際にデータがロードされたかどうかを確かめます。ちゃんと元々のSalesforce組織での参照関係を維持した状態でデータの取り込みが行われています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/e3ec80e0-20e7-ed27-e972-1ec6ead45543.png)


データロードが完了したら、このパッケージは用済みです。アンインストールして構いません。
設定 > アプリケーション > パッケージ > インストール済みパッケージからアンインストール可能です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/6495/0459edfd-9b2a-7b1f-0161-c9e92acad873.png)

なお Migration Commander 画面で表示されるテーブル内の `Num of Existing Records` 列には、現在のSalesforce組織内で格納されているレコードの総数が表示されます。この数字の横にあるDeleteリンクを押すと、その組織にあるオブジェクト内のレコードデータを全消去します。データをかんたんにクリーンにすることができますが、組織環境によっては危険な行為になりうるので、実行する際には細心の注意をもって実行してください。