SalesforceとHeroku連携のマスターガイド:統合エンジニアのための実践的アプローチ

こんにちは。Salesforce 統合エンジニア (Salesforce Integration Engineer) の視点から、Salesforce エコシステムの中でも特に強力なプラットフォームである Heroku について、その連携パターンと技術的な詳細を解説します。

背景と適用シナリオ

Salesforce は世界 No.1 の CRM プラットフォームですが、すべてのビジネス要件を Salesforce プラットフォーム単体で満たせるわけではありません。特に、大量のデータ処理、コンシューマ向けの高トラフィックな Web アプリケーション、または特定のプログラミング言語(Python, Ruby, Go など)で構築されたカスタムロジックを必要とする場合、外部プラットフォームの活用が不可欠になります。ここで登場するのが Heroku です。

Heroku は Salesforce が提供する PaaS (Platform as a Service; サービスとしてのプラットフォーム) であり、開発者がアプリケーションの構築・デプロイ・運用に集中できるよう、インフラ管理を抽象化してくれます。私たち統合エンジニアにとって、Heroku は Salesforce の機能を拡張し、より柔軟でスケーラブルなソリューションを構築するための強力な武器となります。

主な適用シナリオは以下の通りです。

1. カスタマー向け Web アプリケーション/ポータル

Experience Cloud (旧 Community Cloud) では要件を満たせない、高度にカスタマイズされた UI/UX を持つ BtoC 向けの Web サイトや顧客ポータルを構築するケースです。Heroku 上で Node.js や Python を用いてフロントエンドとバックエンドを開発し、顧客データや商品データは Salesforce とリアルタイムで同期します。

2. データ集約と大量バッチ処理

Salesforce のガバナ制限(Governor Limits)を回避するために、夜間の大量データ集計や、外部システムから受け取ったデータの複雑な加工処理を Heroku にオフロードします。Heroku 上のパワフルなコンピューティングリソースを利用して処理を行い、結果だけを Salesforce に書き戻すことで、Salesforce 組織のパフォーマンスを維持します。

3. マイクロサービスアーキテクチャ

特定のビジネス機能(例:高度な見積もり計算エンジン、レコメンデーションエンジンなど)を独立したマイクロサービスとして Heroku 上に構築し、Salesforce や他のシステムから API 経由で呼び出せるようにします。これにより、システムの疎結合化と俊敏な開発が可能になります。


原理説明

Salesforce と Heroku を連携させるための主要な技術として、Heroku ConnectSalesforce Connect の2つが存在します。これらは似ているようで、役割が全く異なります。

Heroku Connect (ヘロク・コネクト)

Heroku Connect は、Salesforce の標準・カスタムオブジェクトと Heroku 上の Heroku Postgres データベースのテーブルを双方向に同期させるためのアドオンサービスです。統合エンジニアの視点では、これは最もシンプルかつ強力なデータ連携手法です。

仕組み:

  • データ同期: 設定したマッピングに基づき、Salesforce API (主に SOAP API や Bulk API) を利用して、定期的にデータをポーリングし、差分を Heroku Postgres に反映します。逆方向も同様で、Postgres 上のデータ変更を検知し、Salesforce に書き込みます。
  • 設定ベース: コーディングは不要で、Web UI からどのオブジェクトのどの項目を同期するかをマッピングするだけで設定が完了します。
  • ニアリアルタイム: 同期間隔はプランによりますが、通常は数分間隔でポーリングが行われ、ニアリアルタイムなデータ連携が実現できます。

Heroku Connect を利用することで、Heroku 上のアプリケーション開発者は、使い慣れた SQL を使って Salesforce データにアクセスできるようになります。Salesforce の SOQL や API の詳細を意識する必要がありません。

Salesforce Connect (セールスフォース・コネクト)

Salesforce Connect は、Salesforce 組織内から外部システムのデータ(この場合は Heroku Postgres 上のデータ)を、あたかも Salesforce のオブジェクトのようにリアルタイムで参照・操作するための技術です。データは Salesforce には保存されません。

仕組み:

  • 外部オブジェクト (External Objects): Salesforce 上に「外部オブジェクト」と呼ばれる特殊なオブジェクトを作成します。これは実データを持たず、外部データソースへのポインタ(参照情報)として機能します。
  • OData プロトコル: Salesforce Connect は、OData (Open Data Protocol) という標準化された RESTful API プロトコルを利用して外部データソースと通信します。Heroku Postgres のデータを OData 経由で公開するために、Heroku 上に OData のエンドポイントとなるアプリケーションをデプロイする必要があります。
  • リアルタイムアクセス: ユーザーが Salesforce 上で外部オブジェクトのレコードを参照しようとすると、その都度リアルタイムで Heroku に対してクエリが実行され、データが取得・表示されます。

この方式は、データを Salesforce に複製したくない場合や、常に最新のデータを外部システムから直接取得したい場合に適しています。


示例代码

ここでは、Salesforce Connect を利用して Heroku Postgres 上のデータを外部オブジェクトとして定義した場合に、そのデータを Apex からどのようにクエリするかを示すサンプルコードを紹介します。
前提として、「HerokuOrders__x」という API 参照名の外部オブジェクトが設定済みであるとします。このオブジェクトは Heroku Postgres の注文履歴テーブルにマッピングされています。外部オブジェクトの API 参照名には `__x` というサフィックスが付与されるのが特徴です。

このコードは、指定された顧客 ID に紐づく注文履歴を Heroku からリアルタイムで取得するものです。

// Salesforce Developer Document からの公式なアプローチに基づいています。
// 外部オブジェクトへのクエリは、通常の sObject へのクエリと非常に似た構文を使用します。

public class HerokuOrderService {

    /**
     * @description 指定されたAccountIdに紐づく注文履歴をHeroku上の外部オブジェクトから取得します。
     * @param accountId Salesforceの取引先ID
     * @return List<HerokuOrders__x> 外部オブジェクトのレコードリスト
     */
    public static List<HerokuOrders__x> getOrdersFromHeroku(Id accountId) {
        
        // 外部オブジェクトに対するSOQLクエリ
        // 構文は標準/カスタムオブジェクトに対するものとほぼ同じです。
        // HerokuOrders__x が外部オブジェクトのAPI参照名です。末尾の「__x」に注意してください。
        // ここでは、外部オブジェクト上に `AccountId__c` という項目が存在し、
        // Salesforceの取引先IDとリレーションが設定されていると仮定します。
        List<HerokuOrders__x> externalOrders = new List<HerokuOrders__x>();

        try {
            externalOrders = [
                SELECT Id, OrderNumber__c, OrderDate__c, TotalAmount__c, Status__c
                FROM HerokuOrders__x
                WHERE AccountId__c = :accountId
                ORDER BY OrderDate__c DESC
                LIMIT 100
            ];

            // 取得したデータをログに出力
            for(HerokuOrders__x order : externalOrders) {
                System.debug('Heroku Order Found: ' + order.OrderNumber__c + ' on ' + order.OrderDate__c);
            }

        } catch (Exception e) {
            // 外部データソースへの接続エラーやタイムアウトなど、
            // 外部オブジェクト固有のエラーをキャッチします。
            System.debug('Error querying external object: ' + e.getMessage());
            // 実際のプロジェクトでは、より堅牢なエラーハンドリングを実装します。
            // 例: エラーログオブジェクトへの記録、管理者に通知など
        }
        
        return externalOrders;
    }
}

上記のコードは、`developer.salesforce.com` で示されている外部オブジェクトの取り扱い方法に準拠しています。ポイントは、SOQL クエリの構文が通常のオブジェクトとほぼ同じである点です。これにより、開発者は外部データの取得を透過的に行うことができます。


注意事項

Salesforce と Heroku の連携を設計・実装する際には、以下の点に注意が必要です。

API 制限

Heroku Connect は Salesforce の API を消費します。特に初期同期や大量のデータ更新時には多くの API コールを消費する可能性があります。Salesforce 組織の API 使用状況を「組織情報」や API イベント監視機能で定期的に確認し、上限に達しないように計画的に利用することが重要です。必要であれば、API コール数の上限緩和を Salesforce に申請することも検討します。

データの一貫性とレイテンシ

Heroku Connect はポーリングベースのため、データが同期されるまでには数分のタイムラグが発生します。このレイテンシがビジネス要件に影響を与えないか、事前に確認が必要です。厳密なリアルタイム性が求められる場合は、API を直接呼び出すカスタムインテグレーションや、Platform Events を利用したイベント駆動型アーキテクチャを検討する必要があります。

Salesforce Connect の制限

Salesforce Connect を利用した外部オブジェクトにはいくつかの制限があります。

  • SOQL の制限: `COUNT()` のような集計関数や `GROUP BY` 句は使用できません。複雑なクエリは実行できない場合があります。
  • レポートとダッシュボード: 外部オブジェクトを主オブジェクトとするレポートの作成には制限があります。
  • 数式項目: 外部オブジェクトの数式項目で、Salesforce の標準・カスタムオブジェクトの項目を直接参照することはできません。
  • パフォーマンス: 外部システムの応答速度が Salesforce の UI パフォーマンスに直接影響します。Heroku 側の OData エンドポイントのパフォーマンスチューニングが不可欠です。

エラーハンドリング

Heroku Connect の同期エラー(例:Salesforce の入力規則違反、必須項目が NULL)は、Heroku Connect のダッシュボードで確認できます。これらのエラーを定期的に監視し、解決するための運用プロセスを確立しておくことが重要です。カスタムインテグレーションを構築する場合は、API コールの失敗に備えて、リトライ処理やエラー通知の仕組みを Apex や Heroku アプリケーション内に実装する必要があります。


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

Salesforce と Heroku の連携は、Salesforce プラットフォームの可能性を飛躍的に高める強力なソリューションです。統合エンジニアとして成功の鍵を握るのは、ビジネス要件に最適な連携パターンを選択することです。

ベストプラクティス:

  1. 適切なツールの選択:
    • データを Heroku 側に「複製」してアプリケーションで自由に利用したい場合は Heroku Connect を選択します。データ処理のパフォーマンスが向上し、開発が容易になります。
    • Salesforce 上にデータを保持せず、外部の最新データを「参照」したい場合は Salesforce Connect を選択します。ストレージの節約とデータの一元管理に繋がります。
  2. 同期対象の最小化: Heroku Connect を使用する際は、本当に必要なオブジェクトと項目のみを同期対象とします。不要なデータを同期すると、API コール数の消費、Postgres のストレージコストの増大、同期パフォーマンスの低下を招きます。
  3. 外部 ID (External ID) の活用: Heroku 側で生成されたユニークな ID を Salesforce の「外部 ID」項目にマッピングすることで、双方向同期の際のレコード特定が確実になり、データの整合性が向上します。
  4. 監視とアラートの徹底: Heroku Connect の同期ステータスや Salesforce の API 使用状況を常に監視し、異常が発生した際に即座に管理者に通知する仕組みを構築することが、安定したシステム運用のために不可欠です。
  5. セキュリティの考慮: Heroku から Salesforce API への接続には、Named Credentials (指定ログイン情報) と OAuth 2.0 を利用して、セキュアな認証・認可プロセスを確立します。認証情報をコードにハードコーディングすることは絶対に避けてください。

これらの原理とベストプラクティスを理解することで、Salesforce と Heroku を組み合わせた、スケーラブルで堅牢、かつ柔軟なエンタープライズアプリケーションアーキテクチャを構築することが可能になります。

コメント