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
と同じものを指定しています。names
とname
で微妙に違いますのでご注意下さい!
後は、これらを元に起動スクリプトとしてサーバに登録してやればアラーム登録の部分は完成です。
起動スクリプト
起動スクリプトは以下のような感じです。
# 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
の設定画面に移ります。
次に適当なRole名を設定します。
次に「Amazon EC2」を選択します。
今回は「CloudWatchFullAccess」を選択します。
次に、このAMIイメージからインスタンスが作成されるようにオートスケーリングを設定しておきます。
この作業は、特に変わったことはなく、普通にAWS上でAMIを作りオートスケーリングの設定をするだけです。
ただし、オートスケーリングの設定時(Launch Configurations作成時)に、起動するAMIには上記のIAM role
を指定することを忘れないようにしてください。
オートスケーリングの設定が終わって、インスタンスが作成された時に、こんな感じ(↓)でCloudWatchにアラームが登録されていれば完成です。
これで、オートスケーリングを使っていてもトラフィックのことを心配しなくてよくなりますね。
後は、サーバにiftop
などのツールを入れておけば、アラーム検知時にすぐにトラフィック状況を確認することができるので、適切な対処を取ることができるようになります。
ちなみに、スケールインでアラームも削除されますが、削除されたインスタンスのデータは、CloudWatchのMetricsの画面から確認が可能です。
課金状況が監視できる「Billing Alert」がCloudWatchで可能なので、併用して使うとさらに安心ですね。