すごいぜTwilio!イカスぜBeanstalk!

記事タイトルとURLをコピーする
twilio-logobeanstalk-logo

こんにちは、サービス開発グループの千葉(@kachina_t)です。 先日Twilio x AWS勉強会(Twilio API 勉強会 Vol.3)に参加してきました。 サーバーワークスでは、結構なアクセス数のIVRシステムの運用をしており 自前で何台ものAsteriskを管理するのが手間なので もっとラクができないかなと考えTwilioに目が向いたワケです。 ってのが建前で、なにかと『しゃべらせたがり』な僕としては 乗るしかない、Twilioのビッグウェ(ry それでは、今回の勉強会をふりかえりながら 簡単なサンプルを作成していきたいと思います。

Twilioについて

まずはTwilioについて、細かい説明はこちらを確認してください。 ざっくり言うと、音声通話アプリケーションの開発を容易にする為のSaaSです。 なんと、米大統領選でも利用された実績あり! 『米大統領選で使われた電話API「Twilio」、「選挙中1秒数100コール、終わればゼロ」に即対応』 自前で大量アクセスに耐えうるIVRシステムを構築した経験から この『秒間100コール』にはとても驚きました。

Beanstalkについて

これも細かい説明はこちらを確認してください。 ざっくり言うと、AWSのPaaSです。 HerokuやEngineYardとの比較は 以下を参照ください。 『Heroku と Engine Yard と Elastic Beanstalk

やること

BeanstalkでPHPの実行環境を構築し、そこにTwilioで実行するIVR処理のコードをデプロイする。

PHP実行環境構築の前準備

まずは、こちらを参考に『eb』コマンドの実行環境を整えます。 つぎに、適当な場所にアプリケーションディレクトリを作成してリポジトリの初期化をします。

$ mkdir ~/development/twilio
$ cd ~/development/twilio
$ git init

PHP実行環境の初期化

『eb init』を実行し、対話式で環境情報を入力していきます。

$ eb init
To get your AWS Access Key ID and Secret Access Key,
  visit "https://aws-portal.amazon.com/gp/aws/securityCredentials".
Enter your AWS Access Key ID (current value is "***************"): xxxxxxxxxxxxxxxxxxxx
Enter your AWS Secret Access Key (current value is "***************"): yyyyyyyyyyyyyyyyyy
Select an AWS Elastic Beanstalk service region.
Available service regions are:
1) US East (Virginia)
2) US West (Oregon)
3) US West (North California)
4) EU West (Ireland)
5) Asia Pacific (Singapore)
6) Asia Pacific (Tokyo)
7) Asia Pacific (Sydney)
8) South America (Sao Paulo)
Select:  (1 to 8): 6
Enter an AWS Elastic Beanstalk application name (auto-generated value is "twilio"): twilio
Enter an AWS Elastic Beanstalk environment name (auto-generated value is "twilio-env"): dev
Select a solution stack.
Available solution stacks are:
1) 32bit Amazon Linux running PHP 5.4
2) 64bit Amazon Linux running PHP 5.4
3) 32bit Amazon Linux running PHP 5.3
4) 64bit Amazon Linux running PHP 5.3
5) 32bit Amazon Linux running Node.js
6) 64bit Amazon Linux running Node.js
7) 64bit Windows Server 2008 R2 running IIS 7.5
8) 64bit Windows Server 2012 running IIS 8
9) 32bit Amazon Linux running Tomcat 7
10) 64bit Amazon Linux running Tomcat 7
11) 32bit Amazon Linux running Tomcat 6
12) 64bit Amazon Linux running Tomcat 6
13) 32bit Amazon Linux running Python
14) 64bit Amazon Linux running Python
15) 32bit Amazon Linux running Ruby 1.8.7
16) 64bit Amazon Linux running Ruby 1.8.7
17) 32bit Amazon Linux running Ruby 1.9.3
18) 64bit Amazon Linux running Ruby 1.9.3
Select:  (1 to 18): 2
Create an RDS DB Instance? [y/n]: n

PHP実行環境の起動

『eb start』を実行し、各リソースを起動します。

$ eb start

PHPの動作確認

$ echo "<?php phpinfo();n" >> index.php
$ git add .
$ git commit -m "PHPの動作確認をします"
$ git aws.push master

上記の『git aws.push master』を実行すると、実行環境へのデプロイが始まります。 それが完了すると『eb status』コマンドの結果が"Ready"と"Green"になるので 確認後URLにアクセスしてみましょう。

$ eb status

URL     : dev-xxxxxxxxxx.elasticbeanstalk.com
Status  : Ready
Health  : Green

自動音声応答スクリプトの作成

それでは、Twilioにしゃべらせる為のプログラムを作成しましょう。 先程の『index.php』を以下のとおり書き換えてください。

<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
<Response>
  <Say voice="woman">hello world</Say>
</Response>

この様に、TwilioのコードはXML形式で記載します。 これを『TwiML』と呼ぶそうです。(言及を避けます) 『Say』以外の要素については、こちらを確認ください。 これをデプロイし、ステータスが"Ready/Greenになるまで待ちます。

$ git add .
$ git commit -m "HelloWorldをしゃべらせます"
$ git aws.push master
...
$eb status
URL     : dev-xxxxxxxxxx.elasticbeanstalk.com
Status  : Ready
Health  : Green

 

Twilioの設定

Twilioにサインアップし、上部メニューから【電話番号】→【+81 50-xxxx-xxxx】を開き 『Voice Request URL』に、"スクリプトのURI"を入力、メソッドを"GET"とし保存します。

twilio-capture-1 twilio-capture-1

しゃべらせる

これだけで設定は完了です、それでは『050-xxxx-xxxx』へ電話をしてみましょう。

日本語でしゃべらせる

つぎに、日本語化してみたいと思います。 以下のとおり、『Say』要素に『language="ja-jp"』属性を追記します。

<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
<Response>
  <Say voice="woman" language="ja-jp">こんにちは せかい</Say>
</Response>

コミット → デプロイ

$ git add .
$ git commit -m "日本語化しました"
$ git aws.push master
...
$eb status
URL     : dev-xxxxxxxxxx.elasticbeanstalk.com
Status  : Ready
Health  : Green

ダイヤル操作を受け取る

最後に、IVRらしくダイヤル操作を受け取る処理を試したいと思います。 まず、以下のとおり『index.php』を編集してください。

<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
<Response>
  <Gather action="/gather.php" timeout="10" finishOnKey="#">
    <Say voice="woman" language="ja-jp">番号を入力し、シャープを押してください</Say>
  </Gather>
</Response>

次に、入力した値を受け取り処理する『gather.php』を作成します。

<?php echo '<?xml version="1.0" encoding="UTF-8"?>' ?>
<Response>
  <Say voice="woman" language="ja-jp">入力した番号は、<?php echo $_REQUEST['Digits'] ?>です"</Say>
</Response>

コミット → デプロイ

$ git add .
$ git commit -m "ダイヤル操作を読み上げるようにしました"
$ git aws.push master
...
$eb status
URL     : dev-xxxxxxxxxx.elasticbeanstalk.com
Status  : Ready
Health  : Green

ちなみに、以下の2点を試すと、だいぶ愉快なことになります。 ぜひぜひ - 4桁以上の数字を読ませる - 『シャープ』ではなく『#』を読ませる

まとめ

まず、XML形式のTwiMLを書くだけなのでメチャクチャ簡単です。 通話料に関しては、安いとは言えませんが 自前でAsteriskを複数台運用することと比較して考えれば、全然アリだと思います。 そして、Beanstalkを使えばインスタンスを起動して ssh接続し実行環境を構築する、この煩わしい作業が不要となります。 プログラマが、実ロジックを書くことだけに集中できる仕組みってのはステキですね! 便利な世の中になったものです。