読者です 読者をやめる 読者になる 読者になる

スプーキーズのちょっとTech。

SPOOKIES社内のより技工的な、専門的なブログページです。

twilioとAWS Lambdaで自分に電話をかけてみた

こんにちは。

最近体重の増加が止まりません。秋ですねー。 逆に電話の着信が減った気がします。 前者を治す方法は皆目検討がつきませんが、後者なら解決できそうです。

そこで、 「slackでコマンド命令を与えると、自分の電話が鳴ってカラオケに誘われる。」 ってのをやってみたいと思います。

twilio

twilioとは「クラウド通信企業」であり、プログラムを使って簡単に電話がかけられるAPIを提供している会社です。 本社はアメリカにあり、日本ではKDDIウェブコミュニケーションズさんが代理店としてサービスを提供しています。

f:id:spookies-nishimura:20161123041537p:plain

お試し期間ならクレジットカード登録もいらないので、気軽に試せますね。

API利用するにあたって必要なもの

  1. twilioアカウント登録
  2. 050電話番号の取得
    • この番号からかかってくるようになります。(お試しでも取得できました)
  3. 認証用AccessTokenの確認
    • コンソールダッシュボードに表示されているのでコピっときます。

サンプルプログラムを試す

ドキュメントもしっかり整備されてます。

今回は、AWSのLambdaにプログラムを置きたかったので、Nodeで書くことにします。 https://jp.twilio.com/docs/quickstart/node/programmable-voice
↑に記載された通りに書き換えてローカルPC上で動かすだけで、電話がかかってきました。

書き換えたのは以下だけ

  • accountSid
  • authToken
  • to
  • from

実に簡単。

音声レスポンス命令の作成とアップロード

電話がかかってきた際に、特定の文言を喋らせたり、音楽データを流したり、通話を録音したりすることができます。 それを制御するのが、TWIMLと呼ばれるXMLです。

<Say>: 発信者にテキストを読み上げます。
<Play>: 発信者に音声ファイルを再生します。
<Record>: 通話や通話の一部を録音します。
<Gather>: 発信者がダイヤルした数字を取得します。
<Dial>: 相手の電話番号またはカンファレンスに電話をかけ、発信者を接続します。
<Sms>: 通話中に SMS メッセージを送信します。

自分で設定した音声レスポンスを使う場合はアップグレードが必要みたいです。 管理画面から、クレジットを登録して、2000円だけ入れてみました。

f:id:spookies-nishimura:20161123041637p:plain

今回は カラオケに誘われる 為に、以下の内容のxmlファイルをサーバ(amazon S3)にアップロードし、公開設定を行いました。

<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice">let's go karaoke</Say>
</Response>

プログラム書き換え

xmlのアップロードが完了したので先程のプログラム内の url 箇所を S3にアップしたxmlの公開urlに書き換えます。

client.calls.create({
    url: 'https://xxxxxx.xxxxxx/xxxxxx.xml',

Debugger

プログラムを動かしたら電話はかかってきたのですが、 「アプリケーションエラーが発生しました」とアナウンスされました。

おやおや?と悩んでいたら、twilioの管理画面にDebugger機能があったので見てみました。

f:id:spookies-nishimura:20161123041748p:plain

f:id:spookies-nishimura:20161123041801p:plain

むむ?POSTでアクセスに行っているではないか・・。 デフォルトではこのような挙動になるようです。

プログラムを修正して、methodにGETを指定します。

client.calls.create({
    url: 'https://xxxxxx.xxxxxx/xxxxxx.xml',
    method: 'GET',
    ...

これで無事に読み上げてくれました。

AWS Lambdaにプログラムを配置

Lambdaは最近よく聞くサーバレスアーキテクチャ。 リクエスト待受するために常にサーバを立てておくのではなく、必要な時に呼び出されて実行プログラムが起動する仕組み。イベントドリブンな感じ。

今回は、

  • API gateway
  • Lambda

を組み合わせ、作成したURLが叩かれた時に先程のプログラムが動くようにしました。

Lambda関数

Lambda関数として動かす為に、先程のプログラムに handler の関数名を指定します。

exports.handler = function(event, context) {
    // プログラム
    ...
}

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/nodejs-prog-model-handler.html

NodeプロジェクトとしてZip圧縮

Lambdaでは、node_modulesも含めてアップする必要があるため、zipに固めます。

$ zip -r index.zip index.js node_modules

Lambdaにアップロード

  1. Select blueprint templateのようなものですかね。今回はAPI Gatewayと連携するので「api-gateway-authorizer-nodejs」を選びました

  2. Configure triggers API Gatewayを選択

  3. Configure function

Name: callme
Runtime: Node.js 4.3
Code Entry Type: Upload a .ZIP file
    先程固めたzipをアップロード
Hander: index.hander // 先程のプログラム(index.js)をhandlerの名でexportしたので。ファイル名やhandler名が異なってるとエラーになるので注意。
Role: create new role from template
Role Name: test
残りはデフォルト

API Gateway

  1. APIを作成して、GETをLambdaで作成したcallmeファンクションと紐付け
  2. APIのデプロイで、公開(stageは新規作成) するとURLが手に入ります!!

slackのコマンドでプログラムを呼び出そう

さて、呼び出しURLが決まったので、これを直接呼び出してもいいんですが、 どうせならSlackから特定のコマンドを入力した時に、呼び出すようにしてみましょう。

slackのAppDirectoryで Slash Commands を選択。

f:id:spookies-nishimura:20161123042025p:plain

叩いてみたら 電話かかってきましたー

まとめ

少し今更感もありますが、twilioもLambdaも興味あったけど使ったことがなかったので遊んでみました。

サービスでアカウント登録後に電話がかかってきて、音声で流れてきたコードを入力して完了という流れがたまにありますが、twilio使ってるんですかね?

コールセンターや受付サービスなどたくさんの事例があるみたいです。
サーバ監視で障害発生したら電話で叩き起こすってのもよくありですが、いいですね。
遅刻メンバーを叩き起こす・・。

さて、寒くなってきましたが、皆さん風邪にはお気をつけください。
では一人カラオケへ行こうかな。いやジムですかね。
それでは、失礼します。