[Amazon Connect] 任意時間で電話の呼び出しコールを中断する方法を考えてみた
Amazon Conenctで電話をしたとき、呼び出しコールをして一定時間応答がなければ電話を切る、という動作の実現方法を考えてみました。
なお、何もしない場合は、約60秒間ずっと呼び出し続けます。
前提
LambdaからAmazon ConnectのAPIを呼び出して電話発信する場合です。
まずはAmazon ConnectのAPIを調べる
通話終了のAPIはある
stop_contact()
を使えば、通話を終了できることが分かりました。ただしこれは、「コール中・通話中お構いなしに終了」します。
つまり、現在の通話状態を取得するAPIがあれば、電話発信して一定時間後に次の操作ができます。
- 呼び出し中:通話終了APIを使って通話終了する
- 通話中:何もしない(通話を続ける)
しかし、現在の通話状態を取得するAPIは無い
Amazon Connectに「現在の通話状態を取得するAPI」は無さそうです……。
自分でステータス管理をしてみる
現在の通話状態を知るため、「通話開始したどうか」のフラグを自分で用意してみます。
get_contact_attributes()
を使えば、属性取得ができます。
これを利用して、次の方法で電話の呼び出しを中断させてみます。
- Lambdaを実行し、Amazon ConnectのAPIを叩いて電話発信させる
- このとき、
Attributes
にisTalking=false
をセットしておく
- このとき、
- Lambdaは
sleep()
を使って任意時間だけスリープさせておく - ユーザが電話に応答したとき、問い合わせフローで
Attributes
にisTalking=true
をセットする - Lambdaで
get_contact_attributes()
を実行してAttributes
を取得するisTalking
がfalse
のとき、ユーザは電話に応答してないと判断し、stop_contact()
で発信を止めるisTalking
がtrue
のとき、ユーザは電話に応答していると判断し、何もしない
やってみた
全体的な仕組みは下記を参考にしてください。
問い合わせフロー
問い合わせ属性の設定は下記にしています。
- テキストの使用
- 宛先キー:
isTalking
- 値:
true
- 宛先キー:
Lambdaのコード
Lambdaのコードは下記です。5秒待ちしているため、Lambdaのタイムアウト時間は10秒ぐらいに設定しておきます。
課題
この仕組みは次の課題があります。実際に使う場合は、このあたりを解決する、もしくはリスクとして受け入れる必要があります。
呼び出しコールを待つ時間を厳密には設定できない
任意秒数はLambda側でSleepする時間であり、実際に呼び出しコールをしている時間ではないため。
試してみると、「Lambda実行開始〜スマホに着信がくるまで」が約3秒だったため、「呼び出しコールがなっていた時間」は約2秒でした。
タイミングによっては、ユーザーが電話に応答した直後に、電話が切れる可能性がある
ユーザが応答してから問い合わせフローでisTalking=true
をセットするまでの間に、Lambdaがget_contact_attributes()
を実行する可能性がゼロではないため。(確率は結構低いとは思いますが……。)
さいごに
それっぽいことはできましたが、Amazon Connectで正式に設定できれば嬉しいですね!