Messagingチャットを外部サイトに埋め込んで検証する方法 – Amplify と Salesforce の設定ポイント

## はじめに
本記事では、Salesforce の Messaging で作成済みのチャットウィジェットを外部Webサイトに埋め込み、検証するための手順を解説します。ここではチャット自体の作成方法は省略し、チャットが動作する状態になっている前提で、外部サイトの準備とSalesforce側の設定に焦点を当てます。

- チャット自体の作成方法については、こちらのサイトが非常にわかりやすいので参考にして見てください。
  - https://www.sohobb.jp/event/salesforce_messaging_miaw_settings_-3part_series_part-1/
  - https://www.sohobb.jp/event/salesforce_messaging_miaw_settings_-3part_series_part-2/


## 1. 外部サイトの準備
外部サイトにチャットウィジェットを埋め込むため、以下の手順で検証用ページを用意します。

### 1.1 コードスニペットの取得と index.html の作成
Salesforce から提供されたチャットウィジェット用のコードスニペット（meta タグ、JavaScript 初期化コード、bootstrap.js の読み込み）を抜き出し、以下のようなシンプルな HTML ページ（例: index.html）を作成します。抜き出したチャットのコードスニペットは変更する必要などなく、そのまま貼り付けてください。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/3ce7bd23-2129-4565-98ce-5734d064354c.png)

```html
<!DOCTYPE html>
<html lang="ja">
<head>
  <meta charset="UTF-8">
  <!-- モバイル対応用 -->
  <meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1">
  <title>チャット検証ページ</title>
  <!-- 必要に応じたCSSも追加 -->
</head>
<body>
  <h1>チャット検証ページ</h1>

  <!-- チャットウィジェットの初期化コード -->
  <script type="text/javascript">
    function initEmbeddedMessaging() {
      try {
        embeddedservice_bootstrap.settings.language = 'ja'; // 'ja' で日本語に設定
        embeddedservice_bootstrap.init(
          'xxxxxxxxxxx', // Deployment ID（実際の値に合わせて変更）
          'xxxxxxxxxxx',      // チャットサービス名
          'https://xxxxxxxxxx.sandbox.my.site.com/ESWChatService1738458709591', // サービスURL
          {
            scrt2URL: 'https://xxxxxxxxxx.sandbox.my.salesforce-scrt.com'
          }
        );
      } catch (err) {
        console.error('Error loading Embedded Messaging: ', err);
      }
    }
  </script>
  <script type="text/javascript" src="https://xxxxxxxxxx.sandbox.my.site.com/ESWChatService1738458709591/assets/js/bootstrap.min.js" onload="initEmbeddedMessaging()"></script>
</body>
</html>

```

### 1.2 ホスティング環境の選定

ここら辺が少しめんどくさいのですが、上記のhtmlをローカルなどで動かしてもCORSエラーが出てしまいます。よってSalesforce 側で CORS の設定をする必要があるのですが、CORS の設定が `https` 経由のURLしか設定できません。
なので、ホスティングする場所を考える必要があります。
色々やり方あると思うのですが、一番早く、簡単にとりあえず外部サイトに埋め込んで検証したい人向けの方法を考えたところ、AWS Amplify が一番いいと思ったので、ここでは Amplify へのデプロイを説明していきます。

(AWS S3 で静的ホスティングという機能もあるのですが、HTTP 通信となってしまうため、ここでは使用できない）

##### 手順概要
- S3にバケットを作成する
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/74533e60-ca1d-64a0-aba7-08dd572071d1.png)

    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/61cbd5cb-f314-237b-11b8-4de5a1253b4e.png)

- 作成した index.html を S3 にアップロードする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/db8aeb7f-b286-26b5-b477-1fbfb5b4064c.png)

- Amplify のホスティング機能を利用して、HTTPS 対応の URL でコンテンツを配信する。
  - Amplify の設定画面へ移動
  - ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/474180f7-2ea4-9a2d-6686-f2375de728e0.png)
  - 「新しいアプリを作成」をクリック
    ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/c793a11d-ede2-a3a7-607a-7b2b60ab472a.png)
  - 「Gitなしでデプロイ」を選択して次へ
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/5259637a-c559-d44e-117c-1f25df39d5f3.png)
  - Amazon S3を選択して「S3を閲覧」をクリック
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/64461772-60c2-6b51-04d9-9e62b24a1a78.png)
  - 作成したバケットを選択
   ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/3a21bdf9-2b53-adfc-3475-439a5f5c2fed.png)
  - ロケーションが設定できたら、「保存してデプロイ」を押す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/580a3825-797b-729d-ad12-e30338946a76.png)
  - URLが発行されていることを確認する
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/506fb3bd-5108-8e4e-d6a0-200243f58571.png)
  - ここにアクセスして画面が表示されたら、一旦OK(この状態では、まだSFの設定をしていないため、CORSエラーが出ていると思います)
  ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/e63665d8-6f5e-fd65-3ba3-e47eb589388c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/238536ed-0002-9d88-1624-3d790e675c9d.png)

## 2. Salesforce側の設定
外部サイトでチャットウィジェットを正しく表示させるため、Salesforce 側の設定を行なっていきます。

### 2.1 CORS 設定の追加
Salesforce 設定 内の「CORS 設定」で、Amplify で発行される HTTPS のホスティング URL（例: https://your-app.amplifyapp.com）を許可リストに追加してください。これにより、外部サイトから Salesforce のリソースへのリクエストが許可されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/0a35956e-cd44-4cdf-c811-7675155add42.png)


### 2.2 Trusted Domains for Inline Frames の設定
また、Salesforce の組み込みサービスで作成されたチャットのエンドポイント（サイト）の CSP 設定で、「Trusted Domains for Inline Frames」にも同様に Amplify のホスティング URL を追加する必要があります。これにより、Salesforce 側が指定するフレーム埋め込み可能なドメインに、Amplify にデプロイされているサイトが含まれるようになります。

- サービスリリースの時に設定したドメインの「サイト」を開きます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/e9bed8db-dc76-f628-91d0-5d44ddcd7855.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/3985f7a5-a347-ac48-b288-dd1e90753c1e.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/deb58238-6ed5-b962-988e-d1ca4faed5d1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/9f566aa4-f280-ae65-eddd-e96fa272e6ad.png)
- サイトを開いたら、「Trusted Domains for Inline Frames」 にて、Amplifyのエンドポイントのドメインを登録します

- CORSの設定とサイトのTrusted Domains for Inline Framesを設定してもらえると下記のようにチャットのアイコンが表示されるようになると思います
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3531653/4d87503a-e1e1-c1fe-18e2-08c3eb62613f.png)


## 3. まとめ
以上の手順により、既に稼働するチャットウィジェットを外部サイトに埋め込み、検証する環境が構築できます。

- 外部サイトの準備: コードスニペットを用いて index.html を作成し、S3にアップロード後、Amplify 経由で HTTPS ホスティングを実現。
- Salesforce側の設定: Amplify のホスティングURLを CORS 設定と「Trusted Domains for Inline Frames」に追加。

以上、検証用のチャット環境の外部サイトへの埋め込み方法の紹介でした。この記事が皆さんの検証環境構築の参考になれば幸いです。