Salesforce で組織シェイプを使ってスクラッチ組織を作成してみる

今回は Salesforce で組織シェイプを使ったスクラッチ組織の作成を試してみました。
組織シェイプを使うと、特定の本番組織の状態を再現したスクラッチ組織を手軽に作成できるようになります。主な用途としては、スクラッチ組織で開発する際に本番環境に近い環境が必要な場合や、トラブルシューティングのために特定のお客様の環境を再現したい場合などとされています。
注意点としては、再現されるのは永続的な(ユーザーによって変更されない)設定情報のみであるという点です。主にエディション、契約によって有効化される機能、制限、ライセンスなどが対象となっていて、データ、メタデータ、各機能の有効化状況などは含まれません。このあたりがサンドボックスとの違いになります。

> Salesforce の組織シェイプを使ったスクラッチ組織の作成する機能は、本記事の投稿時点はベータ提供中の機能となります。

## 組織シェイプの有効化と権限の設定
組織シェイプを利用するには、コピー元の本番組織で `設定 > 開発 > 組織シェイプ` から組織シェイプを有効化しておく必要があります。また、どの DevHub 組織でスクラッチ組織の作成を許可するかを指定します。これによって、許可されていない DevHub 組織からエディションやライセンスに関する本番環境での利用状況が勝手に読み取られないようにします。

![スクリーンショット 2020-12-27 13.25.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/c5ce96ce-29c1-c1da-777c-52b583cc491d.png)

次に、スクラッチ組織を作成する DevHub 組織で、権限セットを作成しスクラッチ組織を作成するユーザーに割り当てます。組織シェイプを作成する人とスクラッチ組織を作成する人が異なる場合があるので、必要に応じで権限セットを分ける事もできます。

![スクリーンショット 2020-12-27 13.28.50.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/f1989634-3a63-0d94-bc11-c8dc151bbed5.png)


## 組織シェイプを作成する
組織シェイプの作成は、コピー元となる本番組織を認証した Salesforce CLI から行います。組織シェイプの作成後、`STATUS` が `ACTIVE` になっていれば組織シェイプを使用してスクラッチ組織を作成する事ができます。

```bash
# Salesforce CLI で本番組織にログインし、ProdOrg という別名をつけておく
$ sfdx force:auth:web:login -a ProdOrg

# ProdOrg から組織シェイプを作成する
$ sfdx force:org:shape:create -u ProdOrg
Successfully created org shape for 3SRXXXXXXXXXXXXXXX.

# 有効な組織シェイプを確認する
$ sfdx force:org:shape:list
=== Org Shapes
  ALIAS    USERNAME             ORG ID              SHAPE STATUS  CREATED BY                CREATED DATE
  ───────  ───────────────────  ──────────────────  ────────────  ───────────────────  ────────────────────────────
  ProdOrg  user001@example.com  00DXXXXXXXXXXXXXXX  Active        user001@example.com  2020-12-26T08:25:08.000+0000
```

# 組織シェイプを使ってスクラッチ組織を作成する
それでは、作成した組織シェイプからスクラッチ組織を作成してみます。
スクラッチ組織を組織シェイプから作成するには `sourceOrg` としてコピー元の組織 ID を指定した `*-scratch-def.json` ファイルを作成します。

```json:config/config/example-shape-scratch-def.json
{
    "orgName": "Scratch Org with Shape",
    "sourceOrg": "00DXXXXXXXXXXXXXXX"
}
```

あとは、この定義ファイルを使って、いつも通り Dev Hub 組織でスクラッチ組織を作成するだけです。

```bash
# Salesforce CLI で Dev Hub 組織にログインし、DevHub という別名をつけておく
$ sfdx force:auth:web:login -a DevHub

# sourceOrg を指定した定義ファイルでスクラッチ組織を作成する
$ sfdx force:org:create -v DevHub -t scratch -f config/example-shape-scratch-def.json -a ScratchOrgWithShape -d 1 -w 30
Successfully created scratch org: 00DXXXXXXXXXXXXXXX, username: test-xxxxxxxxxxxx@example.com

# 組織シェイプを使って作成したスクラッチ組織を開く
$ sfdx force:org:open -u ScratchOrgWithShape
```

作成したスクラッチ組織がコピー元の本番環境と同じ状態になっているかを確認するには、 `設定 > 会社の設定 > 組織情報` でエディションやライセンスを比較してみると分かりやすいかと思います。一方で、メタデータやデータはコピーされないので、アプリケーションやオブジェクトなどはコピーされていないはずです。
![スクリーンショット_2020-12-27_16_15_39-3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/26378/462cd2e8-797b-28f9-7afa-d0c7791606eb.png)


## おまけ: 本番組織でどのライセンスや機能が使われているのかを確認する
組織シェイプでは、シェイプの作成時に本番組織で利用しているライセンスや機能をスクラッチ組織の定義ファイルとして書き出す機能があります。これを使うと、本番組織でどのライセンスや機能が使われているのかを一覧で確認する事ができるので知っておくと便利かもしれません。

```bash
# ProdOrg に対し組織シェイプを作成し、コンフィグファイルに書き出す
$ sfdx force:org:shape:create -u ProdOrg  -f config/exported-shape-scratch-def.json
Successfully created scratch org definition file in the project's config directory for exported-shape-scratch-def.json.

# 書き出されたスクラッチ組織の定義ファイルを開く
$ cat config/exported-shape-scratch-def.json
{
  "edition": "developer",
  "features": [
    "addcustomapps:XX",
    "addcustomfields:XX",
    "addcustomobjects:XX",
    "addcustomrelationships:XX",
    ...
```



## 参考
- [組織シェイプに基づいてスクラッチ組織を作成する (ベータ) | Salesforce DX 開発者ガイド](https://developer.salesforce.com/docs/atlas.ja-jp.228.0.sfdx_dev.meta/sfdx_dev/sfdx_dev_shape_intro.htm)
- [org Commands | Salesforce CLI Command Reference](https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_force_org.htm#cli_reference_force_org_shape_create)