Salesforce認定 Integrationアーキテクト 試験対策メモ②

Spring'23
[Salesforce認定 Integrationアーキテクト 試験対策メモ①](https://qiita.com/TaaaZyyy/items/8b62032466ae2b515b34)

参考リンク
- [インテグレーションのパターンと実践 | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.242.0.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_intro_overview.htm)
- [Data Integration | Salesforce Architects](https://architect.salesforce.com/decision-guides/data-integration)


# インテグレーションパターン

|#|インテグレーションパターン|レイヤ|タイミング|方向|データ量|
|-|-|-|-|-|-|
|1|リモートプロセスの呼び出し — 要求と返信|ビジネスロジック|同期|アウトバウンド|少量|
|2|リモートプロセスの呼び出し — ファイアアンドフォーゲット|ビジネスロジック|非同期|アウトバウンド||
|3|データの変更に基づく UI の更新||非同期|インバウンド||
|4|データ仮想化||同期|アウトバウンド||
|5|リモートコールイン|ビジネスロジック|同期・非同期|インバウンド||
|6|バッチデータの同期|データ|非同期|アウトバウンド・インバウンド|バルク|

## 1. リモートプロセスの呼び出し — 要求と返信[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_remote_process_invocation_state.htm)
- Salesforceから外部システムのAPIを主に同期的に実行する（ただし[継続](https://developer.salesforce.com/docs/component-library/documentation/ja-jp/57.0/lwc/lwc.apex_continuations)は非同期）。コールアウトでそのプロセスが完了するまで待機し、リモートシステムの応答に基づいて状態を追跡する。
- ソリューション
    - [拡張外部サービス](#12-拡張外部サービス)
        - プロトコルなど：OpenAPI 2.0またはOpenAPI 3.0 JSONスキーマ形式
    - [Apex REST 同期コールアウト](#9-コールアウト)
    - [Apex SOAP 同期コールアウト](#9-コールアウト)
- レジリエンス構築のための考慮事項
    - 回復：正当なレスポンスを受信するまでコミットしない。必要に応じて再試行する。
    - 適時性：タイムアウト最大120秒と、組織で5秒以上実行される同期トランザクションは10個までのガバナ制限に注意。
    - 状態管理：外部システムから返された一意のキーをSalesforceに保存する、またはSalesforceIDなど一意の値を外部システムに保存する。

## 2. リモートプロセスの呼び出し — ファイアアンドフォーゲット[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_remote_process_invocation_fire_forget.htm)
- Salesforceから外部システムへの呼び出しを非同期に実行する。コールアウトで、プロセスが完了するまで待機しない。リモートプロセスが要求を受信して確認、制御をSalesforceに戻す。
- ソリューション
    - [プラットフォームイベント](#6-プラットフォームイベント第二世代-ストリーミングapi)
        - プロトコル等：CometD
    - [アウトバウンドメッセージ](#8-アウトバウンドメッセージ)
        - プロトコル等：コントラクトファーストインテグレーション
    - [Apex REST 非同期コールアウト](#9-コールアウト)
    - [Apex SOAP 非同期コールアウト](#9-コールアウト)
- レジリエンス構築のための考慮事項
    - メッセージの信頼できる配信
## 3. データの変更に基づく UI の更新[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_ui_updates_from_data_changes.htm)
- Salesforceデータが変更された時に、Salesforceユーザインターフェースを自動的に更新する。
- ソリューション
    - [ストリーミングAPI](#4-pushtopicイベント-第一世代-ストリーミングapi)

## 4. データ仮想化[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_data_virtualization.htm)
- 外部システムに保存されているデータをSalesforceに表示して、リアルタイムに表示・更新できる。Salesforceと外部システム間でデータを調整する必要がなくなる。
- ソリューション
    - [Salesforce Connect](#10-salesforce-connect)
        - プロトコル：OData2.0またはOData4.0アダプター

## 5. リモートコールイン[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_remote_call_in.htm)
- 外部システムがSalesforceのAPIを実行し、Salesforceのデータの取得、作成、更新、削除を行う。
- ソリューション
    - [SOAP API](#1-soap-api)
    - [REST API](#2-rest-api)
    - [Apex Webサービス](#1-soap-api)
    - [Apex RESTサービス](#2-rest-api)
    - [Bulk API 2.0](#3-bulk-api-20)

## 6. バッチデータの同期[*](https://developer.salesforce.com/docs/atlas.ja-jp.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_batch_data_sync.htm)
- データの抽出、変換、ロードするために使用する。
- ソリューション
    - [変更データキャプチャ](#7-変更データキャプチャcdc第二世代-ストリーミングapi)
    - ETLを使用した連携
        - データセグメンテーション手法を使用して、データ競合を回避できる。
    - リモートコールイン
        - SOAPまたはREST
    - リモートプロセス呼び出し
        - 2つのシステム間でかなりの継続的なトラフィックが発生するため好ましくない。エンドユーザのパフォーマンスに影響を与える。
- ミドルウェア
    - Salesforce SOAP API または **Bulk API 2.0** を使用できる必要がある。REST APIはバッチデータ同期には向かない。
    - 非同期転送プロトコルをサポートする必要がある。





<!------------------------------------------------------------------------------>
<!------------------------------------------------------------------------------>
<!------------------------------------------------------------------------------>



# インテグレーションソリューション
## 1. SOAP API
### 特徴
- SOAP API：まとめて複数のレコードを更新することができる。1バッチあたり200件まで。
- 型指定をしっかりやりたい→SOAP
- WSDL（Web Services Description Language：仕様書のようなもの）で正確なデータ型を強制できる。
    - 命令、引数の数、戻り値、型を使用通りでないと呼び出せない。
- 定型的な業務システムとの連携むけ。ソーシャルとかスキーマがかわっても柔軟に対応したい時はRESTを選ぶ。
- WSDL
    - Enterprise WSDL：組織の中のオブジェクト構造を全て持っている。項目が変更されるとWSDL出力時と差分が出てきてエラーになる。
    - Partner WSDL：各オブジェクトの型は持っていない。すべてのオブジェクトをSオブジェクトとしてあつかう。頻繁に変更される時に使用。Describeメソッドを使うことが前提。
- OAuth認証が必要。セッションIDはSOAP APIのlogin()で取得できる。
- Apex Web サービス
    - Apex Webサービスを作成する場合もWSDLファイルを外部システムで使用して、Webサービスメソッドを呼び出すことができる。
    - <font color="Red">Apex Webサービスとして公開するApexクラスはwebserviceキーワードが必要（**アノテーションではない**）。</font>globalとしての宣言が必要。

### 標準・制限・境界・プロトコル[*](https://developer.salesforce.com/docs/atlas.ja-jp.240.0.apexcode.meta/apexcode/apex_gov_limits.htm)
- Salesforceが提供するコントラクトファーストの実装に参加する必要がある（WSDLファイルから実装を作成する）。
- ライセンスごとに24時間で実行できるAPIの呼び出しの総数に制限がある。
- 一度に作成、更新、または削除できるレコード数は最大 200 件。
- 2,000 件以上のレコードを含むデータを操作する場合は、Bulk API 2.0 の使用が適している。

### エラー処理・回復[*](https://developer.salesforce.com/docs/atlas.ja-jp.242.0.api.meta/api/sforce_api_concepts_errorhandling.htm)
- SOAP APIクエリに関する問題でエラーが発生した場合、<font color="Red">Errorデータ型</font>が返される。失敗の理由とステータスコード、メッセージ、フィールド、extendedErrorDetailsプロパティが含まれる。
- 不適切な形式、認証の失敗などのエラーは、ExceptionCodeをふくむ<font color="Red">SOAP障害メッセージ</font>が返される。

### セキュリティ

<!------------------------------------------------------------------------------>

## 2. REST API
### 特徴
- リソースベース操作に重点。URLで何を行うのかが決まる。複数のレコードを扱えない。SOAPより軽量。
- REST API：まとめて複数のレコードを更新をすることができない。リクエスト数が増えてしまう。特にデータの書き込み系が弱い。
- エンドポイント
    - リソースの利用：`/services/data/v{APIバージョン}/{リソース名}`
    - トークン要求：`/services/oauth2/token`
    - 認証コード要求：`/services/oauth2/authorize`

### 標準・制限・境界・プロトコル[*](https://developer.salesforce.com/docs/atlas.ja-jp.240.0.apexcode.meta/apexcode/apex_gov_limits.htm)
- 認証にOAuth2.0を使用できる必要がある。
- ライセンスごとに24時間で実行できるAPIの呼び出しの総数に制限がある。
- <font color="Red">一度に作成、更新、または削除できるレコード数は最大 200 件。</font>[*](https://developer.salesforce.com/docs/atlas.ja-jp.242.0.api_rest.meta/api_rest/resources_composite_sobjects_collections.htm)
    - Apex Rest APIはこの限りではない。
- 2,000 件以上のレコードを含むデータを操作する場合は、Bulk API 2.0 の使用が適している。
- 標準のREST APIではリード変換に対応していない。Apex REST APIまたは、標準のSOAP APIを使用する。

#### コールインのガバナ制限

### エラー処理・回復
- 同期処理：再試行メカニズムをApexで実装する。
- 非同期処理：外部システムで例外を処理する必要があり、カスタムの再試行メカニズムを備えている必要がある。

### セキュリティ

<!------------------------------------------------------------------------------>

## 3. BULK API 2.0
### 特徴
- 大量データを効率的に処理できる。RESTベースのAPI。非同期で実施される。
- 標準でジョブの監視が行われる。`設定 > 一括データ読み込みジョブ`で確認可能。
- <font color="Red">使用には、一括ジョブを作成し（POST）、データをジョブに追加し（PUT）、最後にジョブを閉じる（PATCH）必要がある。</font>
    - POST `/services/data/v{APIバージョン}/jobs/ingest`
    - PUT `/services/data/v{APIバージョン}/jobs/ingest/{jobId}/batches`
    - PATCH `/services/data/v{APIバージョン}/jobs/ingest/{jobId}`
- 自動で10,000件ごとにバッチ分割される。バッチ分割をプログラムで記述しなくて良い。


### 標準・制限・境界・プロトコル
- 24時間のローリング期間ごとに最大1億5000万レコードを送信できる。
- アップロードできるファイルはCSVのみ。

### エラー処理・回復

### セキュリティ

<!------------------------------------------------------------------------------>

## 4. PushTopicイベント （第一世代 ストリーミングAPI）
#### 特徴
- イベント駆動用のAPI。通知がきたら処理を行う。プッシュ技術が使われる。ほぼリアルタイムで受信。ただし配信と順序は保証されない。
- 変更データキャプチャより古い機能。
- Salesforceのユーザインターフェースに通知をストリーミングするために使用する。
- Salesforceのオブジェクトが変更された時にイベントが発生する。頻繁にポーリングを行うアプリケーションで使用。
- Bayeuxプロトコル、CometDライブラリに依存している。
    - Salesforceは標準のCometDではなく、拡張している。クライアントはそのための実装が必要。
- SOQLで更新時に通知を生成する必要がある項目を定義できる。
- メッセージは24時間しか保存されない。
- パブリッシュ
    - クエリ定義を含むPushTopicを作成して、トリガするイベントの指定と、通知に含めるデータを選択する。
        ```apex
        PushTopic pushTopic = new PushTopic();
        pushTopic.Name = 'InvoiceStatementUpdates';
        pushTopic.Query = 'SELECT Id, Name, Status__c, Description__c FROM Invoice_Statement__c';
        pushTopic.ApiVersion = 52.0;
        pushTopic.NotifyForOperationCreate = true;
        pushTopic.NotifyForOperationUpdate = true;
        pushTopic.NotifyForOperationUndelete = true;
        pushTopic.NotifyForOperationDelete = true;
        pushTopic.NotifyForFields = 'Referenced';
        insert pushTopic;
        ```
- サブスクライブ
    - LWCで通知を受け取るにはLWCコンポーネントがPushTopicチャネルに登録する必要がある。
        ```javascript
        import { subscribe, unsubscribe, onError, setDebugFlag, isEmpEnabled } from 'lightning/empApi';
        ```
- ポーリング
    - Salesforce上で2分間データが変わらなかったらリクエストを返す。
    - このポーリングはリクエスト回数を消費しない。そのため、リクエスト回数を節約できる。
    - データが変わったら瞬時にリクエストを返す。このときはリクエスト回数が消費される。

### エラー処理・回復
- 24時間イベントを記録する。再取得する時に使用するのが`data.event.replayId`。24時間経っているreplayIdを明示的に指定するとエラーになる。
    - Replay Option:-2とすると、24時間以内のイベントを受け取れる。
    - Replay Option:-1（デフォルト）とすると新規のイベントのみ読み込まれる。

### セキュリティ
- 認証プロトコルとしてOAuthを使用する。

<!------------------------------------------------------------------------------>

## 5. 汎用ストリーミングイベント （第一世代 ストリーミングAPI）
### 特徴
- ストリーミングAPIを拡張したもの。Salesforceのデータ変更に紐づかないイベント通知を送信する。
- プラットフォームイベントより古い機能。特定のユーザに公開する場合のみ汎用ストリーミングを選択する。
- 汎用ストリーミングというオブジェクトでストリーミングチャネルレコードを作る。
- 任意のメッセージのみを投稿できる。REST APIでイベントを生成する。Apexトリガ、フロー、プロセスからは登録できない。
- メッセージは24時間しか保存されない。

### 標準・制限・境界・プロトコル
- ストリーミングAPI
  - Bayeuxプロトコル（CometD）の実装するUIが必要。
  - クライアント数は最大2000まで

### エラー処理・回復

### セキュリティ
- 認証プロトコルとしてOAuthを使用する。

<!------------------------------------------------------------------------------>

## 6. プラットフォームイベント（第二世代 ストリーミングAPI）
- [開発者ガイド](https://developer.salesforce.com/docs/atlas.en-us.platform_events.meta/platform_events/platform_events_intro.htm)
- [Trailhead](https://trailhead.salesforce.com/ja/content/learn/modules/platform_events_basics/platform_events_define_publish)

### 特徴
- イベント駆動型インテグレーション。アウトバウンド、インバウンドのどちらにも対応。パブリッシュ-サブスクライブアーキテクチャに依存する。
- イベント公開のタイミングを、「コミット後に公開」と「すぐに公開」で選択できる。
- プラットフォームイベント定義にカスタム項目を作成することはできるが、項目レベルセキュリティは設定できない。
- パブリッシュにはプラットフォームイベント定義の作成権限が、サブスクライブには参照権限が必要。
- パブリッシュ
    - Salesforce
        - Apex、プロセス、フローからプラットフォームイベントを公開する。
        - Apexの場合、EventBus.publishメソッドを使用する。
    - 外部システム
        - Salesforce API（SOAP、REST、Bulk）を使用してプラットフォームイベントを公開する。
- サブスクライブ
    - Salesforce
        - プラットフォームイベントオブジェクトのApexトリガを作成してサブスクライブできる。
        - プラットフォームイベントトリガフローを作成することでもサブスクライブできる。
        - CometDを使ってVisualforce、Lightningコンポーネントでサブスクライブすることも可能。LWCではCometDを内包した`lightning/empApi`を使用する。[*](https://developer.salesforce.com/docs/component-library/bundle/lightning-emp-api/documentation)
    - 外部システム
        - CometDを使ってサブスクライブする。
        - プラットフォームイベントチャネル名は、大文字小文字が区別される。
        - APIバージョンは、CometD URLの末尾で指定する必要がある。
        - セッションIDは、リクエストヘッダーに追加する。
        - 再実行オプション（[メッセージの永続性](https://developer.salesforce.com/docs/atlas.ja-jp.244.0.api_streaming.meta/api_streaming/using_streaming_api_durability.htm)）
            - `{再実行ID}`でイベントメッセージを指定して取得することができる。
            - `-1`で新しいイベントメッセージを受け取ることができる。
            - `-2`で保存されているすべてのイベントを取得できる。
- <font color="Red">大規模イベントメッセージは72時間保存される。</font>通常規模イベントは24時間保存されるが、通常規模イベントはSpring'19以前に定義されたイベントに限られる。[*](https://developer.salesforce.com/docs/atlas.ja-jp.api_streaming.meta/api_streaming/using_streaming_api_durability.htm)

### 標準・制限・境界・プロトコル
- 外部システムはCometDを使用してサブスクライブできる必要がある。

### エラー処理・回復
- 受信側でエラー処理、ログ記録、自動再試行を実行する必要がある。
- 受信できなかったプラットフォームイベントは、再実行IDを使用して取得することができる。

### セキュリティ
- 認証プロトコルとしてOAuthを使用する。

<!------------------------------------------------------------------------------>

## 7. 変更データキャプチャ（CDC）（第二世代 ストリーミングAPI）
### 特徴
- Salesforceレコードが作成・更新・削除・復元された時に変更イベントを公開することで、外部システムがデータを同期できるようにする。
- 通知メッセージはイベントバスに送信。クライアントはチャネルを通じてサブスクライブする。
- 変更イベントトリガは非同期で実行されるため、大量のリソースを消費するビジネスロジックに適している。
- Apex 非同期ガバナ制限が適用される。
- CDCの方が断然使いやすいが、ストリーミングAPIでしかできないことがある。
    - ストリーミングAPIはクエリで取得する項目とレコードを絞ることができた。CDCは絞り込むことができない。
    - ストリーミングAPIは認証が必要。そのため、認証を受けたユーザの共有設定が反映される。CDCは共有設定が無視されて共有されてしまう。
- 大規模イベントメッセージは72時間保存される。[*](https://developer.salesforce.com/docs/atlas.ja-jp.api_streaming.meta/api_streaming/using_streaming_api_durability.htm)

### 標準・制限・境界・プロトコル
- リモート システムには、イベントを受信し、外部システムで更新を実行するためのインテグレーションアプリケーションが必要。
- <font color="Red">変更イベントの最大サイズは1MBまで。これを超過すると代わりにギャップイベントが送信される。</font>
- 変更データキャプチャのチャネルに指定できるオブジェクト数は5つまで（AppExchangeで追加されたカスタムチャネルは制限に含まれない）。[*](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_allocations_default_allocations.htm)

### エラー処理・回復
- 受信側でエラー処理、ログ記録、自動再試行を実行する必要がある。
- 受信できなかったプラットフォームイベントは、再実行IDを使用して取得することができる。
- Salesforceが変更イベントを送信できない場合、代わりにギャップイベントが送信される。ギャップイベントにはエラーメッセージと対象のレコードIDが含まれている。ギャップイベントを受診した外部システムはSOAP APIなど他の手段でレコードを取得する。[*](https://developer.salesforce.com/docs/atlas.en-us.change_data_capture.meta/change_data_capture/cdc_other_events_gap.htm)

### セキュリティ
- Shield Platform Encryptionで暗号化された項目[*](https://developer.salesforce.com/docs/atlas.ja-jp.platform_events.meta/platform_events/platform_events_encryption.htm)
    - 暗号化された項目に加えられた変更は、複合された状態でSalesforceの内部でキャプチャされ、最大3日間イベントバスに保存される。転送中のデータを確実に保護するために、変更イベントのペイロードを暗号化する必要がある。
    - 暗号化は、Salesforce Event Monitoring ストリーミングイベントを含む、カスタムと標準のすべてのプラットフォームイベントに適用される。
    - 暗号化手順
        - 暗号化を有効にする前に`設定 > 証明書と鍵の管理`で<font color="Red">**イベントバスのテナントの秘密**</font>を作成する。
        - 次に`暗号化ポリシー`ページで<font color="Red">プラットフォームイベントの暗号化</font>を有効にする。

<!------------------------------------------------------------------------------>

## 8. アウトバウンドメッセージ
### 特徴
- ワークフロールール、承認プロセス、**フロー**に基づいて発生する非同期通知を送信する宣言的なソリューション。
    - **Apex**、プロセスビルダーから送信できない。
- SOAPで送信されるため、エンドポイントにはSalesforceアウトバウンドメッセージを受け入れるカスタムリスナーサービスが必要。
- <font color="Red">メッセージは常に単一オブジェクトの送信情報に制限される。</font>
    - 複数オブジェクトの情報が欲しい場合は、アウトバウンドメッセージにセッションIDとレコードIDを挿入し、外部システムからセッションIDを使用してSalesforce SOAP APIで情報を取得する（コールバック）
- 24時間までメッセージをキューに残す。
- アウトバウンドメッセージは特定のSalesforceユーザとして送信されるように設定できる。
- セッションIDをアウトバウンドメッセージで送信して、コールバックを許可することができる。
- アウトバウンドメッセージのWSDLを使用してリスナーを定義する必要がある。

### 標準・制限・境界・プロトコル
- Salesforceから送信される定義済みのフォーマット（WSDL）のメッセージを受信できるリスナーを実装できる必要がある。
- リスナーはSalesforceが提供するコントラクトファーストの実装に参加する必要がある（WSDLファイルから実装を作成する）。

### エラー処理・回復
- 非同期処理のため、リモートシステムがエラーを処理する。
- タイムアウト期間内に成功のレスポンスがない場合、Salesforceは最大で24時間再試行操作を実施する。
- 24時間経っても処理できない場合、Salesforceのキューに保存され、手動で再試行する。

### セキュリティ
- デフォルトで一方向SSLを使用する。
- <font color="Red">双方向SSLの使用も可能。</font>
    - クライアント証明書をSalesforceでダウンロードし、アプリケーションサーバにインポートして、そのサーバがクライアント証明書を要求するように設定する。アプリケーションサーバは SSL/TLS ハンドシェイクで使用する証明書がダウンロードした証明書と一致しているかを確認する。[*](https://developer.salesforce.com/docs/atlas.ja-jp.242.0.api.meta/api/sforce_api_om_outboundmessaging_setting_up.htm)
- コールバックを受信するために、セッションIDを送信メッセージに含めることができる。

<!------------------------------------------------------------------------------>

## 9. コールアウト
### 特徴
- フローから非同期コールアウトを行うためには、非同期パスをフローに追加する。
- LWCでコールアウト結果を使用する場合、通常は同期Apexコールアウトを使用する。
- 非同期Apexコールアウトの結果をLWCに表示させるためには、継続を使用する。
    - 継続：[継続を使用した長時間コールアウトの実行](https://developer.salesforce.com/docs/component-library/documentation/ja-jp/57.0/lwc/lwc.apex_continuations)

### 標準・制限・境界・プロトコル
#### SOAP
- 標準：WSDL 1.1、SOAP 1.1、WSI-Basic Profile 1.1、HTTPに準拠していること。
- 1Apexトランザクションで100回を超えてはいけない。

#### REST
- 標準：SalesforceはGET、PATCH、POST、PUT、DELETEメソッドに対応している。
- Salesforce は、公開インターネットを介してエンドポイントにアクセスできる必要がある。

#### 同期コールアウトのガバナ制限[*](https://developer.salesforce.com/docs/atlas.ja-jp.240.0.apexcode.meta/apexcode/apex_gov_limits.htm)
- 1トランザクションあたりのコールアウト数：100まで
- 1トランザクションあたりのすべてのコールアウトのタイムアウトの最大累積時間：120秒まで（デフォルトは10秒）
- <font color="Red">組織ごとの、5 秒を超える長時間のトランザクションに対する同期同時トランザクション数：10</font>
- Apexトリガから非同期処理は実行できない。
- コールアウト要求または応答の最大サイズ：6MB

#### 非同期コールアウトのガバナ制限[*](https://developer.salesforce.com/docs/atlas.ja-jp.240.0.apexcode.meta/apexcode/apex_gov_limits.htm)
- System.enqueueJob によってキューに追加される Apex ジョブの最大数：1まで
- コールアウト要求または応答の最大サイズ：12MB

### エラー処理・回復
- 要求メッセージに一意のメッセージIDを追加する。これにより、受信者は重複したリクエストを認識することができる。外部システムにデータを挿入する前に、重複レコードを確認する。
- 外部システムから成功の応答を受信しない限り、変更がSalesforceにコミットされないようにする。
- カスタムの再試行メカニズムとタイムアウトを実装できる。

### セキュリティ
- SSL
    - デフォルトで一方向SSLをサポートする。
    - 双方向SSLを使用するために、自己署名証明書をSalesforceで作成することができる。また、認証局（CA）によって署名された証明書を使用することも可能。
- エンドポイント
    - **指定ログイン情報**を作成することで、エンドポイントURLと認証をApexコードから切り離すことができる。
    - 指定ログイン情報でサイトを登録しない場合、エンドポイントを**リモートサイト**に登録する必要がある。
- メッセージの整合性の保証
    - ハッシュ：`Crypto.generateDigest()`を使用して一方向ハッシュを生成し、受信側で同じアルゴリズムを使用して同一ハッシュが生成されていると、メッセージが改竄されていないことが確認できる。
    - デジタル署名：`Crypto.sign()`を使用してデジタル署名を作成できる。非公開鍵を使って暗号化されている。受信者は公開鍵を使用してメッセージを複合でき、メッセージダイジェストと受信したメッセージから作成されたダイジェストを比較して、整合性を確認できる。

#### SOAPトランザクションのセキュリティ強化[*](https://developer.salesforce.com/docs/atlas.ja-jp.244.0.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_security_considerations.htm)
- <font color="Red">WS-SecurityはApexコールアウトではサポートされていない。</font>3つの代替案がある。
    - ①**セキュリティ/XMLゲートウェイを使用して、WS-Securityログイン情報をトランザクションストリーム自体に挿入する**
    - ②**双方向SSLおよびIP制限を使用して通信を暗号化してトランザクションを保護する。**
    - ③**WSDL2Apexユーティリティを使用して、送信SOAPリクエストにWS-Securityヘッダーを追加する（複雑でリスクが高いため推奨されていない）。**

<!------------------------------------------------------------------------------>

## 10. Salesforce Connect
### 特徴
- データネイティブのプラットフォーム機能をSalesforce内に実装する統合ツール。外部システムのデータを外部オブジェクト（サフィックス__x）としてカスタムオブジェクトのように使用できる。
- ODataプロトコルを使用。リモートシステムにOData準拠のエンドポイントが必要。ODataはRESTサービスがベース。
- リアルタイムにデータにアクセスできる。Salesforceには格納もコピーされない。
- リモートシステムで対応していればSalesforce上からデータの作成もできる。
    - フローも外部オブジェクトをサポートしている。外部オブジェクトは非同期で操作する必要があるので、非同期パスを使用する。
- 間接参照関係または、外部参照関係を定義することで、レコードにリレーションを設定することが可能。
    - （間接参照関係）外部オブジェクト → 標準・カスタム（外部ID項目を参照）
    - （外部参照関係）標準・カスタム・外部 → 外部オブジェクト
- 直接繋げられないときはApexコネクタフレームワークを使用して固有のカスタムアダプタを開発できる。

### 標準・制限・境界・プロトコル
- 外部システムが OData 2.0、OData 4.0、または組織間アダプタなど、利用可能なアダプタの 1 つをサポートしている必要がある。
- 1時間あたり20,000件のODataコールアウトに制限されている。これ以上の制限を要求する場合は、サポートケースを作成する必要がある。
- 外部オブジェクトの制限
    - 数式、積み上げ、トリガ、ワークフロー、承認プロセス、入力規則、共有は使えない。
    - メモ、添付、項目履歴はサポートされない。
    - レコードレベルセキュリティはサポートされない。
    - <font color="Red">同じトランザクション内で外部オブジェクトと、標準・カスタムオブジェクトの変更をコミットしようとすると混合DMLエラーが発生する。</font>非同期で更新するようにする。

### エラー処理・回復
### セキュリティ
- CSRF保護（クロスサイト リクエスト フォージェリ）は書き込み可能な外部オブジェクトが選択されている場合に使用可能。外部システムがデータの作成編集削除のリクエストでCSRF保護を必要とする場合に有効にする。
- 企業ネットワークのファイアウォールでSalesforceサーバのIPアドレスをホワイトリストに登録するか、リバースプロキシXMLゲートウェイを設定することでSalesforceからのアクセスを許可できる。
- 双方向SSL接続を確立する場合、証明書を指定する。

<!------------------------------------------------------------------------------>

## 11. Heroku Connect
### 特徴
- Heroku ConnectはHerokuのアドオン。
- SalesforceとHeroku Postgresのデータベーステーブル間の双方向同期。
- ソリューションの選択
    - Salesforce と Heroku の間でデータを複製するには、Heroku Connect を使用する。
    - Heroku Postgres データベースを Salesforce に公開するには、Heroku Connect 外部オブジェクトを使用する。
    - OData、SOAP、XML、JSON のデータソースを Salesforce にプロキシするには、Salesforce Connect を使用する。
    - カスタム UI が Heroku 上にあってユーザが Salesforce によってログインする場合など、Heroku Connect が適合しない場合は、Salesforce REST API を使用する。
    - Salesforce データイベントの処理のオフロードまたは拡張を行うには、Salesforce から Heroku にコールアウトを使用する。
    - Heroku またはその他の外部 Web アプリケーションから Salesforce にカスタム UI を埋め込むには、キャンバスを使用する。

### 標準・制限・境界・プロトコル
### エラー処理・回復
### セキュリティ

<!------------------------------------------------------------------------------>

## 12. 拡張外部サービス
### 特徴
- OpenAPI標準に準拠した、外部ホストサービスとの宣言的なインテグレーションを可能にするSalesforceの機能。フローから呼び出すことができる。

### 標準・制限・境界・プロトコル
- 外部システムのRESTfulサービスは<font color="Red">OpenAPI 2.0またはOpenAPI 3.0 JSONスキーマ形式</font>で使用できる必要がある。

### エラー処理・回復
- 組み込みのエラー処理の機能はない。

#### セキュリティ
- 指定ログイン情報と外部ログイン情報の作成が必要。リモートサイトの設定は不要。


## 参考
- [Salesforce Integration - Apex Hours](https://www.apexhours.com/salesforce-integration/)
- [どの API を使用するか?](https://help.salesforce.com/s/articleView?id=sf.integrate_what_is_api.htm&type=5)
- [インテグレーションのパターンと実践 | Salesforce Developers](https://developer.salesforce.com/docs/atlas.ja-jp.242.0.integration_patterns_and_practices.meta/integration_patterns_and_practices/integ_pat_intro_overview.htm)
- [Data Integration | Salesforce Architects](https://architect.salesforce.com/decision-guides/data-integration)

前
[Salesforce認定 Integrationアーキテクト 試験対策メモ①](https://qiita.com/TaaaZyyy/items/8b62032466ae2b515b34)