TwilioDay 7

Twilio Studioいらず?プラモデルの様にコールフローをつくる方法

More than 1 year has passed since last update.


はじめに

Twilioは、電話をAPIで制御できる素晴らしいプラットフォームです。

とても便利なプラットフォームなのですが、

ユーザと対話させつつ外部システムと連携させたコールフローを作ろうと思ったら、

自分でサーバを用意し、Twilioが提供するヘルパーライブラリを学んでプログラムを書く必要がありました。

本記事では、プログラムを書かないでも手軽にコールフローが作れる方法を紹介します。


コールフロー

AWSインスタンスを操作するシンプルなヘルプデスクのコールフローを作ってみます。

下図のようなコールフローです。

qiita-twilio-callflow.png


フローを作る

フローが簡単に作れるところを見てもらいたいので、3分クッキング方式で、最初に使う部品(ノード)を全てキャンバスに置いてから、フローにしていきます。

take4.gif

このようにGUIで部品と部品をつないでいくだけでフローは出来上がりです。あとは部品の設定をすれば完成です。

各部品の役割は次の通りです。

部品
名前
説明

2017-12-06 13_58_44-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Voice In
Twilioから着信を受付けます

2017-12-06 13_59_02-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Call
TwilioにTwiMLを返します

2017-12-06 13_59_21-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Command
リモートサーバにSSHログインしてコマンドを実行し、結果を返します

2017-12-06 13_59_47-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Switch
条件分岐を作ります

2017-12-06 14_04_15-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Change
変数を設定・加工します

2017-12-06 14_00_26-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
Link
離れているノードを接続します

2017-12-06 13_59_36-frontops-18512bPCzo57HToAD.tmp - FrontOps.png
inject
起動時処理をおこないます


完成したフロー

設定が完了したフロー全体がこちらです。

qiita-twilio-callflow-all.png


  • 部品の設定内容については、後述のAppendixを見てください。


フローを公開する

設定を終えたフローをFrontOpsでデプロイすると、すぐにTwilioからの着信を受けて動かすことができます。

構成は以下のようになります。

qiita-twilio-callflow-design.png


  • 設定の中で、Ngrokを使ってURLを取得し、Twilioのコールバックに指定しています。


  • Ngrokは、NATやファイヤーウォール下にあるローカルアプリをインターネットに公開できるサービスです。FrontOpsに組み込まれていて、URL取得とTwilioのコールバック設定が簡単におこなえます。


動作概要


  1. ユーザが電話すると、Twilioがコールバック設定したURLにリクエストを投げます。


  2. FrontOpsはリクエストを受けると、コールフローのVoice Inノードからフローを開始します。

  3. コールフローの各ノードの間をmsgオブジェクトが受け渡しされていきます。


  4. Callノードでは、生成したTwiMLをTwilioにレスポンスとして戻し、Twilioからの次のリクエストを待ちます。


まとめ

PC一台で、簡単にコールフローを作って動かすことができました。


  • プログラムを書かないでコールフローを作成することができました

  • PC上で作成したコールフローを、そのままTwilioと連携させて動作させることができました


最後に

FrontOpsを使ってコールフローを作ると、Twilioの電話APIを使う敷居がだいぶさがったのではないでしょうか

今回のコールフローの中で、リモートサーバにSSHログインしてコマンド実行を組み込んでいますが、このことについて、ちょっと考えてみてください。

これができるということは、・・・つまり、なんでもできるということです。

例えば今回の例では、認証番号を決め打ちにしましたが、

サーバ内のテキストファイルをgrepしてチェックしたり、

LDAPを検索してチェックしたりも自由自在です。

インフラエンジニアの方など、

コマンドライン操作は得意だけど、プログラミングが得意ではない人にとって、

電話がプログラミング不要でコマンドライン操作と連携させることができるこの例が、新しい可能性を探る参考になれば幸いです。


Appendix: 設定説明


使ったもの


  • Twilioアカウント、電話番号

  • AWS CLIが使えるサーバ


    • SSHでログインできて、aws configure の設定が完了していること

    • 参考 AWS CLI の設定




  • FrontOps(セルフサービスを作れる一次対応ツール)


着信~認証


  1. 名乗った後に認証番号の入力を促すTwiMLを設定します。



    • {{{twilioVoiceUrl}}}は自動で設定されます。



  2. Twilioから送られたデータはmsg.payloadに入ります。

  3. ユーザが入力した値はmsg.payload.Digits に入ります。

  4. 認証番号は1234としています。

qiita-twilio-callflow-1c.png


メニュー

認証に成功したらメニューを案内して、選択されるのを待ちます。

qiita-twilio-callflow-2c.png


「1」が押された場合



  1. AWS CLIでインスタンス状態を取得します。

    mustacheにより{{{instanceId}}}msg.instanceIdで展開されます。

    runningstoppedといった状態だけわかればいいので、queryで出力を絞り込んでいます。

    aws ec2 describe-instances --output text --instance-ids {{{instanceId}}} \
    
    --query "Reservations[0].Instances[0].Status.Name"

    コマンドの実行結果は、msg.payload

    {
    
    stdout: "stopped",
    stderr: "",
    code: 0
    }

    という形で保存されます。



  2. コマンド実行完了を報告するTwiMLを設定します。

    mustacheにより{{{payload.stdout}}}msg.payload.stdoutで展開されます。

    手抜きしてコマンドの出力をそのまま読み上げに使っています。


qiita-twilio-callflow-3b.png


「2」が押された場合



  1. AWS CLIでインスタンスを起動します。mustacheにより{{{instanceId}}}msg.instanceIdで展開されます。

    aws ec2 start-instances --instance-ids {{{instanceId}}}
    


  2. コマンド実行完了を報告するTwiMLを設定します。


qiita-twilio-callflow-4b.png


「3」が押された場合



  1. AWS CLIでインスタンスを停止させます。mustacheにより{{{instanceId}}}msg.instanceIdで展開されます。

    aws ec2 stop-instances --instance-ids {{{instanceId}}}
    


  2. コマンド実行完了を報告するTwiMLを設定します。


qiita-twilio-callflow-5b.png


「その他」が押された場合


  1. 終了の挨拶をして、電話を切断するTwiMLを設定します。
    qiita-twilio-callflow-6b.png