背景と応用シナリオ
Salesforceプラットフォームにおいて、ビジネスプロセスの自動化は生産性向上と業務効率化の鍵となります。従来、この役割はWorkflow Rules (ワークフロールール)やProcess Builder (プロセスビルダー)が担ってきました。しかし、Salesforceはこれらのツールの新規作成機能を段階的に廃止し、Flow (フロー)を宣言的自動化の未来を担う単一のツールとして位置付けています。
Salesforce技術アーキテクトとして、Flowの能力を最大限に引き出し、スケーラブルで保守性の高いソリューションを設計することは不可欠です。Flowは、単純な項目更新から、ユーザーとの対話、外部システム連携、複雑なデータ操作まで、幅広い要件に対応できる強力なツールです。
具体的な応用シナリオとしては、以下のようなものが挙げられます。
- ガイド付き画面フロー: 新規顧客のオンボーディングプロセスで、ユーザーに必要な情報を段階的に入力させるウィザードを作成する。
- 複雑なレコード作成: 商談が「成立」になった際に、関連する契約、注文、プロジェクトといった複数のオブジェクトのレコードを、条件に応じて動的に作成する。
- スケジュール起動バッチ処理: 毎晩、特定条件を満たす取引先責任者のステータスを更新し、フォローアップタスクを自動生成する。
- プラットフォームイベント連携: 外部システムからPlatform Event (プラットフォームイベント)メッセージを受信した際に、リアルタイムで在庫レコードを更新する。
原理説明
Flowは、Flow Builder (フロービルダー)というビジュアルインターフェースを使用して、ビジネスプロセスを視覚的に設計するツールです。コードを書くことなく、ロジックの要素をキャンバス上に配置し、それらをコネクタで結びつけることで、複雑な自動化処理を構築できます。
Flowを理解する上で重要な構成要素は、「フローの種類」、「要素」、「リソース」の3つです。
フローの種類
Flowには様々な起動方法や目的に応じた種類が存在します。
- Screen Flow (画面フロー): ユーザーインターフェース (UI) を持ち、ユーザーからの入力を受け付けながら対話形式で処理を進めるフローです。LightningページやExperience Cloudサイトに配置して使用します。
- Record-Triggered Flow (レコードトリガーフロー): レコードの作成、更新、削除をトリガーとして自動的に起動します。Apex (エイペックス)トリガーと同様の役割を宣言的に実現します。特に、データベースに保存する「前 (Before-Save)」と「後 (After-Save)」の処理を使い分けることがパフォーマンスの観点から重要です。
- Schedule-Triggered Flow (スケジュールトリガーフロー): 指定した日時に定期的に実行されるフローです。バッチ処理のように、一度に多数のレコードを対象とした処理に適しています。
- Platform Event-Triggered Flow (プラットフォームイベントトリガーフロー): 特定のプラットフォームイベントメッセージを受信した際に起動するフローです。非同期処理やイベント駆動型アーキテクチャの実現に利用されます。
- Autolaunched Flow (No Trigger) (自動起動フロー(トリガーなし)): 他のプロセス(Apex、Process Builder、別のフローなど)から呼び出されて実行されるフローです。UIを持たず、バックグラウンドで処理を実行します。再利用可能なビジネスロジックを部品化するのに便利です。
Flowの要素 (Elements)
Flow Builderのキャンバスに配置する個々の部品が「要素」です。要素は大きく3つのカテゴリに分類されます。
- Interaction (インタラクション): 画面の表示 (Screen)、外部システムの呼び出し (Action)、別のフローの実行 (Subflow) など、フローの外部とやり取りを行う要素です。
- Logic (ロジック): 変数への値の割り当て (Assignment)、条件分岐 (Decision)、コレクションの繰り返し処理 (Loop) など、フロー内のロジックを制御する要素です。
- Data (データ): Salesforceデータベースに対する操作を行う要素です。レコードの作成 (Create Records)、更新 (Update Records)、取得 (Get Records)、削除 (Delete Records) が含まれます。これらはSOQL (Salesforce Object Query Language)やDML (Data Manipulation Language)操作に相当します。
リソース (Resources)
リソースは、フロー内でデータを保持・操作するための「入れ物」や「道具」です。
- Variable (変数): レコード情報やユーザーの入力値など、フローの実行中に変化する値を格納します。単一の値だけでなく、レコードのコレクション(リスト)も保持できます。
- Constant (定数): フロー全体で変わらない固定値を定義します。
- Formula (数式): 他の値を基に計算を行い、結果を動的に算出します。
- Text Template (テキストテンプレート): 書式付きのテキスト(メール本文など)を生成します。
これらの要素とリソースを組み合わせ、コネクタで処理の順序を定義することで、一つの完成したビジネスプロセスが構築されます。
示例コード (ApexからのFlow呼び出し)
Flowは主に宣言的なツールですが、時にはApexからFlowを起動したい場合があります。例えば、複雑なロジックをカプセル化したAutolaunched Flowを、ApexトリガーやLightning Web Componentのコントローラーから呼び出すシナリオです。この連携にはFlow.Interview
クラスを使用します。
以下は、Salesforce公式ドキュメントに基づく、ApexからFlowを起動し、入力変数を渡し、出力変数を受け取るコード例です。
// ApexからFlowを呼び出すサンプルコード // Flowに渡す入力パラメータを格納するためのMapを準備します。 // Mapのキーは、Flowで定義された入力変数の一意名(API参照名)と一致させる必要があります。 Map<String, Object> params = new Map<String, Object>(); params.put('input_CaseId', '500xx000000abcd'); // 例: 特定のケースIDを渡す params.put('input_DiscountRate', 0.15); // 例: 数値型の変数を渡す try { // 起動したいFlowのインタビュー(実行インスタンス)を作成します。 // 'My_Flow_API_Name' は、Flowの一意名(API参照名)に置き換えてください。 Flow.Interview myFlow = Flow.Interview.createInterview('My_Flow_API_Name', params); // Flowを開始(実行)します。 myFlow.start(); // Flowの実行が完了した後、出力変数を取得します。 // 'output_Status' は、Flowで「出力に使用可能」としてマークされた変数の一意名です。 // getVariableValue()メソッドの戻り値はObject型なので、適切な型にキャストします。 String flowResultStatus = (String)myFlow.getVariableValue('output_Status'); // 取得した出力変数を使って、後続の処理を行います。 if (flowResultStatus == 'Success') { System.debug('Flowは正常に完了しました。'); } else { System.debug('Flowの実行結果: ' + flowResultStatus); } } catch (Exception e) { // Flowの実行中に例外が発生した場合の処理 System.debug('Flowの実行中にエラーが発生しました: ' + e.getMessage()); }
注意事項
Flowを設計・実装する際には、プラットフォームの制約とベストプラクティスを遵守することが、安定したシステム運用に不可欠です。
実行コンテキストと権限 (Execution Context and Permissions)
Flowがどのユーザーの権限で実行されるか(実行コンテキスト)を理解することは非常に重要です。
- User Context (ユーザーコンテキスト): Screen Flowなどは、基本的にフローを実行したユーザーの権限で動作します。そのユーザーがアクセスできないオブジェクトや項目には、フローもアクセスできません。
- System Context (システムコンテキスト): Record-Triggered FlowやSchedule-Triggered Flowは、デフォルトでシステムコンテキストで実行されます。これは、実行ユーザーの権限に関係なく、組織の全データにアクセスできることを意味します。ただし、共有ルールを考慮するかどうか(「共有なしのシステムコンテキスト」など)を選択できます。意図しないデータアクセスを防ぐため、この設定は慎重に選択する必要があります。
- 権限: ユーザーがフローを実行するためには、「フローを実行」というシステム権限が必要です。
ガバナ制限 (Governor Limits)
Salesforceプラットフォームでは、リソースの公平な利用を担保するために、1つのトランザクション内で実行できる処理の量に制限(ガバナ制限)が設けられています。Flowの実行もこの制限の対象となります。
- SOQLクエリ: 1トランザクションあたり100回まで(Get Records要素が該当)。
- DMLステートメント: 1トランザクションあたり150回まで(Create/Update/Delete Records要素が該当)。
- CPU時間: 1トランザクションあたり10,000ミリ秒まで。
最も注意すべきは、Loop (ループ) 要素の内部でData (データ) 要素(Get/Create/Update/Delete)を配置しないことです。これはガバナ制限に抵触する典型的なアンチパターンです。大量のレコードを処理する場合、ループ内で毎回データベースにアクセスすると、あっという間に制限を超えてしまいます。
エラー処理 (Error Handling)
本番環境では予期せぬエラーが発生する可能性があります。Flowが失敗した際に、プロセスが停止しデータが不整合な状態になるのを防ぐため、適切なエラー処理が不可欠です。
Flow Builderでは、Data要素やAction要素からFault Path (フォルトパス)という特別なコネクタを引くことができます。これは、その要素でエラーが発生した場合にのみ実行される経路です。フォルトパスの先に、エラー内容をカスタムオブジェクトに記録する処理や、システム管理者にメールで通知する処理を配置することで、堅牢なエラーハンドリングを実現できます。
まとめとベストプラクティス
Flowは、Salesforceにおける宣言的自動化の現在そして未来を担う、非常に強力で柔軟なツールです。技術アーキテクトは、その機能を深く理解し、以下のベストプラクティスを念頭に置いてソリューションを設計することが求められます。
- オブジェクトごとに1つのレコードトリガーフロー: Apexトリガーのベストプラクティスと同様に、1つのオブジェクトに対して、各トリガーコンテキスト(Before-Save, After-Save, On-Delete)ごとに1つのレコードトリガーフローを作成することを推奨します。フロー内でDecision要素を用いて処理を分岐させることで、実行順序を制御し、保守性を高めます。
- ハードコードされたIDの回避: フロー内にレコードIDやユーザーIDを直接書き込む(ハードコードする)のは避けるべきです。代わりに、Custom Metadata Types (カスタムメタデータ型)やCustom Labels (カスタム表示ラベル)を使用するか、Get Records要素で動的にIDを取得してください。
- 命名規則と説明の徹底: フロー、変数、要素には、その役割が明確にわかるような命名規則を適用し、必ず説明欄に詳細を記述します。これにより、将来の自分や他の開発者がフローを容易に理解し、メンテナンスできるようになります。
- バルク化の徹底: フローは常に複数のレコードを一度に処理する可能性があることを前提に設計します。ループ処理が必要な場合は、まず必要な全レコードを一度に取得してコレクション変数に格納し、ループ内では割り当て等のロジックのみを実行します。そして、ループを抜けた後で、更新・作成対象のコレクションを一度のDML操作で処理します。
- サブフローによる再利用: 複数のフローで共通して使用されるロジックは、Autolaunched Flowとして部品化(サブフロー化)し、各フローから呼び出すようにします。これにより、コードの重複を避け、保守性が向上します。
- フォルトパスの実装: データベース操作や外部システムコールなど、失敗する可能性のあるすべての要素には、必ずフォルトパスを追加して、予期せぬエラーに対応できる堅牢な設計を心がけます。
- パフォーマンスへの配慮: 不必要なGet Records要素や複雑なループはパフォーマンスの低下を招きます。フローの実行パスを最適化し、データベースへのアクセス回数を最小限に抑えるよう常に意識してください。
- 最新情報のキャッチアップ: Salesforceは年3回のリリースでFlowの機能を急速に強化しています。新しい機能を活用することで、よりシンプルで効率的な自動化が実現できるため、リリースノートを定期的に確認し、知識をアップデートし続けることが重要です。
これらの原則に従うことで、Salesforce Flowの真の力を引き出し、ビジネスの要求に応えるスケーラブルで持続可能な自動化ソリューションを構築することができるでしょう。
コメント
コメントを投稿