外部データの活用:Salesforce External Objectsによるリアルタイム連携の深掘り

背景と応用シナリオ

現代のビジネス環境において、企業データは複数のシステムに分散していることが一般的です。Salesforceはその強力なCRM機能で中心的役割を担いますが、顧客情報、注文履歴、在庫データなどがERP(Enterprise Resource Planning)システム、レガシーデータベース、あるいは他のクラウドサービスといった外部システムに存在するケースは少なくありません。

これらの外部データをSalesforce内で利用するには、従来、ETL(Extract, Transform, Load)ツールやカスタムAPI連携を用いてデータをSalesforceに複製する方法が主流でした。しかし、このアプローチにはいくつかの課題が伴います。例えば、データの同期遅延、ストレージコストの増加、データの一貫性の維持、そして複雑なインテグレーションロジックの開発・保守負担です。

Salesforceのユーザーが常に最新の外部データにアクセスする必要がある場合、データの複製は最適な解決策ではありません。ここで登場するのが、Salesforceの強力な機能であるExternal Objects(外部オブジェクト)です。External Objects(外部オブジェクト)は、Salesforce Connectを介して外部システムのデータをあたかもSalesforce内の標準オブジェクトやカスタムオブジェクトであるかのように扱えるようにする機能です。

External Objects(外部オブジェクト)の主な応用シナリオは以下の通りです。

  • 注文履歴の表示: 顧客の注文データがERPシステムに格納されている場合、Salesforceの取引先レコードから直接、リアルタイムの注文履歴を参照できます。データ複製は不要です。
  • 在庫状況の確認: 製品の在庫情報が外部の在庫管理システムにある場合、Salesforceの商談や商品レコードから最新の在庫状況を確認し、販売機会損失を防ぎます。
  • レガシーシステムのデータ利用: 既存のオンプレミスデータベースに存在する重要な顧客属性や契約情報を、Salesforceに移行することなく利用できます。
  • カスタマーサポートの強化: 外部のチケットシステムやナレッジベースの情報を、Service Cloudのコンソールから直接参照し、顧客への対応品質を向上させます。

これらのシナリオでは、Salesforceユーザーは外部データにシームレスにアクセスでき、データは常に最新の状態が保証されます。これにより、データ複製に伴う課題を解消し、より効率的で信頼性の高いビジネスプロセスを実現します。


原理説明

External Objects(外部オブジェクト)は、Salesforce Connectと呼ばれるフレームワークの中核をなす機能であり、外部システムのデータをSalesforceのプラットフォーム上に透過的に統合するための強力なメカニズムを提供します。

Salesforce Connectの仕組み

Salesforce Connectは、特定のプロトコル(OData、Salesforce Connect Adapter for Amazon S3、またはカスタムApexアダプター)を通じて外部システムに接続し、データの読み取りを可能にします。その主要な構成要素は以下の通りです。

  • External Data Source(外部データソース): これは、Salesforceと外部システム間の接続を定義します。接続先のURL、認証情報、プロトコルの種類(OData 2.0、OData 4.0、Salesforce Connect Adapter for Amazon S3、またはCustom Apex Adapter)などを設定します。外部データソースを設定することで、Salesforceはどの外部システムからデータを取得すべきか、どのように認証すべきかを理解します。
  • External Object(外部オブジェクト): External Data Source(外部データソース)を介して接続された外部システムのテーブルやエンティティをSalesforce内で表現するものです。External Object(外部オブジェクト)を作成すると、Salesforce Connectは外部システムのスキーマ(テーブル名、フィールド名、データ型など)を読み取り、Salesforce内のオブジェクトとしてマッピングします。これにより、開発者はSOQL(Salesforce Object Query Language)を使ってExternal Object(外部オブジェクト)を照会できるようになります。データはSalesforceに複製されず、ユーザーがExternal Object(外部オブジェクト)にアクセスするたびに、リアルタイムで外部システムから取得されます。

データ取得の流れ

ユーザーがExternal Object(外部オブジェクト)を参照する(例: レコード一覧の表示、SOQLクエリの実行)と、以下のプロセスが実行されます。

  1. Salesforce Connectは、関連付けられたExternal Data Source(外部データソース)の定義に従って、外部システムにデータリクエストを送信します。
  2. 外部システムはリクエストを受け取り、該当するデータを取得します。
  3. 外部システムはデータをSalesforce Connectに返します。
  4. Salesforce ConnectはそのデータをSalesforceのUIまたはApexコードに表示・提供します。

このプロセス全体で、データはSalesforceのデータベースに物理的に保存されることなく、外部システムから直接ストリーミングされます。

リレーションシップの種類

External Objects(外部オブジェクト)は、Salesforce内の標準オブジェクトやカスタムオブジェクトとのリレーションシップを確立できます。これにより、関連する外部データをSalesforceのレコードページに表示したり、レポートで統合したりすることが可能になります。

  • Lookup Relationship(参照リレーションシップ): Salesforce内の標準オブジェクトやカスタムオブジェクトからExternal Object(外部オブジェクト)を参照する場合に使用します。一般的な参照リレーションシップと同様に動作しますが、参照元のオブジェクトに外部オブジェクトのIDを保持する必要があります。
  • Indirect Lookup Relationship(間接参照リレーションシップ): External Object(外部オブジェクト)からSalesforce内の標準オブジェクトやカスタムオブジェクトを参照する場合に使用します。External Object(外部オブジェクト)の指定されたカスタムフィールド(例: 外部ID)と、参照先のSalesforceオブジェクトの指定されたカスタムフィールド(外部IDまたはユニークなテキストフィールド)が一致することで関連付けを行います。この方法は、外部システムがSalesforceレコードのIDを知らない場合に特に有効です。
  • External Lookup Relationship(外部参照リレーションシップ): External Object(外部オブジェクト)から別のExternal Object(外部オブジェクト)を参照する場合、またはExternal Object(外部オブジェクト)からSalesforceの標準オブジェクト・カスタムオブジェクトを(通常ではない方法で)参照する場合に使用します。これは主に外部システム内でのリレーションシップを反映するために設計されており、参照元と参照先のオブジェクトの両方が外部IDまたはユニークなフィールドを持つ必要があります。

例示コード

External Objects(外部オブジェクト)は、SalesforceのUIまたはMetadata APIを使用して設定されますが、設定が完了すると、ApexやSOQLを使用してSalesforceの他のオブジェクトと同様に照会できます。以下に、ApexでExternal Object(外部オブジェクト)を照会する例を示します。

この例では、外部システムに保存されている顧客の注文情報を表すExternal_Order__cというExternal Object(外部オブジェクト)があることを想定しています。このオブジェクトには、OrderNumber__cOrderAmount__cといったフィールドが存在すると仮定します。

public class ExternalOrderService {

    /**
     * @description 特定の注文番号を持つ外部注文情報を取得します。
     * @param orderNumber 検索する注文番号
     * @return 注文番号に一致するExternal_Order__cレコードのリスト
     */
    public static List<External_Order__c> getOrderByNumber(String orderNumber) {
        // External Object (外部オブジェクト) である External_Order__c をSOQLでクエリします。
        // Salesforce Connect はこのクエリを受け取り、関連付けられた External Data Source (外部データソース) を介して
        // 外部システムに実際のデータリクエストを送信します。
        // SOQLのWHERE句は、可能であれば外部システムにプッシュダウンされ、フィルタリングが外部システム側で行われます。
        try {
            List<External_Order__c> externalOrders = [
                SELECT Id, OrderNumber__c, OrderAmount__c, OrderDate__c, CustomerName__c
                FROM External_Order__c
                WHERE OrderNumber__c = :orderNumber
            ];
            System.debug('取得した外部注文情報: ' + externalOrders);
            return externalOrders;
        } catch (Exception e) {
            // 外部システムとの通信エラーやSOQLの実行エラーが発生した場合のハンドリング
            System.debug('外部注文情報の取得中にエラーが発生しました: ' + e.getMessage());
            throw new AuraHandledException('外部注文情報の取得に失敗しました: ' + e.getMessage());
        }
    }

    /**
     * @description 特定の顧客名で外部注文情報を検索します。
     *              注意: WHERE句で外部オブジェクトの特定のフィールドを使用する場合、
     *              そのフィールドが外部システム側でインデックス化されているとパフォーマンスが向上します。
     * @param customerName 検索する顧客名
     * @return 顧客名に一致するExternal_Order__cレコードのリスト
     */
    public static List<External_Order__c> getOrdersByCustomerName(String customerName) {
        try {
            // LIKE演算子もExternal Objectに対して使用可能です。
            // ただし、外部データソースや外部システムの機能に依存します。
            List<External_Order__c> externalOrders = [
                SELECT Id, OrderNumber__c, OrderAmount__c, OrderDate__c, CustomerName__c
                FROM External_Order__c
                WHERE CustomerName__c LIKE :('%' + customerName + '%')
            ];
            System.debug('取得した顧客別外部注文情報: ' + externalOrders);
            return externalOrders;
        } catch (Exception e) {
            System.debug('顧客別外部注文情報の取得中にエラーが発生しました: ' + e.getMessage());
            throw new AuraHandledException('顧客別外部注文情報の取得に失敗しました: ' + e.getMessage());
        }
    }
}

上記のコードは、Salesforce内のカスタムオブジェクトをクエリするのと同様に、SOQLを使用してExternal Object(外部オブジェクト)をクエリできることを示しています。External_Order__cは、__cサフィックスを持つ通常のカスタムオブジェクトのように見えますが、実際には外部システムからデータを取得しています。

重要な点として、SOQLクエリのWHERE句に含まれる条件は、Salesforce Connectによって外部データソースに(可能であればODataクエリパラメータとして)変換され、外部システム側でデータのフィルタリングが行われることが期待されます。これにより、Salesforceに転送されるデータ量を最小限に抑え、パフォーマンスを向上させることができます。


注意事項

External Objects(外部オブジェクト)は強力な機能ですが、実装および運用にはいくつかの考慮事項があります。これらを理解し、適切に対処することで、安定したパフォーマンスとセキュリティを確保できます。

1. パフォーマンス (Performance)

  • ネットワーク遅延: 外部システムへのデータリクエストはネットワークを介して行われるため、ネットワークの遅延が直接パフォーマンスに影響します。
  • 外部システムの性能: 外部データソースが接続するシステムの応答速度が遅い場合、Salesforce側でのデータ表示も遅延します。外部システムのクエリパフォーマンスがボトルネックとなる可能性があります。
  • クエリの最適化: 可能な限り、WHERE句を使用して外部システム側でフィルタリングを行い、Salesforceに転送されるデータ量を最小限に抑えるようにします。外部システムのデータベースインデックスを最適化することも重要です。

2. ガバナ制限とAPI制限 (Governor Limits and API Limits)

  • コールアウト制限: ApexからExternal Object(外部オブジェクト)をクエリする場合、それは外部システムへのコールアウトとして扱われます。標準のApexコールアウト制限(例: 1トランザクションあたり最大100回のコールアウト、累積タイムアウト120秒)が適用されます。
  • API使用量: Salesforce Connectによる外部データへのアクセスは、SalesforceのAPIコール制限にはカウントされませんが、外部システム側のAPI使用量としてカウントされる場合があります。外部システムのAPI制限を確認し、適切な利用計画を立てる必要があります。

3. セキュリティ (Security)

  • 認証と承認: External Data Source(外部データソース)は、外部システムへのアクセスに必要な認証情報(ユーザー名、パスワード、OAuthトークンなど)を安全に管理する必要があります。また、Salesforceのプロファイルや権限セットを通じて、どのユーザーがExternal Object(外部オブジェクト)にアクセスできるかを制御します。
  • データ転送のセキュリティ: Salesforceと外部システム間の通信は、HTTPSなどの暗号化されたプロトコルを使用することが必須です。
  • 外部システムのセキュリティ: External Objects(外部オブジェクト)を介してアクセスされるデータは外部システムに存在するため、外部システムのデータセキュリティが極めて重要です。

4. データ書き込み (Data Writeback)

  • デフォルトでは、External Objects(外部オブジェクト)は読み取り専用です。外部データへの書き込みを有効にするには、External Object(外部オブジェクト)の設定で「書き込み可能な外部オブジェクト」を有効にする必要があります。
  • 書き込み可能なExternal Object(外部オブジェクト)を使用する場合でも、外部システムが更新操作をサポートしている必要があり、かつその操作をSalesforce Connectアダプターが適切に処理できる必要があります(特にODataの場合、PUT/POST/PATCH/DELETE操作)。カスタムApexアダプターを使用する場合は、開発者が更新ロジックを実装します。

5. 検索機能 (Search Functionality)

  • グローバル検索でExternal Object(外部オブジェクト)のデータを検索するには、External Object(外部オブジェクト)の定義で「検索を許可」を有効にする必要があります。
  • 検索インデックスはSalesforceが外部データを直接保持しないため、通常のSalesforceオブジェクトとは異なる挙動を示すことがあります。検索結果の鮮度やパフォーマンスは外部システムの応答に依存します。

6. リレーションシップの複雑性 (Relationship Complexity)

  • Indirect Lookup Relationship(間接参照リレーションシップ)やExternal Lookup Relationship(外部参照リレーションシップ)の設定は、通常の参照リレーションシップよりも複雑になることがあります。特に、外部IDの一貫性とユニーク性が重要になります。

7. エラー処理 (Error Handling)

  • 外部システムが利用できない場合やエラーを返す場合、Salesforce Connectはエラーメッセージを返します。エンドユーザーに対して適切なエラーメッセージを表示し、問題のトラブルシューティングを可能にするためのエラーハンドリングを考慮する必要があります。
  • ApexでExternal Object(外部オブジェクト)をクエリする際には、try-catchブロックを使用して例外を適切に処理することが重要です。

まとめとベストプラクティス

まとめ

External Objects(外部オブジェクト)は、Salesforce Connectの基盤となる機能であり、外部システムのデータをSalesforce環境内でリアルタイムかつシームレスに利用するための画期的なソリューションを提供します。データの複製を不要にすることで、ストレージコストの削減、データ同期の複雑さの解消、そして常に最新のデータへのアクセスを可能にします。これにより、Salesforceをデータの一元的なビューポイントとして活用し、ビジネスプロセスを統合・最適化する強力なツールとなります。

ベストプラクティス

  1. 適切なアダプターの選択:
    • 外部システムが標準的なODataサービスを提供している場合、OData 2.0またはOData 4.0アダプターが最も簡単に設定できます。
    • より複雑なビジネスロジック、非標準のAPI、またはSalesforce Connectがサポートしていないプロトコル(例: SOAP、RESTful API)を必要とする場合は、Custom Apex Adapter(カスタムApexアダプター)を検討してください。
    • Amazon S3にデータが格納されている場合は、Salesforce Connect Adapter for Amazon S3が最適です。
  2. クエリの最適化とフィルタリング:
    • 常に最小限のデータのみを取得するようにSOQLクエリを設計し、WHERE句を効果的に活用して外部システム側でデータをフィルタリングします。
    • 外部システムの対応するフィールドにインデックスが設定されていることを確認し、クエリパフォーマンスを最大化します。特に、フィルタリングやソートに使用されるフィールドはインデックス化されるべきです。
  3. パフォーマンスの監視:
    • External Objects(外部オブジェクト)のパフォーマンスは、ネットワーク遅延と外部システムの応答速度に大きく依存します。初期導入時だけでなく、継続的にパフォーマンスを監視し、ボトルネックを特定して対処します。Salesforce Connectの使用状況レポートや外部システムのログを定期的に確認しましょう。
  4. セキュリティの確保:
    • 外部システムへの接続は常にHTTPS経由で行い、認証情報を安全に管理します。Salesforceのプロファイルと権限セットを使用して、External Objects(外部オブジェクト)へのアクセス権限を厳密に制御します。
    • 外部システム自体のセキュリティ対策も同様に重要です。
  5. 書き込み機能の慎重な利用:
    • データの一貫性を維持するため、外部システムへの書き込み(更新、作成、削除)は、それが真に必要であり、外部システムがその操作を安全かつ正確に処理できる場合にのみ有効にします。
    • 書き込みロジックが複雑な場合は、Custom Apex Adapter(カスタムApexアダプター)を使用し、堅牢なエラーハンドリングを実装します。
  6. ユーザー教育と期待値の管理:
    • エンドユーザーに対して、External Objects(外部オブジェクト)のデータが外部システムからリアルタイムで取得されており、通常のSalesforceデータとは異なる挙動(例: 検索結果の遅延、読み取り専用フィールド)を示す場合があることを伝えます。
    • 外部システムのダウンタイムがSalesforceの表示に影響を与える可能性があることを理解させます。
  7. エラーハンドリングの徹底:
    • 外部システムとの通信は常に失敗する可能性があります。ApexやVisualforce、LightningコンポーネントでExternal Objects(外部オブジェクト)を利用する際には、外部システムのダウンタイムやエラーを適切に処理し、ユーザーに分かりやすいフィードバックを提供する堅牢なエラーハンドリングを実装します。

これらのベストプラクティスを遵守することで、External Objects(外部オブジェクト)のメリットを最大限に引き出し、Salesforceエコシステムと外部システム間のシームレスな統合を実現することができます。

コメント