こんにちは、櫻井です。
本記事は、Amazon Connect アドベントカレンダー 2023の19日目の記事です。
ギークフィード、クラスメソッドさん、スカイアーチHRソリューションズさんの有志によるアドベントカレンダーとなっております。
概要
AmazonConnectに紐づく1つの電話番号を覚えるだけで、あとは対話形式で電話を掛けたい相手に電話を転送してくれるサービスです。
災害時に安否確認連絡をしたいので
“◯◯さんと、✕✕さんに電話をかけたいけど、急いで逃げたから携帯を持っておらず、電話番号がわからない”
といったケースや
“携帯を紛失してしまったが、すぐに連絡を取る必要がある相手がいる”
といった利用ケースを想定しています。
以前あまり馴染みのない土地で飲み会中に買い出しに出て、居酒屋までの帰り道がわからなくなり携帯も居酒屋に忘れてしまったため、誰とも連絡を取ることが出来ず、居酒屋に戻るのに凄く苦労したことがあったのでこのサービスを作りました。
使い方
まずは、以下の添付画像の赤い矢印のフローで電話番号の登録を行います。
こちらのフローの具体的な解説については、以前執筆した以下のリンクで詳しい解説をしています。
SlackとAWSを組み合わせた電話番号登録アプリの開発 – Boltフレームワーク+CDKで作ってみた
Slack と AWS の電話番号登録アプリ – Bolt + CDK ソースコード解説
次に、AmazonConnectに電話を発信し、本人確認と、転送相手の名前を対話形式で伝えます。
AmazonConnectは対話形式で受け取った、転送相手の名前をlambdaに流し
lambdaがDynamoDBにクエリを行い、電話番号が見つかった場合はAmazonConnectに電話番号を返し、転送を行う。
という流れです。
こうすることで、AmazonConnectに紐づく電話番号を1つ覚えておくだけで、DynamoDBに登録されている複数人の電話番号を覚えなくても、電話をかけることができるようになります。
Lexを作成する
AmazonConnectで利用するLexのボットを作成します。
Botの具体的な作成方法は本記事では紹介しないので、公式ドキュメントを参考にしてください
本人確認用のインテント
本人確認用インテントでは、対話形式で名字、名前、生年月日を取得します。
名字は以下の設定で取得します。
名前は以下の設定で取得します。
生年月日は以下の設定で取得します。
発信相手取得用のインテント
発信相手取得用のインテントでは、発信相手の名字、名前、発信相手の姓名が正しいかを取得します。
名字、名前の取得は先程と同様です。
発信相手の姓名が正しいかは以下の設定で取得します。
コンタクトフローを作成する
次にAmazonConnectのコンソールに移動して、コンタクトフローを作成します。
こちらについても、コンタクトフローについての具体的な説明は行いません。
詳しく知りたい場合は、公式ドキュメントを確認してください
こちらでは、Lexから受け取った発信者の情報と比較を行い、正しかった場合のみ次のフローに進むようにしています。
こちらでは、Lexから受け取った発信したい相手の姓名情報をlambdaに渡してDynamoDBでクエリを行い、発信したい相手の情報が見つかった場合は、発信相手に転送を行っています。
以下はAmazonConnectから呼び出されるlambdaです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
import { DynamoDBClient, QueryCommand } from "@aws-sdk/client-dynamodb"; // ES Modules import exports.handler = async function (event: any, context: any) { const client = new DynamoDBClient(); const name = `${event.Details.Parameters.lastName} ${event.Details.Parameters.firstName}`; // nameから空白を削除する const nameWithoutSpace = name.replace(/\s+/g, ""); const input = { TableName: process.env.TABLE_NAME, IndexName: "nameIndex", KeyConditionExpression: "#name = :name", ExpressionAttributeNames: { "#name": "name", }, ExpressionAttributeValues: { ":name": { S: nameWithoutSpace, }, }, }; const command = new QueryCommand(input); const response = await client.send(command); // phoneNumberから1文字目を削除して、+81に変換する const phoneNumber = response.Items[0].phoneNumber.S.slice(1); const phoneNumberWith81 = `+81${phoneNumber}`; console.log(phoneNumberWith81); console.log(response.Items); return { isFound: response.Items.length > 0, phoneNumber: phoneNumberWith81, }; }; |
まとめ
これで、上記で作成したコンタクトフローに紐づく電話番号を1つ覚えるだけで、対話形式でDBに登録されている相手に対して転送ができるようになりました。
“緊急時なのに携帯を持っていないし、相手の番号を覚えていない”という場合でも公衆電話から繋いでもらうことができるようになります。
今回本人確認をLexと対話形式で行っていますが、AmazonConnectにはVoice IDというものがあるそうで、こちらを使うと発信者の声紋で認証ができるそうです。
現在の構成だと、本人情報とAmazonConnectに紐づく電話番号が漏れてしまった場合のリスクがあるため、今後Voice IDを使って改善したいと考えています。
- 特定の時間あたりのlambda実行数をSlackに通知する - 2023-12-23
- 公衆電話からでも使える電話帳サービスをLEX + AmazonConnectで作ってみた - 2023-12-19
- SQSを使ってlambdaを10秒ごとに定期実行する - 2023-12-14
- Slack と AWS の電話番号登録アプリ – Bolt + CDK ソースコード解説 - 2023-03-26
- SlackとAWSを組み合わせた電話番号登録アプリの開発 – Boltフレームワーク+CDKで作ってみた - 2023-03-26