CloudWatchのアラームをTwilioで電話通知してみた
こんにちわ。トロワのその後を映像で見てみたいガノタ市田です。 前回に続きTwilioネタですが、今回は「CloudWatchのアラームをTwilioで電話通知」 してみたいと思います。
概要
全体的な仕組みとしては、まずCloudWatchの値を定期的に取得するスクリプトを作成します。 そのスクリプトの中でアラームと判断した場合はTwilioから電話通知するようにします。
S3の設定やTwilioアカウント開設、電話番号の購入などは完了しているものとします。まだの場合は前回のエントリを参考にしてみてください。
電話API Twilioの基本的な使い方を調べてみた | Developers.IO
手順
- Twilioから電話がかかってくるようにする
- CloudWatchのしきい値超過でTwilio APIを叩くスクリプトの作成
- 上記スクリプトをサーバ内で動かす
- 確認してみる
Twilioから電話がかかってくるようにする
Twilioの操作については、ドキュメントが整備されていて、管理画面からもアクセスすることができます。
ここで「REST API: 通話を開始する」を見ると、下記のようにサンプルプログラムを見ることができます。
言語の箇所をクリックすると対応している各種言語のサンプルに切り替えることができます。
今回は簡単にcurl
の場合で作ってみたいと思います。curlのサンプルは下記の通りとなります。
既に上記の状態で自分のアカウントのAPIキーが入っています。下記で[ACCOUNT SID]
と記載している箇所に、実際には自分のAPIキーが記載されています。
$ curl -XPOST https://api.twilio.com/2010-04-01/Accounts/[ACCOUNT SID]/Calls.json \ --data-urlencode "Url=http://demo.twilio.com/docs/voice.xml" \ --data-urlencode "To=+14155551212" \ --data-urlencode "From=+14158675309" \ -u '[ACCOUNT SID]:your_auth_token'
APIキーである「ACCOUNT SID」 の値はTwilioの管理画面から確認できます。ダッシュボードから「アカウント詳細」 をクリックします。
次の画面の「ライブクレデンシャル」 にあるACCOUNT SIDがAPIキーになります。
上記のうちSID
以外のUrl
、To
、From
、auth_token
の各値を自分の環境用の値に修正します。それぞれの設定内容を見ていきます。
URL設定
URL
は前回作成したS3のURLを指定します。ちなみに今回は下記のようなXMLファイルalert.xml
にしてみました。
その為、今回指定したURLはhttps://s3-ap-northeast-1.amazonaws.com/twiliobucket2016/alert.xml
という形になります。
<!--?xml version="1.0" encoding="UTF-8"?--> こんにちわ。サーバの停止が発生しました。 担当者のかたは、サーバの状態をご確認ください。
電話番号の設定
To
は電話する宛先番号を指定します。今回は自分の電話番号にしました。
先頭2桁は国番号になるので日本の場合は+81
から始まります。例えば通知先が携帯電話の090-1234-5678
だった場合は先頭のゼロを除いた番号を付けた+819012345678
という形になります。
From
は電話をかける側の番号を指定します。その為、前回購入した電話番号を指定します。番号の指定の仕方はTo
と同様です。
auth_token
最後のauth_token
は認証用の番号です。Twilioの管理画面に載っています。
下記の目玉アイコンをクリックするとマスクがなくなりトークン内容を確認できます。
監視スクリプトの作成
今回はCloudWatchのCPU使用率を監視して、しきい値以上(95%以上)の値になったら電話通知するスクリプトにしています。スクリプト内容は下記です。 curlコマンドで指定している変数の内容は上記で指定した内容に修正してください。S3のURLも環境に合わせて修正してください。
#!/bin/bash # CloudWatch settings NAMESPACE=AWS/EC2 INSTANCE_ID=`curl -s http://169.254.169.254/latest/meta-data/instance-id` NOW=`date -u "+%Y-%m-%dT%H:%M:%SZ"` DATE_10M_AGO=`date -u -d "10 minute ago" "+%Y-%m-%dT%H:%M:%SZ"` START_TIME_10M_AGO=${2:-$DATE_10M_AGO} END_TIME=${3:-$NOW} PERIOD=300 METRIC=${1:-CPUUtilization} THRESHOLD=95 REGION=ap-northeast-1 # Twilio settings ACCOUNT_SID=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx S3URL=https://s3-ap-northeast-1.amazonaws.com/your-bucket/alert.xml TO_PHONE=xxxxxxxxxx FROM_PHONE=xxxxxxxxxx AUTH_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx # Action CPU_UTILS=$(aws cloudwatch get-metric-statistics \ --namespace ${NAMESPACE} \ --metric-name ${METRIC} \ --start-time ${START_TIME_10M_AGO} \ --end-time ${END_TIME} \ --period ${PERIOD} \ --statistics "Average" \ --dimensions Name=InstanceId,Value=${INSTANCE_ID} \ --query "Datapoints[*].[Average]" \ --region ap-northeast-1 \ --output text) if [ `echo "${CPU_UTILS} > ${THRESHOLD}" |bc` == 1 ]; then curl -XPOST https://api.twilio.com/2010-04-01/Accounts/${ACCOUNT_SID}/Calls.json \ --data-urlencode "Url=${S3URL}" \ --data-urlencode "To=+81${TO_PHONE}" \ --data-urlencode "From=+81${FROM_PHONE}" \ --data-urlencode "Method=GET" \ -u "${ACCOUNT_SID}:${AUTH_TOKEN}" fi
尚、このスクリプトは動作確認用のものですので、自己責任でのご利用をお願いします。
監視スクリプトをサーバ内で動かす
上記のスクリプトを監視したいサーバに設置して、cronに登録して定期チェックさせます。 尚、このスクリプトの場合CloudWatchの権限が必要になるので、IAM Roleなどに下記の権限を付けておきます。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1455254031000", "Effect": "Allow", "Action": [ "cloudwatch:GetMetricStatistics", "cloudwatch:ListMetrics", "cloudwatch:PutMetricData", "ec2:DescribeTags" ], "Resource": [ "*" ] } ] }
確認してみる
では、実際に確認してみます。
確認の為、スクリプト内のTHRESHOLD=95
の箇所をTHRESHOLD=0
などにして、わざとアラートになるようにします。
(動作確認なので上記スクリプトを直接実行してもいいと思います。)
設定した自分の電話番号にTwilioから電話がかかってきて、作成したメッセージが流れれば完了です。
最後に
Twilioを使うと簡単にアラートの自動電話通知を行うことができました。 他にもTwilioは電話した内容を録音したり、キー入力を受け付けることができたりと色々なことができます。 今回はEC2を対象にしましたが、Lambdaを使えば更に活用の用途は広がると思います。
利用金額も非常に低額でスタートできますので、是非ご活用ください!
以上になります。