Amazon Connect で自動認証を利用したコールフローを実装

**本記事では、Amazon Connect を使用したコンタクトセンターを想定し、着信があった際に自動認証を行った上でCCPへ着信させる方法を記載する。Amazon Connect 上で用意する電話番号の取得、ユーザー、ルーティングプロファイルなどの作成は割愛する。**

構成は以下のようなイメージ
Amazon Connect / Lambda / DynamoDB / SNS を使用する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/7cd801f7-6a7d-3bf5-cf8a-56a30e181d23.png)



#仕組みについて
① ユーザーが Amazon Connect の電話番号へ発信
② DynamoDB 上にある発信者番号のレコードを特定した場合、自動認証としてオペレーターと繋がる。
③ DynamoDB 上に発信者番号のレコードが存在しない場合、SMS を送信し、ワンタイムパスワード認証を実施する。
④ 認証が通れば発信者番号に DynamoDB 上に発信者番号のレコードを追加し、オペレーターと繋がる。

#問合せフローについて
Amazon Connect では問合せフローと呼ばれるコールフローを作成する必要がある。
コールフローとは、Amazon Connect の電話番号に着信があった際に、どのような処理を行うかを設定するものである。問合せフローは GUI で明示的に表現したものであり、直感的に開発を行う事が可能。


##コールフロー設計
Amazon Connect のコールフロー設計は、要件に基づいて Amazon Connect 上で実装が可能なブロックを一つずつ照らし合わせていく工程が必要となる。
ただし、実際の問合せフローをアウトプットとする事も可能であるが、非常に分かりづらい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/53577f8e-e5bc-48c9-c442-928acf9e13f0.png)

そのため、実際に行われる処理はアウトプットとして起こした方が理解しやすい。また、設計段階であれば相手に伝わりやすい。
本記事では以下のような設計図の順序に沿って実装を行っていく。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/0f42c643-188c-b5a0-cbd5-ce98b9d15506.png)

##問合せフローの特徴
後述の Lambda の変数と関連するが、Amazon Connect ではコールフロー上で、変数の定義を行ったり、定義された変数を確認して、処理を行う内容を変える事が可能である。

今回では、以下3種類の変数を使用して処理を行う。

① key-value 形式の顧客番号を CallerID として定義する。
この処理は上記の設計図の "電話番号の設定" に該当する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/330c6425-e655-2e62-3062-b1c4a636ba5a.png)

② 以下は Lambda の返り値から処理を確認するものである。
ここでは recordFound と等しい場合、DynamoDB に着信番号が存在するため、オペレーターへ直接電話を繋ぐことが可能となる。
一方、recordFound 出ない場合、DynamoDB に着信番号が存在しないため、書き込みを行い、SMS にてワンタイムパスワードを発行する。
この処理は上記の設計図の "電話番号の確認" に該当する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/c7eb04dd-2cee-8310-f9e5-073bcc689ce7.png)

③ 以下は SMS にて送信した4桁のコードに対し、着信者が入力した値を Amazon Connect に保存する処理である。同時に PIN番号を入力してください。というアナウンスを流す。
この値をもって、認証するか否認するかが決定する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/da47ab23-805b-318c-0404-5756bb37ebf2.png)

#Lambda 
Amazon Connect で自動認証を実装するために、以下の２つの Lambda を開発する必要がある。

* DynamoDB のレコードを読み取りする処理
* DynamoDB のレコードへ書き込み、SMS にてワンタイムパスワードを送信する処理

## DynamoDB のレコードを読み取りする処理
以下は、CustomerTable の CallerID 列を読み取りにいき、Amazon Connect で定義した CallerID(着信番号)と一致すれば recordFound として返す。
これにより、DynamoDB に登録された電話番号は自動で認証され、CCP へ着信をパスする事が可能となる。

```
exports.handler = (event, context, callback) => {
  var CallerID = event.Details.Parameters.CallerID;
  var paramsQuery = {
    TableName: 'CustomerTable',
    KeyConditionExpression: "CallerID = :varNumber",
    ExpressionAttributeValues: { ":varNumber": CallerID }
  };

  docClient.query(paramsQuery, function(err, data) {
    if (err) {
      console.log(err);
      callback(null, buildResponse(false));
    }
    else {
      console.log("DynamoDB Query Results:" + JSON.stringify(data));

      if (data.Items.length === 0) {
        console.log("Customer not Found in CustomerTable");
        var recordFound = "False";
        callback(null, buildResponse(true, recordFound));
      }
      else {
        var recordFound = "True"
        var lastName = data.Items[0].lastName;
        var firstName = data.Items[0].firstName;
        var custLevel = data.Items[0].custLevel;
        var callerPIN = data.Items[0].callerPIN;
        var language = data.Items[0].language;
        callback(null, buildResponse(true, recordFound, lastName, firstName, custLevel, callerPIN, language));
      }
    }
  });
};
```

## DynamoDB のレコードへ書き込み、SMS にてワンタイムパスワードを送信する処理
CustmerTable に CallerID を書き込み、無作為に生成された CallerPIN (ワンタイムパスワード) を SMS にて送信する。

```
exports.handler = (event, context, callback) => {
  console.log(event);
  var CallerID = event.Details.ContactData.CustomerEndpoint.Address;
  var callerPIN = (Math.floor(Math.random() * 10000) + 10000).toString().substring(1);
  console.log("CallerPIN set to" & callerPIN);
    var firstName = "New";
    var lastName = "Customer";
    var custLevel = "Welcome";
    var language = event.Details.Parameters.language;
  var paramsPut = {
    TableName: 'CustomerTable',
    Item:{
        "CallerID": CallerID,
        "callerPIN": callerPIN,
        "firstName": firstName,
        "lastName": lastName,
        "custLevel": custLevel,
        "language": language
    }
  };
  docClient.put(paramsPut, function(err, data) {
    if (err) {
      console.log(err);
      callback(null, buildResponse(false));
    }
    else {
      console.log("DynamoDB record created:" + paramsPut);
        var SMSparams = {
                    Message: 'Welcome to wiser bank, your temporary PIN is '+callerPIN,
                    MessageStructure: 'string',
                    PhoneNumber: CallerID
                    };
            sns.publish(SMSparams, function(err, data) {
                    if (err) console.log(err, err.stack); // an error occurred
                    else     console.log(data);           // successful response
                    callback(null, buildResponse(true));
                    });
            }
  });
};

function buildResponse(isSuccess) {
  if (isSuccess) {
    return {
      lambdaResult: "Success"
    };
  }
  else {
    console.log("Lambda returned error to Connect");
    return { lambdaResult: "Error" };
  }
}

```

スマートフォン上から確認すると、以下のように4桁の数字がついた SMS が送信される。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1597898/f9ad8f15-faad-90fb-db63-605f19baf5eb.png)





このように、Amazon Connect 上で Lambda / DynamoDB / SMS を使用してコンパクトに自動認証機能を作成する事が出来る。