24時間365日フルマネージドホスティングサービスのデイーネット

[技術ブログvol.27] オートスケーリングのトラフィックを自動監視する方法

EC2はトラフィック流量が従量課金なので、気になる場合はCloudWatchで転送量を監視している方は多いと思います。

従来のような使い方の場合、インスタンスを作ってから、手動でそのインスタンスに対して個別にNetworkOutの監視を設定していくことになります。

オートスケーリングのトラフィックを管理するという問題

しかし、オートスケーリングを使っていると、任意のタイミングで自動でインスタンスが作られるので、手動で監視を設定していくということが、ほぼ不可能です。

そんな時は、クラウドらしくAWS CLIでAPIを使って、NetworkOutの監視も自動設定できるようにしてみます。

CloudWatchへのアラーム登録(スケールアウト時)

AWSで監視といえばCloudWatchです。
今回はLinux(CentOS6)のインスタンスに対して、CloudWatchの設定を行っていきます。

このCloudWatchに対して、スケールアウト時に自動でアラーム登録することを考えます。
アラーム登録するAWS CLIのコマンドですが、以下の様な内容で登録しようと思います。

aws cloudwatch put-metric-alarm \
--region ap-northeast-1 \
--alarm-name AutoScaring-TrafficOutAlert \
--alarm-description "Alarm when AutoScailing Instance TrafficOut exceeds 1 GBytes" \
--metric-name NetworkOut \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 1000000000 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=InstanceId,Value=$EC2_INSTANCE_ID \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:ap-northeast-1:AWSアカウントID:testalarm \
--unit Bytes

主な内容は以下です。

  • 特定インスタンスのトラフィック転送量が1GBを超えたらtestalarmに通知
  • リージョンはTokyoリージョン
  • 監視間隔は5分(300秒)
  • alarm-nameは適当なものを設定して下さい。
  • 対象のAWSアカウントリージョン監視間隔などはご利用環境に合わせて修正して下さい。

CloudWatchへのアラーム登録(スケールイン時)

オートスケーリングですから、スケールインした時も自動でアラーム設定が削除されるようにします。

    aws cloudwatch delete-alarms \
--region ap-northeast-1 \
--alarm-names AutoScaring-TrafficOutAlert
  • alam-namesは登録時のalarm-nameと同じものを指定しています。
  • namesnameで微妙に違いますのでご注意下さい!

後は、これらを元に起動スクリプトとしてサーバに登録してやればアラーム登録の部分は完成です。

起動スクリプト

起動スクリプトは以下のような感じです。

# vi /etc/init.d/as-traffic-alarm
#!/bin/sh
# chkconfig: 2345 99 10
# description: CloudWatch Alarm for AutoScalingTraffic CREATE and DELETE

EC2_INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)
PROG=as-traffic-alarm
LOCK=/var/lock/subsys/$PROG

case "$1" in
start)
touch $LOCK

aws cloudwatch put-metric-alarm \
--region ap-northeast-1 \
--alarm-name AutoScaring-TrafficOutAlert_$EC2_INSTANCE_ID \
--alarm-description "Alarm when AutoScailing Instance TrafficOut exceeds 1 GBytes" \
--metric-name NetworkOut \
--namespace AWS/EC2 \
--statistic Average \
--period 300 \
--threshold 1000000 \
--comparison-operator GreaterThanThreshold \
--dimensions Name=InstanceId,Value=$EC2_INSTANCE_ID \
--evaluation-periods 1 \
--alarm-actions arn:aws:sns:ap-northeast-1:AWSアカウントID:testalarm \
--unit Bytes
;;
stop)
aws cloudwatch delete-alarms \
--region ap-northeast-1 \
--alarm-names AutoScaring-TrafficOutAlert_$EC2_INSTANCE_ID

rm -f $LOCK
;;
*) break ;;
esac
  • 今回は、オートスケーリングで自動スケールアウトしたインスタンスのアラームをそれぞれ登録するので、自動でインスタンスIDを取得してアラーム名にセットできるようにしました。
  • AWSアカウントのIDや通知先はご利用のものをご指定下さい。

後は、起動スクリプトとして動くようにしておきます。

# chmod 755 /etc/init.d/as-traffic-alarm
# chkconfig --add as-traffic-alarm

ここまで準備ができたら、このサーバのAMIを作っておきます。
AMIの作成は普通に作るだけですので割愛します。

IAM設定

AWS CLIでAWSを操作するときは、CLIに適切な権限を持たせる必要があります。

権限の設定は、IAMという機能を使いますが、今回はその中のIAM roleを使っています。
今回は簡単に動作確認する為に、CloudWatchのフルアクセス権限のroleを作っています。

まず、IAMのマネージメントコンソールを開いて、Rolesの設定画面に移ります。

astraffic01.png

次に適当なRole名を設定します。

astraffic02.png

次に「Amazon EC2」を選択します。

astraffic03.png

今回は「CloudWatchFullAccess」を選択します。

astraffic04.png

次に、このAMIイメージからインスタンスが作成されるようにオートスケーリングを設定しておきます。

この作業は、特に変わったことはなく、普通にAWS上でAMIを作りオートスケーリングの設定をするだけです。
ただし、オートスケーリングの設定時(Launch Configurations作成時)に、起動するAMIには上記のIAM roleを指定することを忘れないようにしてください。

astraffic05.png

オートスケーリングの設定が終わって、インスタンスが作成された時に、こんな感じ(↓)でCloudWatchにアラームが登録されていれば完成です。
ascloudwatch.png

これで、オートスケーリングを使っていてもトラフィックのことを心配しなくてよくなりますね。

後は、サーバにiftopなどのツールを入れておけば、アラーム検知時にすぐにトラフィック状況を確認することができるので、適切な対処を取ることができるようになります。

ちなみに、スケールインでアラームも削除されますが、削除されたインスタンスのデータは、CloudWatchのMetricsの画面から確認が可能です。

技術ブログ中の人

課金状況が監視できる「Billing Alert」がCloudWatchで可能なので、併用して使うとさらに安心ですね。

  • このページの先頭へ

  • 東京本社
    〒105-0001東京都港区虎ノ門2-3-22 第一秋山ビル5F
    TEL:03-3591-8887 FAX:03-3591-8886
  • 大阪本社
    〒541-0041 大阪市中央区北浜2-6-11北浜エクセルビル5F
    TEL:06-6231-8887 FAX:06-6231-8897

  • 認証範囲はこちらをご覧ください。

Denet logo

クラウドサービス・データセンタ・高機能専有サーバ・共有サーバホスティングサービス 株式会社ディーネット
dot_bar