Heroku と Salesforce プラットフォームを統合する
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2021年08月31日(火)
Table of Contents
Heroku と Salesforce プラットフォームは複数の方法で統合でき、複数の方法から選択することにより、要件とそれぞれの統合タイプの機能を理解することができます。
この記事では、各タイプの統合について、かなり高度な内容を説明し、それぞれのメリットとデメリットの概要も説明します。また、統合の実装に役立つドキュメントも示します。
概要
手法 | 説明 | どのような場合に使用するか |
---|---|---|
Heroku Connect | Salesforce 組織のデータと Heroku Postgres リレーショナルデータベースのデータの双方向同期。 | 最終的な一貫性が保証されるように Heroku アプリからアクセス可能なデータベースと一方向または双方向の同期を行いたい場合。 |
Salesforce Platform Events | Heroku アプリで Salesforce 上にイベントを作成したり、Salesforce から公開されたイベントに登録したりできるようにするイベントバス統合。 | 最新の高スループットかつ低レイテンシーの Salesforce のエンタープライズメッセージングプラットフォームとの統合を使用した Heroku アプリを構築したい場合。 |
Apex とワークフローのコールアウト | Heroku アプリとして作成された API があり、Apex ワークフローまたはトリガーからエンドポイントを呼び出すことができます。 | Salesforce 組織でのオブジェクトアップデートに基づく REST API 統合を行いたい場合。 |
Salesforce の REST API の呼び出し | Heroku アプリ内から Salesforce の REST API を呼び出します。 | Salesforce 組織のデータ以外のものにもアクセスする必要がある場合。たとえば、プログラムで承認プロセスを開始したい場合など。 |
Heroku External Objects と Salesforce Connect | Heroku Connect の一部として、Heroku Postgres のデータが Salesforce 組織内で利用できるようになり、そのデータの表示、検索、ほかのオブジェクトとの関連付けを行うことができます。 | 物理的にデータをコピーするなど非効率な処理を行わずに、状況に応じて Heroku Postgres に格納されているデータを Salesforce 組織から参照したい場合。 |
MuleSoft | API を使用した異種エンタープライズシステムの統合、API の設計、および API のサービスとライフサイクルの管理を行うための iPaaS (Integration Platform as a Service) およびマーケットプレース。 | 異種 API 統合を構築するためのマネージドプラットフォームを使用し、それらの統合に Heroku アプリから接続したい場合。 |
Heroku Connect
Heroku Connect は、Salesforce オブジェクトと Heroku アプリケーションにアタッチされている Heroku Postgres データベースとの間でデータを同期するアドオンです。シンプルな宣言型インターフェースを使用して、どの Salesforce オブジェクトをどの Postgres テーブルと同期するかを決定して、オブジェクトのフィールドをテーブルの列にマッピングします。その後、Heroku Connect によって継続的に (同期の方向に応じて) Salesforce 組織とテーブルが監視され、必要に応じてオブジェクトや行が作成されます。
どのような場合に使用するか
Heroku Connect では、純粋なデータ統合が行われます。つまり、オブジェクトとテーブルのデータが同期されます。このアーキテクチャは、Heroku アプリケーションでデータの保存または操作を行う、多くのシナリオで役立ちます。たとえば、同じ Heroku Postgres データベースに同期する 1 つ以上の Salesforce 組織があり、分析、請求書の生成、ほかのサービスの検索といった操作を定期的に実行するとします。そのような場合に、これらのアクションの出力によって、必要に応じて、既存のデータベース行を変更したり、Salesforce に同期される別のテーブルに新しい行を生成したりすることができます。
データが Salesforce に同期されるときに特定のアクションが実行されるようにするために、Salesforce でトリガーを作成することができます。たとえば、Heroku から Salesforce に同期されるレコードによって、承認キューの操作を開始することなどができます。
Heroku アプリを作成する場合や、すでに Heroku Postgres にデータがある場合、Heroku と Salesforce の統合には Heroku Connect が適しています。
制限と考慮事項
Heroku Connect のデータ同期は、Salesforce API の制限にはカウントされません。
Heroku Connect とサポートされているオブジェクトのドキュメントに、その他の制限 (オブジェクトのサブセットを同期できないこと、base64 エンコードフィールドなど) が記載されています。
デフォルトで、Heroku Connect では、変更を同期するために 10 分おきに Salesforce 組織へのポーリングを行います。一部のオブジェクトに対する加速ポーリングも提供しています。
詳細
- 開始するには、Heroku Connect のドキュメントを参照してください。
Salesforce Platform Events
Salesforce のエンタープライズメッセージングプラットフォームで、イベント駆動型アプローチを使用してアプリを設計できます。プラットフォームイベント には、Salesforce アプリ内の内部コンポーネントを統合したり、Salesforce アプリ内の内部コンポーネントを Heroku アプリなどの外部システムと統合したりするための強力なテクニックが用意されています。イベントプロデューサーとイベントコンシューマーが分離され、接続されたシステムでの通信モデルが簡略化されるため、このアーキテクチャは大規模な分散システムに向いています。
Heroku アプリケーションは、イベントプロデューサー、イベントコンシューマー、またはこの 2 つのいくつかの組み合わせとして動作できます。
Heroku からのプラットフォームイベントの公開
イベントの公開は、下記で説明する Salesforce の REST API を呼び出すことで実行できます。実際は、Heroku アプリケーションで
/services/data/v43.0/sobjects/Event_Name__e/
のようなコードを使用して、イベントを表す sObject を作成して適切なエンドポイントに POST します。
Node.js 用の JSforce のような Salesforce API クライアントライブラリを使用して、次のようなコードを作成してイベント (この場合は Flight_Approved
イベント) を公開します。
// Establish an authenticated Salesforce connection. (Details elided)
const conn = new jsforce.Connection({ … });
const eventData = {
Flight_Id__c: id,
Confirmation_Number__c: confirmationNumber
};
conn.sobject('Flight_Approved__e').create(eventData, (err, res) => {
if (err) {
console.error(err);
} else {
console.log("Event published");
}
});
プラットフォームイベントの登録
Heroku アプリでは、CometD プロトコルを使用してイベントを登録できます。 Salesforce は、受信した順番で ComeD クライアントにプラットフォームイベントを送信します。イベント通知の順番は、イベントの replay ID に基づきます。
たとえば、Node.js アプリでは、JSforce モジュールを使用して、replay での登録を構成できます。
// Establish an authenticated Salesforce connection. (Details elided)
const conn = new jsforce.Connection({ … });
const channel = "/event/Flight_Approved__e";
const replayId = -2; // -2 is all retained events
const replayExt = new jsforce.StreamingExtension.Replay(channel, replayId);
const fayeClient = conn.streaming.createClient([ replayExt ]);
const subscription = fayeClient.subscribe(channel, data => {
console.log('Received Flight Approved Event', data);
});
どのような場合に使用するか
Salesforce のエンタープライズメッセージングプラットフォームとの最新鋭の統合を構築したい場合。このメッセージングプラットフォームでは、ポイントツーポイントの統合ではなく、メッセージングバスを使用する、統合の境界がはっきりしたモジュール式の統合を構築できます。
制限と考慮事項
プラットフォームイベントを作成するときの考慮事項 (トリガーの無限ループの回避、API の制限などを含む) が記載されている Salesforce のドキュメントを参照してください。
「セキュリティと Heroku/Salesforce の統合」に、この統合を保護する方法が示されています。
詳細
- 「Platform Events Developer Guide (プラットフォームイベント開発者ガイド)」
- 「Salesforce API によるイベントメッセージの公開」
- 「CometD によるプラットフォームイベント通知の登録」
- Node.js および Ruby 用の Faye モジュール
Salesforce の REST API の呼び出し
Salesforce プラットフォームには、Heroku アプリケーションから呼び出すことができる包括的な REST API が用意されています。この API では、OAuth 2.0 またはセッション ID による認証を使用でき、Object Metadata の照会、レコードの作成または編集、SOQL/SOSL クエリの実行、および承認プロセスとの対話処理を行うことができます。
Node.js 用の nforce または JSForce などのコミュニティライブラリでは、API を起動するための便利なラッパーを提供できます。 このようなライブラリは、ほとんどの言語で使用できます。 クライアントが認証されたら、次のようにして SOQL クエリを実行し、オブジェクトを更新します。
var q = 'SELECT Id, Name, CreatedDate, BillingCity FROM Account WHERE Name = "Spiffy Cleaners" LIMIT 1';
org.query({ query: q }, function(err, resp){
if(!err && resp.records) {
var acc = resp.records[0];
acc.set('Name', 'Really Spiffy Cleaners');
acc.set('Industry', 'Cleaners');
org.update({ sobject: acc, oauth: oauth }, function(err, resp){
if(!err) console.log('It worked!');
});
}
});
どのような場合に使用するか
単なるデータ統合以上の統合が必要なシナリオで REST API を使用する場合。REST API を使用した、比較的低レベルの統合を構築できるようにしておく必要がありますが、その後は、API により Salesforce 上でかなりの数のアクションを実行できます。
制限と考慮事項
API のドキュメントの「実装に関する考慮事項」を参照してください。このドキュメントには、同時 API リクエストの制限、ライセンスタイプ別の API 呼び出し、1 日あたりの API 呼び出しなどの概要が示されています。
「セキュリティと Heroku/Salesforce の統合」に、この統合を保護する方法が示されています。
詳細
Apex とワークフローのコールアウト
Salesforce でのアクティビティに基づいて API で Heroku アプリ内の呼び出しを行うには、主に 2 つの方法があります。
- プログラムで REST 呼び出しを行うための Apex HTTP コールアウト。
- 宣言で SOAP 呼び出しを行うためのワークフローアウトバウンドメッセージ。
いずれの場合も、Heroku アプリはイベント詳細ペイロードを使用してリクエストを受信して、アクションを実行します。
Apex HTTP コールアウト
Apex コールアウトを使用すると、Apex を外部サービス (この場合は Heroku で実行中のアプリ) と緊密に統合できます。Apex には、オブジェクトを JSON にシリアライズし、非同期的に HTTP エンドポイントを呼び出す機能があります。たとえば、次に示すのはオブジェクトをシリアライズして非同期的にデータを Heroku エンドポイントに POST できるヘルパークラスです。
public class Helper {
public static String jsonContent(List<Object> triggerNew) {
String newObjects = '[]';
if (triggerNew != null) {
newObjects = JSON.serialize(triggerNew);
}
String content = '{"new": ' + newObjects}';
return content;
}
@future(callout=true) public static void callout(String url, String content) {
Http h = new Http();
HttpRequest req = new HttpRequest();
req.setEndpoint(url);
req.setMethod('POST');
req.setHeader('Content-Type', 'application/json');
req.setBody(content);
h.send(req);
}
}
その後、必要に応じて (おそらくトリガーにアタッチされている) そのメソッドを起動できます。
trigger NewContactHerokuTrigger on Contact (after insert) {
String endpoint = 'https://foo.herokuapp.com/api/action';
String content = Helper.jsonContent(Trigger.new);
Helper.callout(url, content);
}
Heroku アプリケーションが同じ API エンドポイントでリッスンするようにし、HTTP POST 受信時の適切なアクションを実装するようにしてください。 追加でセッション ID を送信して、Heroku アプリが Salesforce の REST API を使用して Salesforce 内の呼び出しを行うようにできます。
アウトバウンドメッセージ
アウトバウンドメッセージを使用すると、指定したフィールドセットが変更されるたびに Heroku アプリなどの指定された外部アプリケーションエンドポイントに自動的にメッセージが (フィールド値と一緒に) 送信されるように Salesforce を構成できます。アウトバウンドメッセージは、Salesforce のワークフロールール機能の一部です。ワークフロールールは特定の種類のフィールド変更を監視し、メール通知の送信、タスクレコードの作成、アウトバンドメッセージの送信などの Salesforce の自動アクションをトリガーします。
ワークフローで、宣言的にルールと外部システムへのコールアウトを定義します。ルールは Salesforce のオブジェクトに接続できます。
どのような場合に使用するか
Salesforce から Heroku 内の呼び出しを行うこの方法では、デバッグを行うのが若干難しくなり、本番環境で Apex コードを使用して Heroku 上のエンドポイントを緊密に結び付けます。よりスケーラブルで弾性力のある統合には、Salesforce Platform Eventsを使用することをお勧めします。
制限と考慮事項
ここに記載されているシナリオの多くは Salesforce の制限に影響するので、API の制限に注意してください (たとえば、Apex トリガーには CPU 時間の制限があり、統合を始動できる頻度に影響します)。
「セキュリティと Heroku/Salesforce の統合」に、この統合を保護する方法が示されています。
詳細
- 「Apex 開発者ガイド」の「Apex を使用したコールアウトの呼び出し」を参照してください。
- 「SOAP API 開発者ガイド」の「アウトバウンドメッセージの設定」を参照してください。
Heroku External Objects と Salesforce Connect
Heroku External Objects は、Heroku Connect の一部として使用可能です。Heroku External Objects には、Heroku Connect で使用するように構成されている Heroku Postgres データベースの oData ラッパーが用意されています。この機能を使用すると、ラッパーによって生成される RESTful エンドポイントを使用して、ほかの Web サービスで、指定された Heroku Postgres データベース内からデータを取得することができます。読み取り / 書き込みサポートはテーブルでのみ使用可能です。ビューへの書き込みは現在サポートされていません。
Salesforce Connect と合わせて使用すると、Heroku Postgres データベースのデータを Salesforce のデプロイで提示することが許可され、データの表示 (Apex および Visualforce のページ内からを含む)、検索、ほかのオブジェクトとの関連付けができます。データは参照によって使用可能なため、標準レポートでは使用できません。
どのような場合に使用するか
物理的にデータをコピーするなど非効率かつレイテンシーが必要となる処理を行わずに、状況に応じて Heroku Postgres に格納されているデータを Salesforce 組織から参照したい場合。 この方法は、データが小さいチャンクで読み書きされる場合、およびデータのコピーが本質的に適切でない場合 (たとえば、CRM へのデバイスのログ記録など) に最も役立ちます。
制限と考慮事項
検索やクエリは最適化されないため、複雑なユースケースの場合、パフォーマンスを改善するには Postgres のインデックスを管理する必要があります。
制限とボリュームについての詳細は、「OData コールアウトのレート制限に関する考慮事項」および Heroku External Objects のレート制限を参照してください。
詳細
「Salesforce Connect を使用する Heroku External Objects」」を参照してください。
MuleSoft
MuleSoft は、複雑なマルチシステム統合を作成したり、API の完全なライフサイクルを管理したりするための統合 PaaS です。MuleSoft ではバックエンドのシステムとプロセスの複雑さが抽象化され、スケーラブルで管理しやすい API でフロントエンド化されるので、それを Heroku アプリ内から起動することができます。
MuleSoft には、以下の機能があります。
- 何百ものシステム (Salesforce、SAP、オンプレミスのデータベースを含む) に対する迅速な統合のための、あらかじめ作成済みのコネクター
- 迅速なワークフローオートメーションのための統合テンプレートとコンポーネント
- API の完全なライフサイクル管理
- 統合分析と管理ツール
API を組み合わせたり、独自の API を作成して、Heroku アプリケーションで使用することもできます。
どのような場合に使用するか
外部システムと統合する必要がある Heroku アプリケーションを作成していて、基盤となる生の API 自体に対して直接作成したい場合、またはあらかじめ作成済みのコネクター、サイクル管理、管理ツールなどの追加機能を使用したい場合。
Salesforce とのみの統合を構築している場合は、Heroku Connect (データ統合のみ必要な場合) または Salesforce Platform Events (それ以上の機能が必要な場合) を使用することをお勧めします。
制限と考慮事項
MuleSoft プラットフォームの管理ができるようにしておいてください。Salesforce との MuleSoft の統合は、API の制限にカウントされます。
詳細
- MuleSoft の Anypoint Platform のドキュメント。
- MuleSoft コネクターのリスト。
- MuleSoft の Salesforce Connector のドキュメント。
セキュリティと Heroku/Salesforce の統合
Heroku と Salesforce を一緒に使用する場合 (特に Salesforce の REST API の呼び出し、Salesforce Platform Events、Apex HTTP コールアウトを使用するシナリオの場合)、排他的な信頼関係によってセキュリティの状態が改善され、公衆インターネットからの望ましくないトラフィックを防ぐことができる可能性があります。
特に、Private Space で Heroku アプリケーションを実行する場合は、次のことが可能です。
- アプリを公衆インターネット上で利用できないようにし、Salesforce 組織からのみ使用できるようにする (Salesforce → Heroku)
- パブリックアクセスを防ぐため、および OAuth エンドポイントのパブリックアクセスを防ぐために、Salesforce 組織に IP 制限が適用されるようにする (Heroku → Salesforce)。
「Establishing a Connection Between Private Spaces and Salesforce (Private Space と Salesforce 間で信頼接続を確立する)」を参照してください。