Salesforce開発者向けガイド:Herokuを活用したカスタムアプリケーションの構築と連携

背景と応用シナリオ

Salesforce 開発者として、私たちは日々 Apex、Visualforce、Lightning Web Components (LWC) を駆使して、Salesforce プラットフォーム上で堅牢なビジネスソリューションを構築しています。しかし、プロジェクトの要件がプラットフォームの標準機能やガバナ制限を超える場合があります。例えば、以下のようなシナリオに直面したことはないでしょうか?

・大量のデータを扱う消費者向けアプリケーション: 何百万ものユーザーが利用する e コマースサイトや、高トラフィックな Web ポータルを構築する場合、Salesforce のマルチテナント環境のガバナ制限(特に CPU 時間やヒープサイズ)がボトルネックになる可能性があります。

・特定のプログラミング言語やフレームワークの使用: 機械学習のために Python を使いたい、リアルタイム通信のために Node.js の WebSocket を活用したい、あるいは既存の Java 資産を活かしたいといった、Apex 以外の言語での開発が求められるケース。

・複雑な長時間バッチ処理: Apex の非同期処理の上限を超える、夜間の大規模なデータ集計や外部システムとの連携処理。

このような課題に対する強力なソリューションが Heroku (ヘロク) です。Heroku は Salesforce が提供する PaaS (Platform as a Service) であり、開発者がインフラの管理を気にすることなく、アプリケーションの開発とデプロイに集中できる環境を提供します。Salesforce 開発者にとって、Heroku は Salesforce プラットフォームの能力を拡張し、より柔軟でスケーラブルなカスタムアプリケーションを構築するための「第二の故郷」のような存在です。


原理説明

Heroku が Salesforce とシームレスに連携できる理由は、そのアーキテクチャと、特に Heroku Connect (Heroku コネクト) という強力なアドオンにあります。

Heroku の基本概念

Heroku はアプリケーションを Dyno (ダイノ) と呼ばれる軽量な Linux コンテナで実行します。開発者は Ruby, Node.js, Java, Python, Go といった好みの言語でアプリケーションを書き、Git を使って Heroku にデプロイします。Heroku は自動的にコードをビルドし、Dyno 上で実行可能な状態にしてくれます。スケーラビリティも非常に高く、コマンド一つで Dyno の数を増減させ、トラフィックの増減に柔軟に対応できます。

Heroku Connect によるデータ連携

Heroku を活用したアプリケーションの核心は、Salesforce とのデータ連携です。これを最も簡単かつ堅牢に実現するのが Heroku Connect です。

Heroku Connect は、Salesforce のオブジェクトと Heroku 上の Heroku Postgres (Heroku ポスグレス) データベースとの間で、双方向のデータ同期を自動的に行うサービスです。

その仕組みは以下の通りです:

1. マッピング設定: Heroku のダッシュボードから、同期したい Salesforce のオブジェクト(例:取引先、商談)と、Heroku Postgres データベース内のテーブルをマッピングします。どの項目を同期するか、同期の方向(Salesforce → Postgres、Postgres → Salesforce、または双方向)もここで設定します。

2. 自動同期: 設定が完了すると、Heroku Connect は Salesforce の API を利用して、定期的にデータの変更をポーリングし、差分を自動で同期します。これにより、Heroku Postgres データベースは常に Salesforce のデータの「ほぼリアルタイム」なコピーを持つことになります。

3. アプリケーションからの利用: Heroku 上で動作するあなたのアプリケーション(Node.js や Python など)は、Salesforce の API を直接呼び出す必要はありません。代わりに、標準的な SQL を使って Heroku Postgres データベースに対してデータの読み書きを行います。データベースへの変更は、Heroku Connect を通じて自動的に Salesforce に反映されます。

このアーキテクチャにより、開発者は使い慣れた言語とデータベース操作で開発を進めることができ、Salesforce の API 制限や複雑な連携ロジックを意識する必要が大幅に減少します。


示例代码

ここでは、Heroku Connect によって Salesforce の `Account` オブジェクトが同期されている Heroku Postgres データベースに、Node.js アプリケーションからアクセスするコード例を示します。Heroku Connect は、`salesforce` スキーマ内にテーブルを作成します(例:`salesforce.account`)。

この例では、`pg` という popular な PostgreSQL クライアントライブラリを使用します。

// Salesforce Developer ドキュメントの Heroku 連携サンプルを参考にしています。
// 'pg' ライブラリをインポートします。これは Node.js から PostgreSQL に接続するための標準的なライブラリです。
// 事前に `npm install pg` を実行しておく必要があります。
const { Pool } = require('pg');

// Heroku はデータベースの接続情報を `DATABASE_URL` という環境変数に自動で設定します。
// Pool オブジェクトは、この環境変数を使ってデータベースへの接続を管理します。
// SSL 接続が必須であり、Heroku が提供する Postgres はデフォルトでこれを要求します。
const pool = new Pool({
  connectionString: process.env.DATABASE_URL,
  ssl: {
    rejectUnauthorized: false
  }
});

// 非同期関数を定義して、取引先(Account)データを取得します。
async function getAccounts() {
  // データベース接続クライアントをプールから取得します。
  const client = await pool.connect();
  try {
    // Heroku Connect で同期された Account テーブル(salesforce.account)から
    // Name と Industry 項目を最大 20 件取得する SQL クエリを実行します。
    // Heroku Connect は通常 'salesforce.オブジェクト名' という形式でテーブルを作成します。
    const result = await client.query('SELECT name, industry FROM salesforce.account LIMIT 20');
    
    console.log('--- Fetched Accounts from Heroku Postgres ---');
    // 取得した結果をコンソールに出力します。
    result.rows.forEach(row => {
      console.log(`Account Name: ${row.name}, Industry: ${row.industry}`);
    });
    
    return result.rows;
  } catch (err) {
    // エラーが発生した場合は、コンソールにエラーメッセージを出力します。
    console.error('Error executing query', err.stack);
  } finally {
    // 処理が成功しても失敗しても、必ずデータベース接続を解放します。
    // これを忘れると、接続がプールに戻らず、いずれ接続が枯渇する原因となります。
    client.release();
  }
}

// 定義した関数を実行します。
getAccounts();

このコードは、Salesforce の API を一切呼び出していません。単純な SQL クエリを発行するだけで、Salesforce のデータを安全かつ効率的に取得できています。これが Heroku Connect の最大の利点です。


注意事項

Heroku と Salesforce を連携させる際には、いくつかの重要な点に注意する必要があります。

・Heroku Connect のプランと制限: Heroku Connect には複数の料金プランがあり、プランによって同期できる行数に上限があります。大規模なデータセットを扱う場合は、プロジェクト開始前に適切なプランを選定することが不可欠です。上限を超えると同期が停止するため、注意深く監視する必要があります。

・Salesforce API の消費: Heroku Connect はバックグラウンドで Salesforce の SOAP API や Bulk API を使用してデータを同期します。これは組織の API リクエスト制限を消費します。特にデータ量が多い場合や同期頻度が高い場合、API の消費量を監視し、他のインテグレーションとの競合を避けるように設計する必要があります。

・データの同期遅延: Heroku Connect の同期は「ほぼリアルタイム」であり、完全なリアルタイムではありません。データのポーリング間隔は通常数分です。そのため、アプリケーションの要件がミリ秒単位の即時性を求める場合は、Platform Events などのイベント駆動アーキテクチャを併用することを検討する必要があります。

・エラーハンドリング: Salesforce 側で入力規則やトリガがエラーを返した場合、Heroku Connect のデータ同期は失敗します。Heroku Connect のダッシュボードには、同期エラーを監視し、解決するためのインターフェースが用意されています。開発者は定期的にこのダッシュボードを確認し、データ不整合の原因となるエラーに迅速に対応する必要があります。

・セキュリティ: Heroku アプリケーションでは、データベースの接続情報などの機密情報をコードにハードコーディングしてはいけません。Heroku の Config Vars (設定変数) を使用して、これらの情報を安全に管理することがベストプラクティスです。上記のサンプルコードも `process.env.DATABASE_URL` を利用しており、このプラクティスに従っています。


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

Salesforce 開発者にとって、Heroku は Salesforce プラットフォームの機能を補完し、その可能性を大きく広げるための強力なツールです。ガバナ制限の回避、言語選択の自由度、スケーラビリティといったメリットは、特に大規模な顧客向けアプリケーションや複雑なデータ処理基盤を構築する際に絶大な効果を発揮します。

以下に、Heroku を活用する上でのベストプラクティスをまとめます。

1. 適切な役割分担を意識する: Salesforce は顧客データとビジネスロジックの中心(System of Record)として、Heroku は柔軟性とスケーラビリティが求められる顧客との接点(System of Engagement)やデータ処理層として、それぞれの強みを活かした役割分担を設計の初期段階で明確にしましょう。

2. データ連携はまず Heroku Connect を検討する: Salesforce とのデータ連携が必要な場合、カスタム API を自前で開発する前に、まず Heroku Connect の利用を検討してください。開発・運用コストを大幅に削減し、堅牢なデータ同期基盤を迅速に構築できます。

3. Heroku Pipelines を活用した CI/CD: Salesforce の Sandbox 開発と同様に、Heroku にも Pipelines (パイプライン) という機能があります。これを利用して、`development` (開発) -> `staging` (ステージング) -> `production` (本番) といった環境を構築し、CI/CD ツールと連携させることで、アプリケーションの品質とデプロイの効率を向上させることができます。

4. アドオンを積極的に活用する: Heroku のエコシステムには、Heroku Postgres や Heroku Connect 以外にも、ログ監視、キャッシュ、検索エンジンなど、多種多様なアドオンが存在します。これらを活用することで、インフラ構築の手間を省き、アプリケーションの機能開発に集中できます。

Salesforce プラットフォームの知識に加えて Heroku を習得することで、Salesforce 開発者としての価値は飛躍的に高まります。ぜひ次のプロジェクトで、この強力なプラットフォームの活用を検討してみてください。

コメント