AWS Lambda関数からAmazon Connectコンタクトフローを呼び出し～電話の転送を行う

# ◆概要
* [AWS Lambdaを使用したLINEbotの作成](https://qiita.com/azuki2ice/items/85f369d3bc70daf59dc1) で作成したLINE botに受け答えをするとAmazon Connectのコンタクトフロー経由で有人の通話に切り替えるシナリオを作ってみます。
    * システムの流れ
        * ①ラムダからAmazon Connect が呼ばれる
        * ②Amazon Connectが自動で修理業者等へ電話をかける
        * ③修理業者とIVRで通話
        * ④ユーザに電話を転送し、ユーザと修理業者をつなぐ

# ◆事前準備
 * AWSアカウントの作成
 * Amazon Connectインスタンスの作成

# ◆LINE botの修正
* 今回はLINE botで位置情報を送信した場合にSalesforceへのケース登録とコンタクトフローの呼び出しを行うようにします。
    * [AWS Lambdaを使用したLINEbotの作成](https://qiita.com/azuki2ice/items/85f369d3bc70daf59dc1)で作成したwebhook.jsの位置情報送信時の処理を修正していきます。
* Amazon Connect Salesforce lambda packageを利用します。
    * 参考サイト：[Amazon Connect CTI Adapter V2 for SalesforceでAmazon Connect Salesforce Lambda packageをインストールして使ってみる](https://dev.classmethod.jp/cloud/aws/how-to-use-amazon-connect-salesforce-lambda-package-with-amazon-connect-cti-adapter-v2-for-salesforce/)

```js:webhook.js
case 'location': // 位置情報
const address = webhookData.message.address;
const latitude = webhookData.message.latitude;
const longitude = webhookData.message.longitude;

// SFDC Invoke APIコール
const callHello = (message) => {
  const request = require('request-promise');
  const options = {
    method: 'POST',
    headers: { 'Content-Type': 'application/json; charset=UTF-8' },
    // Amazon Connect Salesforce lambda packageをAPI GWとして呼び出す
    uri: `https://・・・・`,
    body: message,
    json: true
  };
  return request(options)
    .then(function (parsedBody) {
      return parsedBody;
    })
    .catch(function (err) {
      console.log(err);
      return null;
    });
};
(async () => {
  // SFDC ContactID取得
  const response1 = await callHello({
    "Details": {
      "Parameters": {
        "sf_operation": "lookup",
        "LINE__c": userId,
        "sf_object": "Contact",
        "sf_fields": "Id, Name, HomePhone"
      }
    }
  });
  const SFDC_ContactId = response1.Id;
  const SFDC_ContactName = response1.Name;
  const SFDC_ContactHomePhone = response1.HomePhone;

  // SFDCケース登録
  const response2 = await callHello({
    "Details": {
      "Parameters": {
        "sf_operation": "create",
        "sf_object": "Case",
        "Origin": "LINE",
        "Status": "New",
        "ContactId": SFDC_ContactId,
        "Subject": "修理予約",
        "Priority": "High",
        "Description": "SFDC登録名:" + SFDC_ContactName + "  (LINE登録名:" + displayName + ") 様より車両の修理依頼受領。(ご申告位置情報: " + address + ")" +
          "--> 修理対応者決定(修理サービス)"
      }
    }
  });

  // LINEエンドユーザへリプライ送信
  replyMessage = displayName + 'さん(ご契約名義:' + SFDC_ContactName + '様)、位置情報の送付ありがとうございます。' + address + 'に急行するよう、修理手配中です。しばらくお待ちください。';
  Line.replyMessage(replyToken, { type: 'text', text: replyMessage });

  // 電話コールバック
  var connect;
  // Amazon Connectのリージョンを指定してオブジェクト作成
  connect = new AWS.Connect({ apiVersion: 'latest', region: "ap-southeast-2" });

  // APIリクエストのパラメータ作成
  var params = {
    ClientToken: null,
    // Amazon ConnectのコンタクトフローのID
    ContactFlowId: "・・・・・・・・",
    // 今回かける先の電話番号は引数で設定
    DestinationPhoneNumber: process.env.PHONENUMBER,
    // Amazon ConnectのコールセンターのインスタンスID
    InstanceId: "・・・・・・・・・",
    // かける元の電話番号
    SourcePhoneNumber: "+81・・・・・・・・"
  };

  // APIをキック
  var calling = connect.startOutboundVoiceContact(params, function (err, data) {
    if (err) {
      console.log(err);
    } else {
      console.log("無事終了");
    }
  });
})();
break;
```

# ◆コンタクトフローの作成

## 1. キューの設定
* 今回作成するキューはアウトバウンド発信者ID名、アウトバウンド発信者ID番号を設定します。
    * 設定する番号・名前がユーザに通知されます。(番号がない場合には取得してください)

## 2. コンタクトフロー
* 今回は下記の図のようなコンタクトフローを作成します。
![flow_2.png](https://qiita-image-store.s3.amazonaws.com/0/372054/58c50c0c-8e39-cb6a-b928-542f71ec00ed.png)

### ①音声の設定
* 言語を日本語に設定し、音声を選択します。

### ②キューの設定
* この問い合わせフローのために新規でキューを作成し、それを指定してください。

### ③ログ記録動作の設定
* ログ記録動作を有効化します。

### ④通話記録動作の設定
* 顧客専用を選択します。

### ⑤プロンプトの再生
* テキスト読み上げ機能(アドホック)を選択
* テキストの入力

```
お世話になっております。修理手配センターです。
```
### ⑥Lambda関数を呼び出す
* ARNはAmazon Connect salesforce lambda package により追加された関数のARNを使用してください。
    * 関数入力パラメータ：

| 　　　 | 宛先キー | タイプ  | 属性 | 値 |
| :--- | :--- | :--- | :--- | :--- |
| 属性を使用する | homephone | システム | お客様の電話番号 |ー
| テキストの使用 |sf_object|ー|ー|Contact|
| 属性を使用する |sf_fields|ー|Id,Name,Email,AssistantName,Mycar__c,|ー
| テキストの使用 |sf_operation|ー|ー|lookup|

### ⑦問い合わせ属性の設定
* SFから取得したID・名前をAmazon Connect上の問い合わせ属性として保存します。

|  | 宛先キー | タイプ  | 属性 |値|
| :--- | :--- | :--- | :--- |:--- |
| 属性を使用する | SFDCContact_cst_id | 外部 | id |ー
| 属性を使用する |SFDCContact_cst_name|外部|Name|ー

### ⑧プロンプトの再生
* テキスト読み上げ機能(アドホック)を選択
* テキストの入力

```
$.Attributes.SFDCContact_cst_nameさん
```

### ⑨顧客の入力を取得する
* 「先ほどお送りした、XXXXXXさまの車の修理、30分以内に現地にいけますか？」と読み上げ、顧客の「はい」を認識します。
* テキスト読み上げ機能(アドホック)を選択
* テキストの入力

```
先ほどお送りした、XXXXXXさまの車の修理、30分以内に現地にいけますか？
```

 * ブランチの設定でAmazon Lexを選択
 * Lexボット(STEP1の(3)で設定)を設定

### ⑩プロンプトの再生
* テキスト読み上げ機能(アドホック)を選択
* テキストの入力

```
$.Attributes.SFDCContact_cst_nameさん、修理受付、ありがとうございます。
それでは30分以内に現地かけつけ、よろしくお願します。詳細について、XXXXXXさまにお知らせいただきたいので、
このままお電話をおつなぎします。よろしくお願いします。
```

### ⑪電話番号への転送
* 転送したい先の電話番号を設定します。

# ◆参考サイト
* [Amazon Connect CTI Adapter V2 for SalesforceでAmazon Connect Salesforce Lambda packageをインストールして使ってみる](https://dev.classmethod.jp/cloud/aws/how-to-use-amazon-connect-salesforce-lambda-package-with-amazon-connect-cti-adapter-v2-for-salesforce/)