CumulusCI(Snowfakery)を使った大量データテスト組織の作成
こんにちは。木村です。
Salesforceの開発では、大量にデータのある組織でしか起きない不具合が起きることがあります。SOQLのパフォーマンス問題なんかは大量データでよく起きる問題です。特にAppExchangeアプリの開発では、実際に問題の起きている顧客組織での調査には限界があるので、同じく大量データの入った組織を調査用や開発用に用意する必要があります。今回の記事はそんな大量データ組織をCumulusCIを使って簡単に作る手順の解説記事になります。
こちらはゆるっとSalesforceトークで発表した内容でもあります。毎月開催しているのでぜひご参加ください。
利用する組織
Enterprise Scale Testing for Partnersに記載がありますが、Large Data Volume (LDV) OrgsというBaseパートナーだと50GB使用できる組織(期限60日)もあります。
しかし、Partner Enterprise Edition(PEE)が20GB(期限1年)であり、それでも十分なので今回はPEEで作成します。ちなみにSalesforceは1レコード2KBなので、20GBだと約1,000万件に入ることになります。
ボリューム的にLDVが必要な場合はLDVの使用を検討してください。
利用するツール
以下の2つのツールを使用します。
Snowfakery
フェイクデータ作成ツール。
CumulusCI
Salesforce組織のセットアップ/テスト/デプロイを自動化するツールだが、その中の1機能としてSnowfakeryを利用したデモデータ作成機能がある。
ちなみにCumulusはキュミュラスと読み、積雲・綿雲という意味だそうです。
手順
1. 環境ハブでPEE組織を作る
大量データを入れる組織として、パートナービジネス組織(PBO)で環境ハブを開き、PEE組織を作成します。
2. CumulusCIをインストールする
CumulusCIはSnowfakeryを含んでおり、CumulusCIをインストールするとSnowfakeryもインストールされます。
Macでのインストール手順を説明します。他の環境でのインストール手順は以下のリンクをご覧ください。
https://cumulusci.readthedocs.io/en/stable/get-started.html#install-cumulusci
pipxをインストールします。
$ brew install pipx
$ pipx ensurepath
CumulusCIをインストールします。
$ pipx install cumulusci
.bashrcを実行しないとcciコマンドにパスが通らないので注意してください。
$ source ~/.bashrc
3. CumulusCIプロジェクト作成
以下のドキュメントの通りにプロジェクトを作成します。https://cumulusci.readthedocs.io/en/stable/get-started.html#start-a-new-cumulusci-project
$ mkdir cci_project
$ cd cci_project
$ git init
$ cci project init
いろいろと聞かれるので適当に答えます。データロードするだけなので今回は全部デフォルトでいいと思います。
4. 組織に接続
以下のドキュメントの通り対象組織に接続します。
https://cumulusci.readthedocs.io/en/stable/connected-orgs.html
$ cci org connect <org_name>
ブラウザが起動してSalesforceのログイン画面が表示されるので対象組織にログインする。
5. Snowfakeryのレシピ作成
まずSnowfakeryのレシピを作成します。レシピはどういうデータを生成するかの定義ファイルです。
単純な設定だと以下のようなファイルになります。このレシピでは「Account(id=1, Name=Pratt-Stokes Holdings)」のようなデータが生成されます。「fake: company」を設定しているのでNameはランダムな会社名になります。
- object: Account
fields:
Name:
fake: company
いろいろなフェイクデータ作成機能がありますし、冒頭にlocaleを設定することで日本語のフェイクデータを出力できます。
例えば、
fake: last_name
「石井」「西村」「後藤」のような日本語の姓をランダムに生成
fake: city
市区町村でランダムにデータ生成
random_choice
以下のように設定すると40%をMr.、40%をMs.、10%をDr.で、10%をProf.でランダムにデータ生成できます。
Salutation:
random_choice:
Mr.: 40%
Ms.: 40%
Dr.: 10%
Prof.: 10%
レシピの参考には以下のページが有用です。
今回使用したレシピは以下にアップしました。このレシピではContactが2つ紐付いたAccountレコードを2件作成します。
https://gist.github.com/atskimura/8dd429d31a532e1664d7febf0e04fdda
AccountとContactの関連付けは以下のように設定します。
friends:
- object: Contact
count: 2
fields:
AccountId:
reference: Account
以下のコマンドを実行すると生成されるデータを標準出力で確認できます。
$ snowfakery datasets/snowfakery/Account.recipe.yaml
6. データロードの試行
データロードの方法は以下のドキュメントに記載されています。
https://cumulusci.readthedocs.io/en/stable/data.html#generate-fake-data
以下のコマンドで一回だけレシピを使ってデータをロードできます。このコマンドでは2件のAccoutレコードしか作成できません。
$ cci task run snowfakery --recipe datasets/snowfakery/Account.recipe.yaml --org <org_name>
以下のように--run-until-recipe-repeatedを指定することでレシピを指定回数繰り返し実行できる。このコマンドでは、2 x 2 で4件のAccountレコードをロードできます。
$ cci task run snowfakery --recipe datasets/snowfakery/Account.recipe.yaml --org <org_name> --run-until-recipe-repeated 2
[04/04/23 20:20:34] Org info updated, writing to keychain
Beginning task: Snowfakery
As user: admin@xxxxx.example.com
In org: 00D2w00000QtSXXXXX
Working directory is /var/folders/p_/xsfvys896hjbknhg_j90d4540000gn/T/tmpig062320
Org info updated, writing to keychain
Beginning task: GenerateAndLoadDataFromYaml
As user: admin@xxxxx.example.com
In org: 00D2w00000QtSXXXXX
Beginning task: GenerateDataFromYaml
Generating batch 0 with 2
Generated batch
[04/04/23 20:20:35] Org info updated, writing to keychain
Beginning task: LoadData
As user: admin@xxxxx.example.com
In org: 00D2w00000QtSXXXXX
[04/04/23 20:20:36] Running step: Insert Account
Creating DataOperationType.INSERT Operation for Account using DataApi.SMART
Prepared 4 rows for DataOperationType.INSERT to Account.
Running step: Insert Contact
[04/04/23 20:20:37] Creating DataOperationType.INSERT Operation for Contact using DataApi.SMART
Prepared 8 rows for DataOperationType.INSERT to Contact.
== Results ==
Account: 4 successes, 0 errors
Contact: 8 successes, 0 errors
☃ Snowfakery created 2 iterations in 3s.
7. データロード本番
実際は以下のようにして実行しました。
重複エラーが出てしまうので重複ルールを無効化。
Account.recipe.yamlのAccountのcountを500に修正。
--run-until-recipe-repeatedを200回にして実行。
これで10万件のAccountレコードと20万件のContactレコードがロードされます。私が試したときは約7分かかりました。
以下のようなレコードが作成されます。
終わりに
お手軽にそれっぽくバリエーションも豊かなレコードを大量にロードした組織が作れます。クエリのパフォーマンスの確認や大量データのある組織でしか起きない不具合の調査環境を作るのに非常に便利なツールです。ぜひ皆さんもお試しください。
参考リンク
Enterprise Scale Testing for Partners
Salesforceパートナー向けに大量データでテストする方法についてまとめてあるページ(Partnerアカウントが必要)