Amazon SNS – Twilioゲートウェイ Labrie(仮)
よく訓練されたアップル信者、都元です。最近社内でTwilioが空前の大ブームになっております。一言で言ってしまえば、APIを叩くことによってどこかに電話を掛けられる、というシステムです。音声については、OSXに標準で入っているsayコマンドのような音声合成が可能ですので、音声ファイルは特に用意しなくても大丈夫です *1。
さて、このTwilioですが、色んな使い道が思いつきますね。テレク(検閲削除)
Amazon SNS meets Twilio
しかしまぁ、目下ガチでAWS屋をしている身としますと、やっぱりAWSとのインテグレーションを実現してみたい。そうすると、Amazon SNSとの相性が非常に良さそうです。SNS Topicにメッセージがpublishされると電話が鳴る。想像しやすいですね。
こんなインターフェイスがあれば良いのですが、残念ながら、まだありません。よし、無ければ作りますよ。
やっぱり名前はまだない
はい、コードネームはLabrie(ラブリエ)です。正式名称は然るべき人のアクション待ち。
Labrieのアーキテクチャ
要するに、TwilioのSNSアダプターを作ってEC2にデプロイすればいいんでしょ、ということで、こんなことを考えてみました。
まずはSNSトピックを作って、HTTPエンドポイントとしてLabrieサーバを登録しておきます。
その上で、誰か(人でもシステムでも)がSNSにメッセージをpublishしたら、SNSがHTTPによってLabrieサーバを叩き、そのメッセージを変換してTwilio APIに投げる。結果として電話が鳴る。明快ですね。
以上のこのシステム環境は、CloudFormationテンプレートで一発作成が可能です。何が凄いって、ココですよ。CloudFormationカコイイ…。
あなたの環境にもLabrieを
はいはーい、お待ちかねの共有タイム。こいつを無料公開しちゃいます。既に、CloudFormationのテンプレートと、そのテンプレで内部的に必要なAMIはpublicな状態で置いてあります。つまり、AWSアカウントさえ持っていれば、約10分 *2であなたの環境にLabrieが立ち上がります。構築して試してすぐ片付ければ、たいしてお金も掛からないので、是非試してみてください。1時間以内に終わる実験だと思うので、AWSの課金は10円も掛からないはずです。
雑多な前準備
まずは、リージョン決めてください。まぁ日本在住ならap-northeast-1で決まりかと思いますが。Labrieはどのリージョンでも動きます。
また、そのリージョンのEC2にKeyPairを作っておいてください。既に作成済みの方は、そのキーを使い回しても構いません。
次に、Twilioのサインアップを済ませ、ACCOUT SIDとAUTH TOKEN及び電話番号を取得しておいてください。
また、SNSのManagement Consoleから、トピックを1つ作成しておいてください。ここではlabrie-testという名前にしました。このトピックは、先ほど決めたリージョンに作成してください。(重要)
Labrieの起動
CloudFormationのManagement Consoleより、スタックを作成します。Create Stackボタンをクリック。
Stack Nameは適当に「labrie」とかにしておきましょうか。Templateは一番下の「Provide a Template URL」を選択し、URLとして以下を入力します。
https://s3-ap-northeast-1.amazonaws.com/cm-cfn-templates/labrie/labrie-0.1.template
続いて、Labrieの設定(CloudFormationのパラメータ定義)を行います。4点だけ修正/記入が必須です。
- TwilioAccountSidに、TwilioのACCOUNT SIDを指定してください。
- TwilioAuthTokenに、TwilioのAUTH TOKENを指定してください。
- CallFromに、Twilioの発信者番号を指定してください。(例:+8150-XXXX-XXXX)
- KeyNameに、先ほど確認したEC2のKeyPair名を指定してください。
その他のパラメータはデフォルトでOKです。が、一応解説。
- LabrieInstanceTypeは、サーバのEC2インスタンスタイプの指定です。t1.microでも動かないことは無いですが、中ではJavaアプリが動いているので、m1.small推奨。
- SSHLocationは、EC2サーバにSSH接続できるネットワークブロック指定(CIDR)です。
次の、タグ設定の画面はデフォルトのまま飛ばして構いません。
最後に設定のチェックを行い、Continueボタンをクリックします。ここからは自動で環境構築です。10分ほど、そのままお待ち下さい。4〜5分程度でステータスはCREATE_IN_PROGRESSからCREATE_COMPLETEに変化しますが、そこからアプリケーションが完全に稼働するまで、さらに数分かかります。
約10分程度経過したら、表示のRefreshを行い *3、ステータスがCREATE_COMPLETEとなっていることを確認してください。その上で、Outputsのタブに移動すると、LabrieURLというURLが手に入ります。実運用する際は、独自ドメインからこのドメインに対してCNAMEを貼れば良いでしょう。
このURLに飛んで、「ok」と言われれば、起動成功です。okが帰ってこなかったら、もうしばらく待ってみてください。
つかいかた
http://hostname/twilio/{telnum}
LabrieのURLは、上記のような構成になっています。{telnum}の部分を自分の携帯電話の番号等にして(ただし、日本の電話番号の場合は先頭の0を%2B81に置き換える)、アクセスしてみてください *4。やはりOKと言われれば準備完了。これがあなたの携帯電話を表す「SNSエンドポイント」となります。
ではこのエンドポイントで、SNSのトピックを購読してみましょう。先ほどのSNSのManagement Consoleから先ほど作成したトピックを選んでCreate New Subscriptionボタンをクリックします。
そして、ProtocolはHTTPに設定し、Endpointには先ほどのURLを入力、そしてSubscribeボタンをクリックします。
この状態ではまだ購読は完了していません。SNSのSubscribeには確認(Confirm)の作業が必要だからです。
と、数秒後に、何と電話が掛かってきます! おおう、ラブリー息子!
「Amazon SNS - Twilioゲートウェイの購読確認を行います。購読を行う場合は1を、購読を中止する場合は9を押してください。」
ということで、キーパッドで1を入力。その後、ちょっと嫌な数秒の間があるんですが *5、辛抱強く待機。
「確認を完了いたしました。ありがとうございました。」
で、電話が切れます *6。SNSのコンソールをRefreshしてみると、confirmも完了しているようです。
では、Topicにメッセージを送ってみましょう。実はここの仕様は詰めがまだ緩いと思っているんですが。現状はSubjectは無視されます。また、Message本文はTwiML: the Twilio Markup Languageで記述します。
<Response> <Say voice="woman" language="ja-jp">キョウスケです。こんにちは!こんにちは!</Say> </Response>
そしてPublish Messageボタンをぽちっ!
また会ったね! ラブリー息子、こんにちは!こんにちは!
「キョウスケです。こんにちは!こんにちは!」
後片付け
CloudFormationで環境構築をすると、後片付けが楽なのも嬉しいところです。先ほど作成したスタックを選んで、Delete Stackボタンをクリックしてください。片付けにも数分かかりますが、全ての関連リソースを跡形もなく削除してくれます。
今後の展開
さて、こいつはどう料理してくれましょうかね。CloudWatchと連携させたりすると、「HOOT24(有人監視)」の廉価版「HOOT24ライト(無人監視)」になったりしそうだなぁ。
あと、人間が「Twilioに電話」を掛けるとSNSの「特定のTopicにメッセージがpublish」される、という、今回の逆の流れも使い道がありそうなので、実装してみようかな、とか。
とりあえず、本プロダクトにご興味を持って頂けました場合はお問い合わせなど頂ければと思います。