[Amazon Connect] 任意時間で電話の呼び出しコールを中断する方法を考えてみた

Amazon Conenctで電話をしたとき、呼び出しコールをして一定時間応答がなければ電話を切る、という動作の実現方法を考えてみました。

なお、何もしない場合は、約60秒間ずっと呼び出し続けます。

前提

LambdaからAmazon ConnectのAPIを呼び出して電話発信する場合です。

まずはAmazon ConnectのAPIを調べる

通話終了のAPIはある

stop_contact()を使えば、通話を終了できることが分かりました。ただしこれは、「コール中・通話中お構いなしに終了」します。

つまり、現在の通話状態を取得するAPIがあれば、電話発信して一定時間後に次の操作ができます。

  • 呼び出し中:通話終了APIを使って通話終了する
  • 通話中:何もしない(通話を続ける)

しかし、現在の通話状態を取得するAPIは無い

Amazon Connectに「現在の通話状態を取得するAPI」は無さそうです……。

自分でステータス管理をしてみる

現在の通話状態を知るため、「通話開始したどうか」のフラグを自分で用意してみます。

get_contact_attributes()を使えば、属性取得ができます。

これを利用して、次の方法で電話の呼び出しを中断させてみます。

  1. Lambdaを実行し、Amazon ConnectのAPIを叩いて電話発信させる
    • このとき、AttributesisTalking=falseをセットしておく
  2. Lambdaはsleep()を使って任意時間だけスリープさせておく
  3. ユーザが電話に応答したとき、問い合わせフローでAttributesisTalking=trueをセットする
  4. Lambdaで get_contact_attributes() を実行してAttributesを取得する
    • isTalkingfalseのとき、ユーザは電話に応答してないと判断し、stop_contact()で発信を止める
    • isTalkingtrueのとき、ユーザは電話に応答していると判断し、何もしない

やってみた

全体的な仕組みは下記を参考にしてください。

問い合わせフロー

問い合わせ属性の設定は下記にしています。

  • テキストの使用
    • 宛先キー: isTalking
    • 値: true

Lambdaのコード

Lambdaのコードは下記です。5秒待ちしているため、Lambdaのタイムアウト時間は10秒ぐらいに設定しておきます。

課題

この仕組みは次の課題があります。実際に使う場合は、このあたりを解決する、もしくはリスクとして受け入れる必要があります。

呼び出しコールを待つ時間を厳密には設定できない

任意秒数はLambda側でSleepする時間であり、実際に呼び出しコールをしている時間ではないため。

試してみると、「Lambda実行開始〜スマホに着信がくるまで」が約3秒だったため、「呼び出しコールがなっていた時間」は約2秒でした。

タイミングによっては、ユーザーが電話に応答した直後に、電話が切れる可能性がある

ユーザが応答してから問い合わせフローでisTalking=trueをセットするまでの間に、Lambdaがget_contact_attributes()を実行する可能性がゼロではないため。(確率は結構低いとは思いますが……。)

さいごに

それっぽいことはできましたが、Amazon Connectで正式に設定できれば嬉しいですね!

参考