この文章は Salesforce 機械翻訳システムを使用して翻訳されました。詳細はこちらをご参照ください。
英語に切り替える

リモートコールイン

コンテキスト

Salesforce を使用して、リードの追跡、パイプラインの管理、商談の作成、リードを顧客に変換する注文詳細の取得を行っています。ただし、Salesforce システムでは注文の保存や処理は行っていません。注文は外部 (リモート) システムによって管理されています。リモートシステムは、注文が処理フェーズで渡されると、Salesforce の注文状況を更新する必要があります。

問題

リモートシステムはどのように Salesforce に接続して認証され、既存のレコードを更新するのか?

検討項目

このパターンに基づいてソリューションを適用する場合、次のようなさまざまな項目を検討する必要があります。
  • Salesforce へのコールでは、リモートプロセスが応答を待機してから処理を続行する必要があるか? リモートプロセスは、非同期コールのシミュレーションに必要なければ応答を破棄できますが、Salesforce へのリモートコールは常に同期された要求-返信です。
  • メッセージ形式はどれか (たとえば、SOAP、REST、SOAP over HTTP、REST over HTTP など) ?
  • メッセージサイズは比較的小さいか、大きいか?
  • SOAP 対応のリモートシステムの場合、リモートシステムは、Salesforce が契約を指示するコントラクトファースト手法で参加できるか? これは、事前定義された WSDL が提供される、標準 Web サービス API を使用する場合は必須です。
  • トランザクション処理は必須か?
  • Salesforce アプリケーションのカスタマイズ耐性はどの程度か?

ソリューション

次の表は、このインテグレーションに関する問題へのさまざまなソリューションの一覧です。
ソリューション 適合度 コメント
SOAP API 最適
  • アクセス性Salesforce が提供する SOAP API を使用してリモートシステムは以下の操作を実行できます。
    • 組織内のデータのクエリ
    • データの追加、更新、削除
    • 組織のメタデータの取得
    • 管理タスク実行のためのユーティリティの実行
  • 同期 API — API コールが行われた後、リモートクライアントアプリケーションはサービスから応答を受信するまで待機します。Salesforce への非同期コールはサポートされていません。
  • 生成された WSDLSalesforce では、リモートシステムに 2 つの WSDL を使用できます。
    • Enterprise WSDL — Salesforce 組織に固有の強く型付けされた WSDL を使用できます。
    • Partner WSDL — Salesforce 組織に固有ではない、緩やかに型付けされた WSDL を使用できます。
  • セキュリティSOAP API を実行するクライアントは、有効なログイン情報を持ち、API コールを実行するためのセッションを取得する必要があります。API は、ログインユーザのプロファイルに基づいてアプリケーションに設定されたオブジェクトレベルおよび項目レベルのセキュリティを反映します。
  • トランザクション/コミット動作 — デフォルトでは、各 API コールは、一部のレコードがエラーとマークされた場合に部分的な成功を許容します。これを「オールオアナッシング」動作に変更して、エラーが発生したらすべての結果をロールバックすることができます。複数の API コールにまたがってトランザクションを実行することはできません。この制限を打開するために、1 つの API で複数のオブジェクトに影響を与えることができます。
  • 大量データ — 大量データ (500,000 件を超えるレコード) 操作の場合、REST ベースの Bulk API を使用します。
REST API 最適
  • アクセス性Salesforce が提供する REST API を使用してリモートシステムは以下の操作を実行できます。
    • 組織内のデータのクエリ
    • データの追加、更新、削除
    • 組織のメタデータの取得
    • 管理タスク実行のためのユーティリティの実行
  • 同期 API — API コールが行われた後、リモートクライアントアプリケーションはサービスから応答を受信するまで待機します。Salesforce への非同期コールはサポートされていません。
  • REST APISOAP API の比較 — REST はリソース (エンティティ/オブジェクト) を URI として公開し、HTTP 動詞を使用してこれらのリソースに対する CRUD 操作を定義します。SOAP とは異なり、REST API では、事前定義した契約は不要で、応答には XML と JSON を利用し、緩やかな型付けを使用します。REST API は軽量であり、Salesforce との相互作用のための単純な方法を提供します。インテグレーションおよび開発が容易という利点があり、モバイルアプリケーションおよび Web 2.0 プロジェクトで使用するためには最適な選択です。
  • セキュリティREST API を実行するクライアントは、有効なログイン情報を持ち、API コールを実行するためのセッションを取得する必要があります。API は、ログインユーザのプロファイルに基づいてアプリケーションに設定されたオブジェクトレベルおよび項目レベルのセキュリティを反映します。
  • トランザクション/コミット動作 — デフォルトでは、各レコードは、個別のトランザクションとして扱われ、個別にコミットされます。1 つのレコード変更が失敗しても、他のレコード変更はロールバックされません。これを「オールオアナッシング」動作に変更できます。
  • 大量データ — 大量データ (500,000 件を超えるレコード) 操作の場合、REST ベースの Bulk API を使用します。
Apex Web サービス 準最適 Apex クラスメソッドは、外部のアプリケーションに Web サービメソッドとして公開できます。これは SOAP API に代わる選択肢であり、通常は、次の追加要件を満たす必要がある場合に使用されます。
  • 完全なトランザクションサポートが必要である (たとえば、取引先、取引先責任者、および商談をすべて 1 つのトランザクションで作成する場合など)。
  • コミットする前に、カスタムロジックを Salesforce 側で適用する必要がある。

Apex Web サービスを使用する利点と、Salesforce でメンテナンスが必要な追加コードを比較して評価する必要があります。

Apex REST サービス 準最適 Apex クラスは、それに対して定義された HTTP 動詞 (POST や GET など) を使用して特定の URI に対応付けられた REST リソースとして公開できます。

SOAP とは異なり、クライアントがサービス定義/契約 (WSDL) をコンシュームしてクライアントスタブを生成する必要はありません。リモートシステムには、HTTP 要求を作成して、返された結果 (XML または JSON) を処理する機能のみが必要です。

Bulk API バッチに最適 Bulk API は、REST 規則に基づいており、大規模データセットの読み込みまたは削除用に最適化されています。アクセス性とセキュリティ動作は、REST API と同じです。

Bulk API では、クライアントアプリケーションは、複数のバッチを送信し、そのバッチが Salesforce によりバックグラウンドで処理されることで、大量のレコードをクエリ、挿入、更新、更新/挿入、削除できます。対照的に、SOAP API は、一度に少数のレコードを更新するリアルタイムのクライアントアプリケーション用に最適化されています。

SOAP API を使用しても多数のレコードを処理することはできますが、数百から、数千、数百万のレコードがデータセットに含まれている場合には実用性に欠けます。これは、比較的オーバーヘッドが高く、パフォーマンスが低いという特性のためです。

概要図

次の図は、SOAP API を使用してこのパターンを実装する場合のイベントの順序を示します。イベントの順序は、REST API を使用する場合と同じです。

リモートプロセスの呼び出し - 状態追跡パターン

結果

このパターンに関連するソリューションの適用では、次の操作が可能です。
  • リモートシステムが Salesforce API をコールして、データベースをクエリし、単独のオブジェクト操作 (作成、更新、削除など) を実行する。
  • リモートシステムが、複数オブジェクトのトランザクション操作とカスタムの処理前/後ロジックをサポートできるように作成されたカスタム Salesforce API (サービス) をコールする。

コールメカニズム

コールメカニズムは、このパターンを実装するために選択されるソリューションに応じて異なります。
コールメカニズム 説明
SOAP API リモートシステムは Salesforce Enterprise または Partner WSDL を使用してクライアントスタブを生成します。このスタブは標準 SOAP API の呼び出しに使用されます。
REST API リモートシステムは、Apex REST サービスにアクセスする前に認証を行う必要があります。リモートシステムでは、OAuth 2.0 またはユーザ名/パスワード認証を使用できます。いずれの場合も、クライアントは認証 HTTP ヘッダーと適切な値 (SOAP API へのログインコール経由で OAuth アクセストークンまたはセッション ID を取得可能) を設定する必要があります。

次に、リモートシステムは、適切な動詞で REST 呼び出し (HTTP 要求) を生成し、返された結果 (JSON および XML データ形式がサポート対象) を処理します。

Apex Web サービス リモートシステムはカスタム Apex Web サービス WSDL をコンシュームしてクライアントスタブを生成します。このスタブはカスタム Apex Web サービスの呼び出しに使用されます。
Apex REST サービス REST API のように、リソース URI と該当する動詞は、@RestResource@HttpGet、および @HttpPost アノテーションを使用して定義されます。
Bulk API Bulk API は、REST ベースの API であるため、コールメカニズムは REST API と同じです。

エラー処理と回復

エラー処理および回復戦略は、全体的なソリューションの一部として検討する必要があります。

  • エラー処理 — すべてのリモートコールインメソッド、標準またはカスタムの API では、リモートシステムがタイムアウトや再試行の管理など後続で発生するエラーを処理する必要があります。ミドルウェアを使用して、エラー処理と回復のロジックを提供できます。
  • エラー回復 — サービス品質要件で定められている場合は、カスタムの再試行メカニズムを作成する必要があります。この場合、設計特性を冪等にすることが重要です。

冪等設計に関する考慮事項

冪等機能によって、呼び出しを繰り返しても安全で、悪影響がないことが保証されます。冪等性が実装されていない場合、同じメッセージを繰り返し呼び出すと異なる結果になり、レコードの重複作成、トランザクションの重複処理など、データ整合性に問題が生じる可能性があります。

リモートシステムは複数回の (重複した) コールを管理して、エラーやタイムアウトの場合は、重複挿入や冗長な更新などを回避する必要があります (特に下流のトリガやワークフロールールが起動する場合)。Salesforce 内でこうした状況を管理することは可能ですが (特にカスタム SOAP および REST サービスの場合)、リモートシステム (またはミドルウェア) でエラー処理と冪等設計を管理することをお勧めします。

セキュリティに関する考慮事項

適用されるセキュリティに関する考慮事項は、選択するパターンソリューションに応じて異なります。すべての場合で、プラットフォームはログインユーザのアクセス権 (プロファイル設定、共有ルール、権限セットなど) を使用します。さらに、プロファイル IP 制限を使用して、API へのアクセスを特定の IP アドレス範囲に制限できます。
ソリューション セキュリティに関する考慮事項
SOAP API Salesforce は、Secure Sockets Layer v3 (SSL) および Transport Layer Security (TLS) プロトコルをサポートします。暗号鍵の長さは、128 ビット以上でなければなりません。

リモートシステムがセッション ID を取得するには、有効なログイン情報を使用してログインする必要があります。リモートシステムにすでに有効なセッション ID がある場合は、明示的なログインなしで API をコールできます。これは、このドキュメントですでに説明したコールバックパターンで使用されます。このパターンでは、先行する Salesforce アウトバウンドメッセージに含まれているセッション ID とレコード ID が後続の作業で使用されます。

クライアントは、コールごとに新しいセッション ID を取得するのではなく、SOAP API キャッシュをコールし、セッション ID を再利用してパフォーマンスを最大化することをお勧めします。

REST API リモートシステムで認証用に OAuth の信頼を確立することをお勧めします。それによって、HTTP 動詞を使用して特定のリソースに対し REST コールを実行できます。また、他の手段で (たとえば、SOAP API をコールして取得、送信メッセージ経由で提供など) 取得された有効なセッション ID で REST コールを行うことも可能です。

クライアントは、コールごとに新しいセッション ID を取得するのではなく、REST API キャッシュをコールし、セッション ID を再利用してパフォーマンスを最大化することをお勧めします。

Apex Web サービス セキュリティに関する考慮事項は、SOAP API と同じです。
Apex REST サービス セキュリティに関する考慮事項は、REST API と同じです。
Bulk API セキュリティに関する考慮事項は、REST API と同じです。
セキュリティに関する考慮事項を参照してください。

補足

適時性

SOAP API および Apex Webサービス API は同期します。次のタイムアウトが適用されます。
  • セッションタイムアウト — Salesforce 組織のセッションタイムアウト設定に基づいて、アクティビティがない場合、セッションはタイムアウトします。
  • クエリタイムアウト — 各 SOQL クエリには、120 秒という個別のタイムアウト制限があります。

データ量

データ量に関する考慮事項は、選択するソリューションと通信の種類に応じて異なります。
ソリューション 通信の種類 制限
SOAP API または REST API 同期
  • ログイン — ログイン要求のサイズは、10 KB 未満に制限されています。
  • 作成、更新、��除 — リモートシステムが一度に作成、更新、または削除できるレコード数は最大 200 件です。複数回のコールを行えば合計 200 件を超えるレコードを処理できますが、要求ごとのサイズは 200 レコードに制限されています。
  • クエリ結果サイズ — デフォルトでは、query() または queryMore() コールで返される、クエリ結果オブジェクト内に返される行数 (バッチサイズ) は 500 に設定されています。返される行数がバッチサイズを上回る場合、queryMore() API コールを使用して複数のバッチを反復処理します。最大バッチサイズは 2,000 レコードです。ただし、追加のルールが適用される場合もあるため、詳細は、『Salesforce の制限クイックリファレンスガイド』を参照してください。
Bulk API 同期

Bulk API は、大規模なデータセットの非同期のインポートまたはエクスポート用に最適化されています。

Bulk API は、バッチ要求と関連データを送信するときは同期します。データの実際の処理は、バックグラウンドで非同期に行われます。API とバッチ処理制限の詳細は、「Bulk API の制限」を参照してください。

  • 24 時間あたりに送信可能なバッチ数は最大で 2,000 件に制限されています。

  • 1 つのバッチには、最大で 10,000 件のレコードを含めることができます。

エンドポイント機能と標準のサポート

エンドポイントの機能と標準のサポートは、選択するソリューションによって異なります。

ソリューション エンドポイントに関する考慮事項
SOAP API リモートシステムは、Salesforce で事前に定義されたメッセージ形式に基づいて Salesforce SOAP API をコールするクライアントを実装できなければなりません。

リモートシステム (クライアント) は、契約が Salesforce によって提供されるコントラクトファースト実装に参加する必要があります (Enterprise または Partner WSDL など)。

REST API リモートシステムは、Salesforce で定義された REST サービスを呼び出し、XML または JSON の結果を処理する REST クライアントを実装できなければなりません。
Apex Web サービス リモートシステムは、Salesforce で定義された、事前定義形式の SOAP メッセージを呼び出すクライアントを実装できなければなりません。

リモートシステム は、Apex Web サービスが実装された後に契約が Salesforce によって提供される、コードファースト実装に参加する必要があります。各 Apex Web サービスには独自の WSDL があります。

Apex REST サービス エンドポイントに関する考慮事項は、REST API と同じです。

状態管理

システムを統合するとき、継続的な状態追跡にキーは重要です。たとえば、レコードがリモートシステムで作成され、そのレコードへの継続的な更新をサポートする場合などです。2 つのオプションがあります。
  • Salesforce が、リモートシステムのリモートレコードの主キーまたは一意のサロゲートキーを保存する。
  • リモートーシステムが、Salesforce の一意のレコード ID または他の一意のサロゲートキーを保存する。

この同期パターンでインテグレーションキーを処理する場合に固有の考慮事項があります。

マスタシステム 説明
Salesforce このシナリオでは、リモートシステムは Salesforce RecordId またはその他の一意のサロゲートキーをレコードから保存する必要があります。
リモートシステム このシナリオでは、Salesforce が、リモートシステムの一意の識別子への参照を保存する必要があります。プロセスは同期するため、キーは、外部 ID 項目を使用した同じトランザクションの一部として指定できます。

複雑なインテグレーションシナリオ

このパターンでは、加工やプロセスオーケストレーションなどの複雑なインテグレーションシナリオを処理する場合、ソリューションごとに異なる考慮事項があります。
ソリューション 考慮事項
SOAP API または REST API SOAP APIREST API は、オブジェクトに対する単純なトランザクションを提供します。集約、オーケストレーション、加工など、複雑なインテグレーションシナリオは Salesforce では実行できません。これらのシナリオは、リモートシステムまたはミドルウェアで処理する必要がありますが、ミドルウェアをお勧めします。
Apex Web サービスまたは Apex REST サービス カスタム Web サービスでは、クロスオブジェクト機能、カスタムロジック、より複雑なトランザクションサポートを提供することができます。このソリューションは慎重に使用する必要があり、加工、オーケストレーション、エラー処理ロジックなどにミドルウェアが適しているか常に考慮する必要があります。

ガバナ制限

Salesforce プラットフォームは、マルチテナントという性質上、API を使用するときに制限があります。
ソリューション 制限
SOAP APIREST API、およびカスタム Apex API
  • API 要求制限Salesforce は、24 時間あたりの API コール数に制限を適用します。制限は、Salesforce のエディションの種類とライセンス数に基づきます。たとえば、Unlimited Edition では、24 時間あたり、Salesforce または Force.com ライセンスにつき、5,000 API 要求を使用できます。詳細は、『Salesforce の制限クイックリファレンスガイド』を参照してください。
  • API クエリカーソル制限 — ユーザは一度に最大 10 個のクエリカーソルを開くことができます。10 個を超えると、10 個のカーソルのうち最も古いものが解放されます。リモートアプリケーションが解放されたクエリカーソルを開こうとすると、エラーになります。たとえば、インテグレーションユーザログイン情報を共有する場合、最大クエリカーソル数を考慮する必要があります。ミドルウェアは、「ラウンドロビン」式に複数のユーザの要求を実行することが必要になる場合があります。
  • コール制限 — 作成、更新、およびクエリの制限については、補足の「データ量」を参照してください。
Bulk API 詳細は、補足の「データ量」を参照してください。

信頼できるメッセージング

信頼できるメッセージングは、個々のコンポーネント自体が信頼できない可能性がある場合、リモートシステムへのメッセージ配信保証の問題を解決しようとします。Salesforce SOAP API および REST API は同期し、信頼できるメッセージングプロトコル (WS-ReliableMessaging など) の明示的なサポートは提供しません。

リモートシステムに信頼できるメッセージングシステムを実装して、エラーとタイムアウトのシナリオを適切に管理することをお勧めします。

ミドルウェア機能

次の表は、このパターンに使用されるミドルウェアシステムの望ましいプロパティの一覧です。

プロパティ 必須 望ましい 不要
イベント処理 X
プロトコル変換 X
変換/加工 X
キューイングとバッファリング X
同期伝送プロトコル X
非同期伝送プロトコル X
仲介ルーティング X
プロセスコレオグラフィとサービスオーケストレーション X
トランザクション性 (暗号化、署名、信頼できる配信、トランザクション管理) X
ルーティング X
抽出、加工、読み込み (ETL) X (大量/バッチ)

ある印刷関連の消耗品とサービスを提供する企業が、Salesforce をフロントエンドとして使用して取引先と商談を管理しているとします。既存の取引先の商談は、クライアントサイトのプリンタを定期的に監視するオンプレミス型のプリンタ管理システム (PMS) からの印刷使用統計情報で更新されます。商談が作成されると、アウトバウンドメッセージが PMS に送信されて新規商談が登録されます。PMS は Salesforce ID を保存します (Salesforce が商談レコードのマスタ)。

次の制約が適用されます。
  • PMS はコントラクトファーストインテグレーションに参加できます。この場合、Salesforce が契約を提供し、PMS が Salesforce サービス (Enterprise または Partner WSDL 経由で定義) のクライアント (コンシューマ) として機能します。

  • Salesforce でのカスタム開発は行いません。

この例は、Salesforce SOAP API または REST API を使用して実装するのが最適です。

Salesforce で、次の処理を実行します。
  • Enterprise または Partner WSDL をダウンロードして、リモートシステムに提供します。
リモートシステムでは、次の処理を実行します。
  • Enterprise または Partner WSDL からクライアントスタブを作成します。

  • インテグレーションユーザ (または、セッション ID が初期アウトバウンドメッセージで提供されると想定して、レコードを作成した商談所有者) のログイン情報を使用して API にログインします。

  • アウトバウンドメッセージで提供された Salesforce レコード ID に対して更新操作をコールし、関連項目の更新 (使用統計情報) を渡します。

この例は、次の内容を説明しています。
  • Salesforce 同期 API クライアント (コンシューマ) の実装。

  • レコード更新のための Salesforce へのコールバック (前述の要求/返信アウトバウンドパターンと連携)。