CloudWatchのアラームをTwilioで電話通知してみた

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちわ。トロワのその後を映像で見てみたいガノタ市田です。
前回に続きTwilioネタですが、今回は「CloudWatchのアラームをTwilioで電話通知」 してみたいと思います。

概要

全体的な仕組みとしては、まずCloudWatchの値を定期的に取得するスクリプトを作成します。 そのスクリプトの中でアラームと判断した場合はTwilioから電話通知するようにします。

S3の設定やTwilioアカウント開設、電話番号の購入などは完了しているものとします。まだの場合は前回のエントリを参考にしてみてください。

電話API Twilioの基本的な使い方を調べてみた | Developers.IO

手順

  • Twilioから電話がかかってくるようにする
  • CloudWatchのしきい値超過でTwilio APIを叩くスクリプトの作成
  • 上記スクリプトをサーバ内で動かす
  • 確認してみる

Twilioから電話がかかってくるようにする

Twilioの操作については、ドキュメントが整備されていて、管理画面からもアクセスすることができます。

01-docs

ここで「REST API: 通話を開始する」を見ると、下記のようにサンプルプログラムを見ることができます。

02-apisample

言語の箇所をクリックすると対応している各種言語のサンプルに切り替えることができます。

03-lang

今回は簡単に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の管理画面から確認できます。ダッシュボードから「アカウント詳細」 をクリックします。

06-account-datail

次の画面の「ライブクレデンシャル」 にあるACCOUNT SIDがAPIキーになります。

07-api

上記のうちSID以外のUrlToFromauth_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"?>
<Response>
<Say language="ja-JP" voice="alice">こんにちわ。サーバの停止が発生しました。</Say>
<Pause length="1"/>
<Say language="ja-JP" voice="alice">担当者のかたは、サーバの状態をご確認ください。</Say>
</Response>

電話番号の設定

Toは電話する宛先番号を指定します。今回は自分の電話番号にしました。
先頭2桁は国番号になるので日本の場合は+81から始まります。例えば通知先が携帯電話の090-1234-5678だった場合は先頭のゼロを除いた番号を付けた+819012345678という形になります。

Fromは電話をかける側の番号を指定します。その為、前回購入した電話番号を指定します。番号の指定の仕方はToと同様です。

auth_token

最後のauth_tokenは認証用の番号です。Twilioの管理画面に載っています。
下記の目玉アイコンをクリックするとマスクがなくなりトークン内容を確認できます。

04-authtoken

監視スクリプトの作成

今回は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を使えば更に活用の用途は広がると思います。

利用金額も非常に低額でスタートできますので、是非ご活用ください!

以上になります。