見出し画像

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分かかりました。

以下のようなレコードが作成されます。

取引先の例
取引先責任者の例

終わりに

お手軽にそれっぽくバリエーションも豊かなレコードを大量にロードした組織が作れます。クエリのパフォーマンスの確認や大量データのある組織でしか起きない不具合の調査環境を作るのに非常に便利なツールです。ぜひ皆さんもお試しください。

参考リンク