LoginSignup
10
6

Salesforce → Salesforceのデータ転送を楽にする?脱データローダー?? SFDMUを試してみる

Last updated at Posted at 2022-12-14

はじめまして Salesforce現在勉強中の@takaHAL と言います。

この記事は、Salesforce Advent Calendar 2022の15日目の記事です
よろしくお願いします:santa_tone1:

これはなに?

SFDMU(SFDX-Data-Move-Utility)というSalesforce CLIのプラグインを試してみます。
デスクトップアプリも存在しますが、日本語対応していないのとUIがSFDMUを完全に理解した!という感じでないと使いにくいため
今回はコマンドでの実行を試していこうと思います。

SFDMUを使用することで、force:data:treeやデータローダを使用している人の不満の解決策になるかもしれません。

対象者

  • データローダでのデータ転送で、手元のCSV加工に疲れた人
  • Salesforceの開発環境への初期データ投入をどうしようか考えている人

SFDMUてなに?

Salesforce CLIのプラグインで、Salesforceへの転送ができるものです。
既存の他システムのCSVを読み取ってSalesforceに転送したり、Salesforce(本番)からSalesforce(sandbox)への転送も可能です。
みなさんも開発環境に本番に近いデータがなくて困ったことはありませんでしょうか?
そんな時にデータローダーやforce:data:treeコマンドを使っていますでしょうか?
その際に、データローダーの使いにくさで困ってませんか?
今回SFDMUを使ってみることで脱データローダーをしてみましょう。

SFDMUを利用することで今までデータローダーを使って以下のような内容を行うパターンなどに非常に楽になります。

  • 本番Salesforceから、AccountとContactの親子関係を保持したままデータを開発環境Salesforceに転送したい
  • 複数のオブジェクトのデータを一回のコマンドでまとめて他のSalesforceに転送したい
  • Salesforceに転送する際に、個人情報はマスキングしたい

では早速試してみましょう

どんな感じに実行するのか?

最終的にどういうことをするのかのざっくりのイメージ

以下の2ステップで実行できます。

  • 1. export.jsonを作成し転送したい設定ファイルを書く
  • 2. sfdx sfdmu:runコマンドで特定の環境にデータを転送

送るデータは、取引先オブジェクトと取引先責任者で互いに外部ID項目はなしです。

無題の図形描画 (21).jpg

外部ID項目はありませんが、SFDMUでは外部ID項目 でなくとも外部IDのようにUpsertKeyにすることができます。

export.json
{
  "objects": [
    {
      "query": "SELECT all, RecordTypeId FROM Account",
      "operation": "Upsert",
      "externalId": "Name",
      "mockFields": [
        {
          "name": "Name",
          "pattern": "c_seq_number('テスト取引先', 0, 1)"
        }
      ],
      "updateWithMockData": true
    },
    {
      "query": "SELECT all, RecordTypeId FROM Contact",
      "operation": "Upsert",
      "externalId": "Name",
      "mockFields": [
        {
          "name": "LastName",
          "pattern": "c_seq_number('テスト姓', 0, 1)"
        },
        {
          "name": "FirstName",
          "pattern": "c_seq_number('テスト名', 0, 1)"
        }
      ],
      "updateWithMockData": true
    }
  ]
}

実行することでAccountとContactの親子関係を保った状態で、データを転送することができます。

# sourceusername データ転送元環境
# targetusername データ転送先環境
$ sfdx sfdmu:run --sourceusername SOURCEUSERNAME --targetusername TARGETUSERNAME

このようにマスキングされた状態で、取引先と取引先責任者を紐づけて挿入してくれます。

スクリーンショット 2022-12-15 0.39.20.png

元データはこんな感じです。

スクリーンショット 2022-12-15 0.41.50.png

それでは、export.jsonのオプション等の説明とセットアップをこの後やります。

セットアップ

Salesforce CLI

SFDMUは、Salesforce CLIのプラグインである為
Salesforce CLIのセットアップが必要です。

詳しくはこの記事では説明しませんので、公式のドキュメントをご参照ください。

SFDMUのインストール

$ sfdx plugins:install sfdmu

Salesforceの環境について

今回使用するSalesforce環境は、Trailheadのハンズオン環境を2つ使用します。

productiondevelopmentの環境を作成しました。

下記の画像のように、productionのハンズオン環境のデータをdevelopmentのハンズオン環境に転送しようと思います。

無題の図形描画 (18).jpg

組織を認証する

$ sfdx auth:web:login --setalias production   # productionへのログイン
$ sfdx auth:web:login --setalias sandbox      # developmentへのログイン

2つの環境の認証が完了したら準備OKです

使い方

Salesforce → Salesforceの転送の仕方と、各種オプションの説明を書きます。

公式ドキュメント

export.jsonファイルを作成する

以下のファイルでAccount と Contactを全件取得し、
転送先のSalesforceに参照関係を保持した状態で、データが入ります

  • オブジェクトの指定
  • 取得するためのSOQLを記述
  • マスキング等のオプションの追記

送るデータは、取引先オブジェクトに外部ID項目があるパターンです。

無題の図形描画 (20).jpg

このような要素でファイルが構成されています。

export.json
{
  "objects": [
    {
      "query": "SELECT all, RecordTypeId FROM Account",
      "operation": "Upsert",
      "externalId": "ExternalId__c",
      "mockFields": [
        {
          "name": "Name",
          "pattern": "c_seq_number('テスト取引先', 0, 1)"
        }
      ],
      "updateWithMockData": true
    },
    {
      "query": "SELECT all, RecordTypeId FROM Contact",
      "operation": "Upsert",
      "externalId": "Account.ExternalId__c",
      "mockFields": [
        {
          "name": "LastName",
          "pattern": "c_seq_number('テスト姓', 0, 1)"
        },
        {
          "name": "FirstName",
          "pattern": "c_seq_number('テスト名', 0, 1)"
        }
      ],
      "updateWithMockData": true
    }
  ]
}

よく使いそうなjsonの項目の説明について

項目 説明
query 取得するSOQLを各場所
operation Insert, Update, Upsert, Delete の基本的な挿入時の挙動と、Readonlyというデータは入れなくてもいいけど参照する必要がある場合に指定するオプションがある
externalId 外部キー 外部キーになっていないフィールドも指定可能(取引先の名前とか)
updateWithMockData trueにするとmockFieldsに記載したルールでデータがマスキングされて挿入されます。

queryについて

通常のSOQLの記述に加えて以下のような形式もサポートしています。

項目 説明
all RecordType, Group, User, DandBCompany を除くすべての項目
readonly_true 読み取り専用のフィールドのみ(自動採番の項目とか)
readonly_false 読み取り専用のフィールド以外の項目
custom_true カスタム項目のみ
custom_false 標準項目のみ
createable_true 作成可能なフィールドのみ
createable_false 作成可能なフィールド以外
updateable_true 更新可能なフィールドのみ
updateable_false 更新可能なフィールド以外
lookup_true ルックアップ項目すべて
lookup_false ルックアップ項目以外
type_... type_string だと テキスト項目のフィールドのみを選択 型名はこちら

mockFieldsについて

 "mockFields": [
    {
      "name": "LastName",
      "pattern": "c_seq_number('テスト姓', 0, 1)"
     },
     {
       "name": "FirstName",
       "pattern": "c_seq_number('テスト名', 0, 1)"
      }
  ],
項目 説明
name マスキングする項目名
pattern 上書きする値:(※1)
externalId 外部キー 外部キーになっていないフィールドも指定可能(取引先の名前とか)
updateWithMockData trueにするとmockFieldsに記載したルールでデータがマスキングされて挿入されます。

patternについて(※1)

項目 説明
ids レコードのIDで上書きされます
c_seq_number(prefix, from, step) c_seq_number('テスト姓', 0, 1) で テスト姓1,テスト姓2 のようなデータで上書きされます。
c_seq_date(from, step) c_seq_date('2019-01-01', 'd') で "2019-01-01", "2019-01-02", "2019-01-03" のように日付データが入ります。
casualの値 "pattern": "name"とか"pattern": "email"で対応したダミーデータを作ってくれるhttps://www.npmjs.com/package/casual#embedded-generators

casualに関しては、検証が出来次第追記します。

Salesforce → Salesforce データを転送する

export.json がある場所で以下を実行

$ sfdx sfdmu:run --sourceusername production --targetusername development

もしくは

例)/sfdx-outexport.json があるとすると以下のように実行も可能

$ sfdx sfdmu:run --sourceusername production --targetusername development --path ./sfdx-out

CSVをデータソースにする

SFDMUは、Salesforce → Salesforceだけではなく
CSV → Salesforceも実行可能です。

まずは、Trailheadをのデモデータを元に簡単なCSVを用意しました。

Account.csv
Name,Phone
テスト取引先500,(503) 421-7800

export.jsonと同一階層にCSVを設置しています。

スクリーンショット 2022-12-15 1.46.02.png

CSVのデータが入ったとわかりやすいように、マスキングはせずexport.jsonを作成。

export.json
{
  "objects": [
    {
      "query": "SELECT Name, Phone FROM Account",
      "operation": "Upsert",
      "externalId": "Name"
    }
  ]
}

CSV→Salesforce データを転送する

export.json がある場所で以下を実行

CSVをデータソースにする場合は、--sourceusername を csvfileにしてください。
--targetusernameを csvfileにした場合は取得したデータをCSVとして出力できます。

$ sfdx sfdmu:run --sourceusername csvfile --targetusername development

もしくは

例)/sfdx-outexport.json があるとすると以下のように実行も可能

$ sfdx sfdmu:run --sourceusername csvfile --targetusername development --path ./sfdx-out

スクリーンショット 2022-12-15 1.53.56.png

CSVのデータも取り扱うことができました。こうなってくると
外部データ連携システムが、SFDMUのCLIをAWS上とかで実行すると完成しますね。

最後に

Salesforce開発を進めると問題になってくる開発環境のデータ問題を解決する策としても、データローダーの利用しんどい問題を解決する策としてもSFDMUは候補にあがるのではないでしょうか?
私が所属するチームでは、SalesforceのAdminもエンジニアもSalesforceDXを活用するので
SFDMUはかなり重宝しております。
CLIなので、データ連携システムの一部として使えそうだったりと非常に面白いものでした。

今回は、アドベントカレンダーの完走賞を目指しているので
SalesforceやWeb関連の記事をガンガンアウトプットしていきます!!
気になるものがあれば是非コメントでアドバイス等いただけると幸いです。

参考にさせていただいた記事

10
6
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
6