Salesforce 開発を加速する Scratch Org の活用術:開発者向け詳細ガイド

概要とビジネスシーン

Scratch Org(スクラッチ組織)は、Salesforce DX(Developer Experience)の中核をなす、プログラムによって完全に構成可能で、一時的かつ使い捨ての Salesforce 組織です。開発者が完全に隔離されたクリーンな環境で、迅速な機能開発、自動テスト、および継続的インテグレーション(CI/CD)を効率的に行えるように設計されています。その柔軟性と自動化機能は、現代の Salesforce 開発ワークフローにおいて不可欠なツールとなっています。

実際のビジネスシーン

Scratch Org の導入は、多様な業界で開発プロセスの劇的な改善をもたらしています。

  • シーンA:製造業 - 新製品導入時のカスタマイズ開発
    あるグローバル製造業企業では、新しいIoT製品ラインを導入するたびに、Salesforce の複雑なカスタマイズ(カスタムオブジェクト、フロー、Apexトリガなど)が必要でした。これまでは共有の Developer Sandbox 環境で開発していたため、他の開発者の変更との衝突、環境の汚染、テストの再現性の問題に直面していました。Scratch Org の導入により、製品チームは各新機能ごとに独立した Scratch Org をプロビジョニングし、隔離された環境で開発を進めることができるようになりました。これにより、開発リードタイムを約20%短縮し、変更衝突によるデプロイ失敗率を15%削減しました。
  • シーンB:金融サービス - 規制対応のための新機能開発
    金融サービス業界の企業では、新しい規制要件に対応するための顧客データ管理システムを Salesforce 上に構築していました。本番環境へのデプロイ前に厳格なセキュリティテストとコンプライアンスチェックが必要でしたが、従来の Sandbox では本番データに近いテストデータを準備するのが困難で、環境の分離も不十分でした。Scratch Org と Salesforce CLI を活用することで、各開発者は最小限のダミーデータと必要なメタデータのみを含む Scratch Org を動的に生成し、セキュアな環境で開発とユニットテストを実施できるようになりました。結果として、セキュリティ関連のバグ検出率を10%改善し、監査対応のための環境準備時間を半減させました。
  • シーンC:SaaS企業 - CI/CDパイプラインの自動テスト強化
    Salesforce ベースの SaaS プロダクトを提供する企業は、頻繁な機能リリースとバグ修正のために堅牢な CI/CD パイプラインを求めていました。既存の Sandbox 環境では、リフレッシュ頻度の制限や、テスト後のクリーンアップの複雑さがボトルネックとなっていました。Scratch Org を CI/CD パイプラインに組み込むことで、Git リポジトリへのプッシュをトリガーとして、毎回新しいクリーンな Scratch Org を作成し、そこに最新のコードをデプロイ、自動テストを実行し、テストが完了したら組織を自動的に破棄するフローを確立しました。これにより、自動テストの信頼性が向上し、デプロイ後の不具合発生率を約25%低減し、継続的デリバリーの速度を向上させました。

技術原理とアーキテクチャ

Scratch Org は、Salesforce の仮想化基盤上で動作し、指定された定義ファイルに基づいて動的にプロビジョニングされる一時的な Salesforce 組織です。その動作メカニズムは、Salesforce DX (Developer Experience) の主要コンポーネントと密接に連携しています。

基礎的な動作メカニズム

開発者は Salesforce CLI (Command Line Interface) を使用して、Scratch Org の作成、設定、および管理を行います。Scratch Org を作成する際、project-scratch-def.json という定義ファイルが使用されます。このファイルには、組織のエディション(例: Enterprise Edition)、有効にする機能(features)、設定(settings)、有効期限(duration)などがJSON形式で記述されています。CLI コマンドが実行されると、Salesforce の Dev Hub Org (開発ハブ組織) を介して、Salesforce プラットフォーム上で指定された定義に基づいた新しい組織がオンデマンドでプロビジョニングされます。

主要コンポーネントと依存関係

  • Salesforce DX CLI:Scratch Org の作成、メタデータのプッシュ/プル、テスト実行など、Salesforce DX のあらゆる操作を行うためのコマンドラインツールです。
  • Dev Hub Org:Scratch Org を作成・管理するための「親」となる Salesforce 組織です。本番組織、Developer Edition 組織、または Trailhead Playground を Dev Hub として設定できます。Scratch Org の作成には、この Dev Hub Org で「Dev Hub」機能が有効になっている必要があります。
  • Scratch Org Definition File (project-scratch-def.json):Scratch Org の特性(エディション、機能、設定、言語など)を定義するJSONファイルです。これにより、開発環境の一貫性と再現性が保証されます。
  • Source Tracking:Salesforce DX の重要な機能で、ローカルファイルシステム上のソースコードと Scratch Org 上のメタデータの間に存在する変更を追跡します。これにより、変更のプッシュ(push)とプル(pull)を効率的に行えます。

データフロー

ステップ 操作主体 アクション 結果
1. Dev Hub 有効化 Salesforce 管理者 本番/DE組織で Dev Hub 機能を有効化 Scratch Org の親組織として機能可能になる
2. Scratch Org 定義 Salesforce 開発者 project-scratch-def.json ファイルを定義 Scratch Org の特性(エディション、機能)を記述
3. Scratch Org 作成 Salesforce 開発者 (CLI) sfdx force:org:create -f project-scratch-def.json -a MyScratchOrg Dev Hub を介して新しい Scratch Org がプロビジョニングされる
4. メタデータ同期 Salesforce 開発者 (CLI) sfdx force:source:push ローカルのプロジェクトソースが Scratch Org にデプロイされる
5. 開発/テスト Salesforce 開発者 Scratch Org 上で開発、設定変更、テストデータ投入、Apexテスト実行 隔離された環境で作業が進められる
6. 変更の取得 Salesforce 開発者 (CLI) sfdx force:source:pull Scratch Org で行った変更がローカルのプロジェクトソースに同期される
7. Scratch Org 破棄 Salesforce 開発者 (CLI) sfdx force:org:delete -u MyScratchOrg Scratch Org が完全に削除される

ソリューション比較と選定

Salesforce 環境は多様であり、Scratch Org はその中でも特定のユースケースに最適化されています。他の主要な開発・テスト環境と比較することで、Scratch Org の選定基準がより明確になります。

ソリューション 適用シーン パフォーマンス Governor Limits 複雑度
Scratch Org
  • CI/CDパイプライン
  • 新機能開発、プロトタイピング
  • 機能ブランチごとの独立開発
  • パッケージ開発、マネージドパッケージテスト
高速なプロビジョニングと破棄 一般的な Salesforce Limits は適用されるが、環境そのものの作成・管理に制限あり (後述) 中~高 (Salesforce DX と CLI の習熟が必要)
Developer Sandbox
  • 単一機能の開発、ユニットテスト
  • 既存機能の拡張
  • 小規模なカスタマイズ
リフレッシュに時間がかかる(数分~数時間) 一般的な Salesforce Limits が適用される 低~中 (GUIベースの操作が主)
Partial Copy Sandbox
  • UAT(ユーザー受け入れテスト)
  • ステージング、統合テスト
  • 本番データの一部を用いたテスト
リフレッシュに時間がかかる(数時間~数日) 一般的な Salesforce Limits が適用される 中~高 (データテンプレートの管理が必要)
Full Copy Sandbox
  • パフォーマンス、負荷テスト
  • 大規模な統合テスト
  • 本番環境の完全なレプリケーション
  • リリース前最終テスト
リフレッシュに非常に時間がかかる(数日~1週間以上) 一般的な Salesforce Limits が適用される 高 (大規模データと設定の管理)

scratch orgs を使用すべき場合

  • アジャイル開発と CI/CD の導入:開発サイクルごとにクリーンな環境が必要な場合や、自動テストスイートを統合する場合。
  • 複数機能の並行開発:各開発者が自身のブランチで完全に独立した環境を必要とする場合。
  • パッケージ開発と ISV (Independent Software Vendor):パッケージの各バージョンや機能ごとに異なる Salesforce エディションでの互換性テストを行う場合。
  • プロトタイピングと PoC (Proof of Concept):新しいアイデアや機能の検証を迅速に行いたい場合。
  • 共有開発環境からの脱却:Sandbox の共有による競合や環境汚染の問題を解消したい場合。

❌ 不適用シーン

  • 長期間にわたる大規模なデータテスト:Scratch Org は一時的なものであり、大量の永続的なテストデータが必要な場合は Full/Partial Copy Sandbox の方が適しています。
  • 本番環境の完全なレプリケーション:Metadata API で取得できないデータ(例: Chatter フィード、活動履歴)や、大規模なデータセットを含めて本番環境を正確に再現したい場合は、Full Copy Sandbox が必要です。
  • GUI 操作のみを主とするユーザー:Salesforce CLI の操作が必須となるため、非技術者や CLI に不慣れなユーザーには敷居が高い場合があります。

実装例

ここでは、Salesforce DX と Salesforce CLI を使用して Scratch Org を作成し、基本的なメタデータをデプロイ、テストデータを作成、そして削除する一連のフローを説明します。

1. プロジェクトの作成と Scratch Org 定義ファイル (project-scratch-def.json) の準備

まず、VS Code で Salesforce DX プロジェクトを作成します。

// 新しい Salesforce DX プロジェクトを作成
// プロジェクト名は 'my-awesome-project' とします
sfdx force:project:create --projectname my-awesome-project
cd my-awesome-project

次に、プロジェクトフォルダ内の config/project-scratch-def.json ファイルを編集して、Scratch Org の定義を行います。以下はシンプルな定義例です。Developer Edition をベースに、営業、サービス、コミュニティの機能を有効にします。

{
  "orgName": "My Awesome Company", // Scratch Org の組織名
  "edition": "Developer",          // 組織のエディション
  "features": ["SalesCloud", "ServiceCloud", "Communities"], // 有効にする機能
  "settings": {                    // 組織設定
    "orgPreferenceSettings": {
      "s1EncryptedStoragePref2": false // 暗号化ストレージ設定 (例として)
    }
  },
  "durationDays": 7                // Scratch Org の有効期限(デフォルトは7日、最大30日)
}

2. Scratch Org の作成

定義ファイルに基づいて Scratch Org を作成します。-a フラグでエイリアス(別名)を指定すると、後続のコマンドで組織名を指定する代わりにこのエイリアスを使えます。

// project-scratch-def.json を使用して Scratch Org を作成
// エイリアスを 'DevScratchOrg' とする
sfdx force:org:create --definitionfile config/project-scratch-def.json --setalias DevScratchOrg --durationdays 7 --setdefaultusername

--setdefaultusername フラグは、新しく作成された Scratch Org をデフォルトのユーザー名として設定し、以降のコマンドで -u フラグを省略できるようにします。

3. メタデータのプッシュ

ローカルの Salesforce DX プロジェクトにあるメタデータを、新しく作成した Scratch Org にデプロイします。

// ローカルプロジェクトのソースを Scratch Org にプッシュ
sfdx force:source:push

4. 権限セットの割り当てとテストデータの投入

開発中の機能によっては特定の権限セットが必要な場合があります。また、テスト実行のためにテストデータを投入することも一般的です。ここでは、MyCustomPermissionSet という権限セットを割り当て、アカウントデータを投入する例を示します。

// Scratch Org のデフォルトユーザーに権限セットを割り当てる
// 'MyCustomPermissionSet' は事前にプロジェクトの 'force-app/main/default/permissionsets' に定義されている必要があります
sfdx force:user:permset:assign --permsetname MyCustomPermissionSet

// テストデータを作成するための CSV または JSON ファイルを準備し、sfdx force:data:tree:import を使用して投入
// 例: accounts.json ファイルにテスト用アカウントデータが定義されている場合
// (accounts.json の内容は公式ドキュメントを参照してください: https://developer.salesforce.com/docs/atlas.en-us.sfdx_cli_reference.meta/sfdx_cli_reference/cli_reference_force_data.htm)
// ファイルパスはプロジェクトのルートからの相対パスです
sfdx force:data:tree:import --plan data/accounts-plan.json

5. Apex テストの実行と Scratch Org の破棄

コードのテストを実行し、開発が完了したら Scratch Org を破棄します。

// Scratch Org 上で全ての Apex テストを実行
// テスト結果はデフォルトでコンソールに出力されます
sfdx force:apex:test:run --wait 10 --resultformat human

// デフォルトのブラウザで Scratch Org を開く
// 開発中に Scratch Org の GUI を確認したい場合に使用
sfdx force:org:open

// 開発が完了し、変更をローカルにプルしたら、Scratch Org を削除
// --noprompt を追加すると確認なしで削除されます
sfdx force:org:delete --targetusername DevScratchOrg --noprompt

注意事項とベストプラクティス

権限要件

  • Dev Hub Org の有効化: Scratch Org を作成する Salesforce 組織 (本番、DE、TP) で「Dev Hub」機能が有効化されている必要があります。
  • ユーザー権限: Dev Hub Org で Scratch Org を作成するユーザーは、「Create and Manage Scratch Orgs」権限を持つプロファイルまたは権限セットが割り当てられている必要があります。

Governor Limits

Scratch Org 自体の Governor Limits は、選択されたエディション (例: Developer Edition) に基づく通常の Salesforce Governor Limits が適用されますが、Scratch Org の作成と管理には以下の制限があります(2024年時点)。

  • Scratch Org 作成数: 1つの Dev Hub Org に対して、デフォルトでは24時間以内に最大100個の Scratch Org を作成できます(組織のエディションにより異なる場合があります。Enterprise Edition で50個、Unlimited Edition で100個が一般的)。
  • 同時アクティブ数: 1つの Dev Hub Org で同時にアクティブにできる Scratch Org の数は、Enterprise Edition で50個、Unlimited Edition で100個です。
  • 有効期間: Scratch Org のデフォルトの有効期間は7日間ですが、最大30日間まで延長可能です。

エラー処理

  • sfdx force:org:create 失敗:
    • 原因: project-scratch-def.json の構文エラー、Dev Hub が有効化されていない、Dev Hub ユーザーに適切な権限がない、Dev Hub Org の Scratch Org 作成制限に達している。
    • 解決策: JSON ファイルの検証、Dev Hub の設定確認、権限セットの割り当て確認、sfdx force:org:list --all でアクティブな Scratch Org 数を確認。
  • sfdx force:source:push 失敗:
    • 原因: メタデータの依存関係エラー、Apex コンパイルエラー、権限不足、デプロイされるメタデータが Scratch Org のエディションでサポートされていない機能を使用している。
    • 解決策: CLI の出力ログを確認し、エラーメッセージに基づいて修正。依存関係や設定の問題を解決。
  • Source Tracking の不整合:
    • 原因: ローカルと Scratch Org 間でメタデータが同期されていない。
    • 解決策: sfdx force:source:status で変更を確認し、sfdx force:source:pull で変更をローカルに取得するか、sfdx force:source:push でローカルの変更を反映。

パフォーマンス最適化

  • Scratch Org Definition ファイルの最適化:
    • 必要な features のみを含めることで、Scratch Org のプロビジョニング時間を短縮できます。不必要な機能を有効化しないようにしましょう。
    • settings も必要最小限に留めることで、起動時の処理を減らすことができます。
  • --shape フラグの活用 (Org Shape):
    • 既存の Sandbox や Dev Hub Org の設定(オブジェクト、フィールド、設定など)をテンプレートとして使用し、その「形状(shape)」で Scratch Org を作成することで、デフォルトの定義から始めるよりも高速に、かつ本番環境に近い Scratch Org を作成できます。これは特に大規模組織で役立ちます。
  • 最小限のテストデータ:
    • sfdx force:data:tree:import で投入するテストデータは、テストに必要な最小限に抑えることで、データのインポート時間を短縮できます。テストデータ生成ツールを活用するのも有効です。
  • CI/CD パイプラインでの並列化:
    • 複数の Scratch Org を並列で作成し、異なるテストスイートを実行することで、CI/CD パイプライン全体の実行時間を大幅に短縮できます。

よくある質問 FAQ

Q1:Scratch Org はなぜ「使い捨て」なのでしょうか?

A1:Scratch Org が使い捨てである理由は、開発プロセスをよりアジャイルかつクリーンにするためです。これにより、開発者は常にクリーンで予測可能な状態の環境から開発を開始でき、過去の変更履歴やテストデータの残骸に影響されることなく、特定の機能やバグ修正に集中できます。また、CI/CD パイプラインにおいて、自動テストの実行後に環境を破棄することで、次のテストが常に同じ初期状態から始まることが保証されます。これにより、環境依存によるテストの失敗を防ぎ、テストの信頼性を高めます。

Q2:Scratch Org で行った変更がローカルのファイルに反映されない場合、どのようにデバッグすればよいですか?

A2:まず、sfdx force:source:status コマンドを実行して、ローカルプロジェクトと Scratch Org 間でどのような変更があるかを確認します。このコマンドは、プルまたはプッシュが必要なメタデータのリストを表示します。もし変更がリストに表示されない場合は、変更が保存されていないか、対象のメタデータが Salesforce DX のソース形式の追跡対象外である可能性があります。変更が確認された場合は、sfdx force:source:pull コマンドを実行して、Scratch Org で行った変更をローカルプロジェクトに同期します。それでも解決しない場合は、VS Code の Salesforce Extensions Pack が適切に設定されているか、またはエディタでファイルを保存しているか確認してください。

Q3:Scratch Org の作成に非常に時間がかかります。短縮するための監視指標や方法はありますか?

A3:Scratch Org の作成時間は、主にインターネット接続速度、Salesforce のサーバー負荷、そして project-scratch-def.json ファイルで指定された機能や設定の複雑さに依存します。 主な監視指標としては、CLI コマンドの実行時間(ターミナル出力で確認)があります。短縮方法としては以下のものがあります: 1. project-scratch-def.json の最適化"features""settings" を必要最小限に限定し、不要なものを削除します。 2. Org Shape の活用:本番組織や代表的な Sandbox を Dev Hub に登録し、その形状 (shape) を元に Scratch Org を作成することで、初期設定の手間と時間を短縮できます。これは sfdx force:org:create --use-most-recent-org-shape または特定の形状IDを指定して利用します。 3. ネットワーク環境の確認:安定した高速なインターネット接続を使用しているか確認します。 4. Salesforce ステータスページの確認:Salesforce のステータスページ (status.salesforce.com) で、現在のインスタンスのパフォーマンス問題がないか確認します。

まとめと参考資料

Scratch Org は、Salesforce 開発のモダナイゼーションにおいて中心的な役割を果たすツールです。その一時的かつプログラム可能な性質は、開発のスピード、品質、そして再現性を飛躍的に向上させます。本記事では、Scratch Org の技術的側面から実際の利用シーン、実装例、そしてベストプラクティスまでを網羅的に解説しました。Salesforce 開発者にとって Scratch Org の習熟は、効率的でアジャイルな開発ワークフローを確立するための鍵となります。

公式リソース

コメント