どうも、開発部のクラヴマガです。
弊社サービスも最近はAWSの様なクラウド環境でサービスを構築することが多くなりました。 そこで問題になるのが、障害などによる深夜対応・・・。 データセンターに物理サーバをおいていた頃は、データセンターから障害発生時に 電話連絡をもらっていたのですが、クラウド環境では別会社に頼むか、社内で人員を確保するか・・・、 とはいえリソースも原価もかけられないし・・・と悩んでいました。
調べてみるとAPI経由で電話やSMSを送信できるサービス「twilio」というものがありました。 これなら人員確保や外部委託しなくても実現できるかも。
というわけでさっそく試しました。
最終的にはアラートメールをトリガにして、担当者に電話連絡⇒応答者がプッシュボタンで返答⇒SMSで誰が対応を開始したか一斉送信 を行うつもり。
まず今回は、「電話で連絡」と「SMSでメッセージ送信」をやってみます。
事前準備
- トライアルアカウント作成 まずはtwilioへアクセスして、トライアルアカウントを作成。 ある程度は無料で電話やSMSを送れるみたいです。
- 続いて電話番号を購入 今回はSMSもテストしたかったので、米国の電話番号を取得しました(番号によってSMSができるものとできないものがあり、日本の電話番号はできない模様)
- ライブラリの設置
PHPで実装するつもりなので、
・PHP用のライブラリをダウンロード、サーバ上へアップロード
・APIライブラリよりphpのライブラリ(twilio-php-master.zip)を取得
・テスト用サーバへFTPアップロード・適当なディレクトリで展開
mkdir testTwilio mv <FTPアップロードPATH>/twilio-php-master.zip ./testTwilio/ unzip ./testTwilio/twilio-php-master.zip
電話をかけてみる
先程ライブラリを展開したディレクトリ(testTwilio)へ移動し、phpファイル(testCall.php)を作成。
require 'twilio-php-master/Services/Twilio.php'; $version = "2010-04-01"; $sid = '[AccountSid]'; $token = '[AuthToken]'; $phonenumber = '[Caller Number]'; // Instantiate a new Twilio Rest Client $client = new Services_Twilio($sid, $token, $version); try { // Initiate a new outbound call $call = $client->account->calls->create( $phonenumber, // The number of the phone initiating the call '[Reciveing Number]', // The number of the phone receiving call 'https://demo.twilio.com/welcome/voice/ja/' // The URL Twilio will request when the call is answered ); echo 'Started call: ' . $call->sid; } catch (Exception $e) { echo 'Error: ' . $e->getMessage(); }
※・[AccountSid]:アカウントセッティングよりAccountSIDを確認して設定 ・[AuthToken] :アカウントセッティングよりAuthTokenを確認して設定 ・[CallNumber]:事前準備で購入手続きをした電話番号を設定 ・[Reciveing Number]:ログインアカウント作成時登録した電話番号を設定
で、実行。
すんなり電話が掛ってきました。
電話にでると女性の声でテキスト読みあげてくれます。 設定・実装すれば固定メッセージの読み上げ、メールの内容なども読んでくれるみたいです。
SMSを送信する
同じディレクトリに今度はSMS送信用のphpファイル(testSms.php)を作成。
require 'twilio-php-master/Services/Twilio.php'; $version = "2010-04-01"; $sid = '[AccountSid]'; $token = '[AuthToken]'; // Instantiate a new Twilio Rest Client $client = new Services_Twilio($sid, $token, $version); $people = array( "[Reciveing Number]" => "Test User", ); foreach ($people as $number => $name) { $sms = $client->account->messages->sendMessage( "[CallNumber]", // the number we are sending to - Any phone number $number, // the sms body "○○さんが対応を開始しました。" ); // Display a confirmation message on the screen echo "Sent message to $name"; }
で、実行。
感想
なんかものすごく簡単です。 他にも電話同士をつないだり、コールセンターの電話受付の様に電話のダイヤルプッシュごとに処理を実行したりできる様なので、障害復旧の自動化なんかもできるかも・・・?
なんとなく感じはつかめたので、次回はプロトタイプを作成します!