SlideShare a Scribd company logo
AWSで構築したのだよ 
「ec2起動時にアラーム設定を 
クラウドウォッチに追加したい」
AWS構築時のノウハウを残し 
共有します 
 注意 
順番に記載されているため、前のテーマで記載さ 
れている内容が前提となる場合があります。
お品書き 
 ユーザのコンソール操作をログに残したい 
 ec2で自分のインスタンスIDが知りたい 
 ec2で自分についているタグを読み取りたい 
 ec2起動時にホスト名を変更したい 
 プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ 
トリクスに追加したい 
 ec2起動時にアラーム設定をクラウドウォッチに追加したい 
 Amazon Linuxのsshの認証方式を、ID/PWに変更したい。 
 VPNのプライベートネットワークでNTPを使いたい 
 プライベートネットワークのRDSにssh経由で接続したい 
 夜間にec2を落としたい 
 サーバーのシャットダウン時にログを退避したい
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
(1/6) 
 ec2を新しく起動したときに、自動でCloudwatch 
にアラーム設定を行い、監視対象とする。 
 ec2を停止するときに、Cloudwatchのアラーム設 
定を解除し監視対象から外す。
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
(2/6) 
 ユーザに、カスタムメトリクスに登録権限を付与 
します。 
設定方法は、カスタムメトリクス追加の回をご覧 
ください。
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
(3/6) 
 通知用のトピックを作成する
Awsで構築したのだよ 06 ec2インスタンス起動時にCloudWatchのアラームを追加する
 Subscribeしたメール宛てに、確認メールが届きま 
すのでリンクをクリックして確認を行います。
 Alertと同様に、CautionとWarningを作成します。 
 作成したAlert、Caution、WarningのTopic ARNをメ 
モします。これから作成するスクリプトに埋め込 
むのに使います。
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
(4/6) 
 アラートの追加と削除用のスクリプトを用意する。 
監視内容閾値備考 
StatusCheckFailed >= 0 サーバダウン時 
0(成功) か1(失敗) 
DiskUsage_root >=80 使用率が80%を超えたら 
CPUUtilization >=90 CPU使用率 
MemoryUsage >=90 メモリ使用率 
process_http <1 プロセスが無くなったら 
process_tomcat6 <1 プロセスが無くなったら
 アラート登録用スクリプトを用意します。 
# vi entryAlert.rb 
#!/usr/bin/env ruby 
# encoding: utf-8 
# 1.メトリクスの監視をアラートに登録する。 
# 
require 'rubygems' 
require 'aws-sdk' 
require './ec2tag' 
AWS.config(YAML.load(File.read("./aws.yml"))) 
@instanceID = `wget --no-proxy -q -O - http://169.254.169.254/latest/meta-data/instance-id` 
@ec2 = AWS::EC2.new().client 
# ec2のタグよりNAMEを取得します。 
@name = get_name_tag(@ec2, @instanceID) 
@system = 'SYSTEM01' 
@process1 = 'httpd' 
@process2 = 'tomcat6'
cw_config = [ 
{ 
"namespace"=> "AWS/EC2", 
"alert_level"=> "RED", 
"description"=> "SERVER DOWN", 
"metric_name"=> "StatusCheckFailed", 
"threshold"=> 0, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "YEL", 
"description"=> "DISK USAGE", 
"metric_name"=> "DiskUsage_root", 
"threshold"=> 80, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Warning"], 
},
{ 
"namespace"=> "AWS/EC2", 
"alert_level"=> "YEL", 
"description"=> "CPU Utilization", 
"metric_name"=> "CPUUtilization", 
"threshold"=> 90, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "YEL", 
"description"=> "MEMORY USAGE", 
"metric_name"=> "MemoryUsage", 
"threshold"=> 90, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], 
},
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "RED", 
"description"=> "PROCESS DOWN[#{@process1}]", 
"metric_name"=> "process_#{@process1}", 
"threshold"=> 1, 
"comparison_operator"=> "LessThanThreshold", 
"statistic"=> "Maximum", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "RED", 
"description"=> "PROCESS DOWN[#{@process2}]", 
"metric_name"=> "process_#{@process2}", 
"threshold"=> 1, 
"comparison_operator"=> "LessThanThreshold", 
"statistic"=> "Maximum", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
]
cw = AWS::CloudWatch.new 
cw_config.each do |config| 
alert_name = ["[#{@system}_#{config["alert_level"]}]", config["description"],  
"(#{@name}[#{@instanceID}])"].join("") 
cw.alarms.create( alert_name,{ 
"namespace"=> config["namespace"], 
"metric_name"=> config["metric_name"], 
"threshold"=> config["threshold"], 
"comparison_operator"=> config["comparison_operator"], 
"statistic"=> config["statistic"], 
"period"=> 300, 
"dimensions"=> [ { "name"=> "InstanceId", "value"=> @instanceID} ], 
"evaluation_periods"=> 1, 
"alarm_actions"=> config["arn"]} 
) 
end
 アラート削除用スクリプトを用意します。 
# vi deleteAlert.rb 
#!/usr/bin/env ruby 
# encoding: utf-8 
# 1.アラーを削除する。 
# 
require 'rubygems' 
require 'aws-sdk' 
require './ec2tag' 
AWS.config(YAML.load(File.read("./aws.yml"))) 
@instanceID = `wget --no-proxy -q -O - http://169.254.169.254/latest/meta-data/instance-id` 
@ec2 = AWS::EC2.new().client 
@name = get_name_tag(@ec2, @instanceID) 
@system = 'SYSTEM01' 
@process1 = 'httpd' 
@process2 = 'tomcat6'
cw_config = [ 
{ 
"namespace"=> "AWS/EC2", 
"alert_level"=> "RED", 
"description"=> "SERVER DOWN", 
"metric_name"=> "StatusCheckFailed", 
"threshold"=> 0, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "YEL", 
"description"=> "DISK USAGE", 
"metric_name"=> "DiskUsage_root", 
"threshold"=> 80, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Warning"], 
},
{ 
"namespace"=> "AWS/EC2", 
"alert_level"=> "YEL", 
"description"=> "CPU Utilization", 
"metric_name"=> "CPUUtilization", 
"threshold"=> 90, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "YEL", 
"description"=> "MEMORY USAGE", 
"metric_name"=> "MemoryUsage", 
"threshold"=> 90, 
"comparison_operator"=> "GreaterThanThreshold", 
"statistic"=> "Average", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], 
},
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "RED", 
"description"=> "PROCESS DOWN[#{@process1}]", 
"metric_name"=> "process_#{@process1}", 
"threshold"=> 1, 
"comparison_operator"=> "LessThanThreshold", 
"statistic"=> "Maximum", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
{ 
"namespace"=> "Custom/EC2", 
"alert_level"=> "RED", 
"description"=> "PROCESS DOWN[#{@process2}]", 
"metric_name"=> "process_#{@process2}", 
"threshold"=> 1, 
"comparison_operator"=> "LessThanThreshold", 
"statistic"=> "Maximum", 
"arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], 
}, 
]
cw = AWS::CloudWatch.new 
cw_config.each do |config| 
alert_name = ["[#{@system}_#{config["alert_level"]}]", config["description"],  
"(#{@name}[#{@instanceID}])"].join("") 
cw.alarms.delete( alert_name ) 
end
 タグ取得用スクリプトを用意します。 
# vi ec2tag.rb 
def get_tag_set(ec2, instance_id) 
tag_set = ec2.describe_instances(:instance_ids => 
[instance_id])[:instance_index][instance_id][:tag_set] 
return tag_set 
end 
def get_name_tag(ec2, instance_id) 
tag_set = get_tag_set(@ec2, @instanceID) 
tag_set.each do |tag| 
if /name/i =~ tag[:key] 
@name = tag[:value] 
return tag[:value] 
end 
end 
reruen "" 
end
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
 手動でスクリプトを実行し、動作を確認します。 
# ruby entryAlert.rb 
# ruby deleteAlert.rb 
(5/6)
ec2起動時にアラーム設定を 
クラウドウォッチに追加したい 
(6/6) 
 起動停止時にスクリプトを実行するように設定す 
る。
# vi /etc/init.d/entry-to-cloudwatch 
#!/bin/sh 
# chkconfig: 345 80 20 
# 
# This script will be executed *before* all the other holt scripts. 
# You can put your own terminate stuff in here. 
case "$1" in 
start) 
# Alert entry to Cloud Watch 
touch /var/lock/subsys/entry-to-cloudwatch 
/usr/bin/ruby /opt/aws/entry_alert.rb 
;; 
stop) 
# Alert delete form Cloud Watch 
rm -f /var/lock/subsys/entry-to-cloudwatch 
/usr/bin/ruby /opt/aws/delete_alert.rb 
;; 
*) 
echo "Usage: $0 {start|stop}" 
exit 1 
esac 
exit 0
パーミッションを変更 
# chmod 755 /etc/init.d/entry-to-cloudwatch 
自動起動の設定 
# chkconfig entry-to-cloudwatch on

More Related Content

PPTX
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
PDF
Awsをちゃんと使ってみた 監視編
PPTX
CloudWatch Logsについて
PDF
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
PDF
ZabbixによるAWS監視のコツ
PPT
Using Windows Azure
PDF
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
PDF
Amazon ElastiCacheのはじめ方
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsをちゃんと使ってみた 監視編
CloudWatch Logsについて
AWS Black Belt Techシリーズ AWS CloudTrail & CloudWatch Logs
ZabbixによるAWS監視のコツ
Using Windows Azure
ElastiCacheを利用する上でキャッシュをどのように有効に使うべきか
Amazon ElastiCacheのはじめ方

What's hot (20)

PDF
AWS Black Belt Techシリーズ AWS Lambda
PDF
ECS for Docker Meetup #4
PDF
Amazon ElastiCache - AWSマイスターシリーズ
PDF
Ansible入門
PDF
AWS Black Belt Tech シリーズ 2015 - AWS CodeCommit & AWS CodePipeline & AWS CodeD...
PDF
AWS OpsWorksハンズオン
PDF
Webサーバ勉強会03
PDF
Webサーバのチューニング
PPTX
中小規模サービスのApacheチューニング
PDF
当社のawsへの取組
PPTX
Apacheチューニング
PDF
AWS SDK for Haskell開発
PDF
Amazon Glacierのご紹介(機能編)
PDF
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
PDF
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
PDF
Amazon EC2 HPCインスタンス - AWSマイスターシリーズ
PDF
20120117 13 meister-elasti_cache-public
PDF
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
PDF
AWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
PPTX
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
AWS Black Belt Techシリーズ AWS Lambda
ECS for Docker Meetup #4
Amazon ElastiCache - AWSマイスターシリーズ
Ansible入門
AWS Black Belt Tech シリーズ 2015 - AWS CodeCommit & AWS CodePipeline & AWS CodeD...
AWS OpsWorksハンズオン
Webサーバ勉強会03
Webサーバのチューニング
中小規模サービスのApacheチューニング
当社のawsへの取組
Apacheチューニング
AWS SDK for Haskell開発
Amazon Glacierのご紹介(機能編)
AWS Black Belt Online Seminar 2017 AWS Elastic Beanstalk
AWS Black Belt Online Seminar 2017 Amazon DynamoDB
Amazon EC2 HPCインスタンス - AWSマイスターシリーズ
20120117 13 meister-elasti_cache-public
[AWS Summit 2012] クラウドデザインパターン#6 CDP クラウド監視編
AWS Black Belt Tech シリーズ 2015 - AWS Data Pipeline
Ansibleで始めるサーバ管理勉強会(2014年10月1日)
Ad

Similar to Awsで構築したのだよ 06 ec2インスタンス起動時にCloudWatchのアラームを追加する (20)

PDF
Ansible 入門 #01 (初心者向け)
PDF
BCPに活かせ!一撃 CloudFormation
PDF
AWS CLI Conference 2016
PDF
現場的!オンプレとAWSの違い
PPTX
Azure DataLake 大全
PDF
AWS Black Belt Techシリーズ Amazon EMR
PDF
Spark Analytics - スケーラブルな分散処理
PDF
20190625 OpenACC 講習会 第2部
PDF
AWS Glueを使った Serverless ETL の実装パターン
PDF
ALPSチュートリアル(3) アプリケーション実習
PDF
AWS運用自動化への第一歩 
PDF
10分で作る Node.js Auto Scale 環境 with CloudFormation
PPTX
俺と JAWS-UG と CLI
PDF
Leap MotionとLambdaで「第九」を鳴らしてみる
PDF
AWS Lambda のご紹介 2015 JAWS沖縄
PDF
SlackのSlash commandの処理をAWS Lambdaで実装してみました
PDF
現場的!AWSとオンプレの違い(赤べこバージョン)
PDF
Aws tools for power shellをつかいこなそう
KEY
SAP HANA on AWS
PDF
MariaDB migration from commercial database
Ansible 入門 #01 (初心者向け)
BCPに活かせ!一撃 CloudFormation
AWS CLI Conference 2016
現場的!オンプレとAWSの違い
Azure DataLake 大全
AWS Black Belt Techシリーズ Amazon EMR
Spark Analytics - スケーラブルな分散処理
20190625 OpenACC 講習会 第2部
AWS Glueを使った Serverless ETL の実装パターン
ALPSチュートリアル(3) アプリケーション実習
AWS運用自動化への第一歩 
10分で作る Node.js Auto Scale 環境 with CloudFormation
俺と JAWS-UG と CLI
Leap MotionとLambdaで「第九」を鳴らしてみる
AWS Lambda のご紹介 2015 JAWS沖縄
SlackのSlash commandの処理をAWS Lambdaで実装してみました
現場的!AWSとオンプレの違い(赤べこバージョン)
Aws tools for power shellをつかいこなそう
SAP HANA on AWS
MariaDB migration from commercial database
Ad

More from 聡 大久保 (20)

PPTX
Oculus Interaction SDK で物をつかむ編
PPTX
Oculus Interaction SDK でグラブまわりの設定方法
PPTX
空間を認識する - 取り込みから表示まで -
PPTX
Photon Fusionのはじめの一歩
PPTX
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
PPTX
Hololens2でアカウント情報の取得
PPTX
HoloLens2とPCで、WebRTCで映像をやりとり
PPTX
UnityでVRアプリ(Android Cardboard)を作る -準備編-
PPTX
VRでのUI設計のヒント
PPTX
ハードサーフェイスモデリング勉強会(Blender2.79b編)
PPTX
Google Tangoで 現実世界を感じてみよう
PPTX
仮想マシンを仮想空間で見る Cloud roadshow
PPT
AWSのEC2の複数インスタンスからファイルを共有する方法
PPTX
Awsで構築したのだよ 04 ec2インスタンス起動時にホスト名を変更
PPTX
Awsで構築したのだよ 03 ec2インスタンスに設定したタグをサーバから取得
PPTX
Awsで構築したのだよ 02 ec2インスタンスから自分のインスタンスidを取得
PPTX
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
PPTX
awsを学ぶ上で必要となる前提知識(DB)
PPTX
AWSを学ぶ上で必要となる前提知識(SSL)
PDF
Awsを学ぶ上で必要となる前提知識(DNS/LB)
Oculus Interaction SDK で物をつかむ編
Oculus Interaction SDK でグラブまわりの設定方法
空間を認識する - 取り込みから表示まで -
Photon Fusionのはじめの一歩
Hololens2 MRTK2.7(OpenXR) でのビルド環境構築(環境設定からビルドまで)
Hololens2でアカウント情報の取得
HoloLens2とPCで、WebRTCで映像をやりとり
UnityでVRアプリ(Android Cardboard)を作る -準備編-
VRでのUI設計のヒント
ハードサーフェイスモデリング勉強会(Blender2.79b編)
Google Tangoで 現実世界を感じてみよう
仮想マシンを仮想空間で見る Cloud roadshow
AWSのEC2の複数インスタンスからファイルを共有する方法
Awsで構築したのだよ 04 ec2インスタンス起動時にホスト名を変更
Awsで構築したのだよ 03 ec2インスタンスに設定したタグをサーバから取得
Awsで構築したのだよ 02 ec2インスタンスから自分のインスタンスidを取得
Awsで構築したのだよ 01 ユーザのコンソール操作をログに残す
awsを学ぶ上で必要となる前提知識(DB)
AWSを学ぶ上で必要となる前提知識(SSL)
Awsを学ぶ上で必要となる前提知識(DNS/LB)

Awsで構築したのだよ 06 ec2インスタンス起動時にCloudWatchのアラームを追加する

  • 2. AWS構築時のノウハウを残し 共有します  注意 順番に記載されているため、前のテーマで記載さ れている内容が前提となる場合があります。
  • 3. お品書き  ユーザのコンソール操作をログに残したい  ec2で自分のインスタンスIDが知りたい  ec2で自分についているタグを読み取りたい  ec2起動時にホスト名を変更したい  プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ トリクスに追加したい  ec2起動時にアラーム設定をクラウドウォッチに追加したい  Amazon Linuxのsshの認証方式を、ID/PWに変更したい。  VPNのプライベートネットワークでNTPを使いたい  プライベートネットワークのRDSにssh経由で接続したい  夜間にec2を落としたい  サーバーのシャットダウン時にログを退避したい
  • 4. ec2起動時にアラーム設定を クラウドウォッチに追加したい (1/6)  ec2を新しく起動したときに、自動でCloudwatch にアラーム設定を行い、監視対象とする。  ec2を停止するときに、Cloudwatchのアラーム設 定を解除し監視対象から外す。
  • 5. ec2起動時にアラーム設定を クラウドウォッチに追加したい (2/6)  ユーザに、カスタムメトリクスに登録権限を付与 します。 設定方法は、カスタムメトリクス追加の回をご覧 ください。
  • 9.  Alertと同様に、CautionとWarningを作成します。  作成したAlert、Caution、WarningのTopic ARNをメ モします。これから作成するスクリプトに埋め込 むのに使います。
  • 10. ec2起動時にアラーム設定を クラウドウォッチに追加したい (4/6)  アラートの追加と削除用のスクリプトを用意する。 監視内容閾値備考 StatusCheckFailed >= 0 サーバダウン時 0(成功) か1(失敗) DiskUsage_root >=80 使用率が80%を超えたら CPUUtilization >=90 CPU使用率 MemoryUsage >=90 メモリ使用率 process_http <1 プロセスが無くなったら process_tomcat6 <1 プロセスが無くなったら
  • 11.  アラート登録用スクリプトを用意します。 # vi entryAlert.rb #!/usr/bin/env ruby # encoding: utf-8 # 1.メトリクスの監視をアラートに登録する。 # require 'rubygems' require 'aws-sdk' require './ec2tag' AWS.config(YAML.load(File.read("./aws.yml"))) @instanceID = `wget --no-proxy -q -O - http://169.254.169.254/latest/meta-data/instance-id` @ec2 = AWS::EC2.new().client # ec2のタグよりNAMEを取得します。 @name = get_name_tag(@ec2, @instanceID) @system = 'SYSTEM01' @process1 = 'httpd' @process2 = 'tomcat6'
  • 12. cw_config = [ { "namespace"=> "AWS/EC2", "alert_level"=> "RED", "description"=> "SERVER DOWN", "metric_name"=> "StatusCheckFailed", "threshold"=> 0, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "YEL", "description"=> "DISK USAGE", "metric_name"=> "DiskUsage_root", "threshold"=> 80, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Warning"], },
  • 13. { "namespace"=> "AWS/EC2", "alert_level"=> "YEL", "description"=> "CPU Utilization", "metric_name"=> "CPUUtilization", "threshold"=> 90, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "YEL", "description"=> "MEMORY USAGE", "metric_name"=> "MemoryUsage", "threshold"=> 90, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], },
  • 14. { "namespace"=> "Custom/EC2", "alert_level"=> "RED", "description"=> "PROCESS DOWN[#{@process1}]", "metric_name"=> "process_#{@process1}", "threshold"=> 1, "comparison_operator"=> "LessThanThreshold", "statistic"=> "Maximum", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "RED", "description"=> "PROCESS DOWN[#{@process2}]", "metric_name"=> "process_#{@process2}", "threshold"=> 1, "comparison_operator"=> "LessThanThreshold", "statistic"=> "Maximum", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, ]
  • 15. cw = AWS::CloudWatch.new cw_config.each do |config| alert_name = ["[#{@system}_#{config["alert_level"]}]", config["description"], "(#{@name}[#{@instanceID}])"].join("") cw.alarms.create( alert_name,{ "namespace"=> config["namespace"], "metric_name"=> config["metric_name"], "threshold"=> config["threshold"], "comparison_operator"=> config["comparison_operator"], "statistic"=> config["statistic"], "period"=> 300, "dimensions"=> [ { "name"=> "InstanceId", "value"=> @instanceID} ], "evaluation_periods"=> 1, "alarm_actions"=> config["arn"]} ) end
  • 16.  アラート削除用スクリプトを用意します。 # vi deleteAlert.rb #!/usr/bin/env ruby # encoding: utf-8 # 1.アラーを削除する。 # require 'rubygems' require 'aws-sdk' require './ec2tag' AWS.config(YAML.load(File.read("./aws.yml"))) @instanceID = `wget --no-proxy -q -O - http://169.254.169.254/latest/meta-data/instance-id` @ec2 = AWS::EC2.new().client @name = get_name_tag(@ec2, @instanceID) @system = 'SYSTEM01' @process1 = 'httpd' @process2 = 'tomcat6'
  • 17. cw_config = [ { "namespace"=> "AWS/EC2", "alert_level"=> "RED", "description"=> "SERVER DOWN", "metric_name"=> "StatusCheckFailed", "threshold"=> 0, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "YEL", "description"=> "DISK USAGE", "metric_name"=> "DiskUsage_root", "threshold"=> 80, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Warning"], },
  • 18. { "namespace"=> "AWS/EC2", "alert_level"=> "YEL", "description"=> "CPU Utilization", "metric_name"=> "CPUUtilization", "threshold"=> 90, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "YEL", "description"=> "MEMORY USAGE", "metric_name"=> "MemoryUsage", "threshold"=> 90, "comparison_operator"=> "GreaterThanThreshold", "statistic"=> "Average", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Caution"], },
  • 19. { "namespace"=> "Custom/EC2", "alert_level"=> "RED", "description"=> "PROCESS DOWN[#{@process1}]", "metric_name"=> "process_#{@process1}", "threshold"=> 1, "comparison_operator"=> "LessThanThreshold", "statistic"=> "Maximum", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, { "namespace"=> "Custom/EC2", "alert_level"=> "RED", "description"=> "PROCESS DOWN[#{@process2}]", "metric_name"=> "process_#{@process2}", "threshold"=> 1, "comparison_operator"=> "LessThanThreshold", "statistic"=> "Maximum", "arn"=> ["arn:aws:sns:ap-northeast-1:969331845486:Alert"], }, ]
  • 20. cw = AWS::CloudWatch.new cw_config.each do |config| alert_name = ["[#{@system}_#{config["alert_level"]}]", config["description"], "(#{@name}[#{@instanceID}])"].join("") cw.alarms.delete( alert_name ) end
  • 21.  タグ取得用スクリプトを用意します。 # vi ec2tag.rb def get_tag_set(ec2, instance_id) tag_set = ec2.describe_instances(:instance_ids => [instance_id])[:instance_index][instance_id][:tag_set] return tag_set end def get_name_tag(ec2, instance_id) tag_set = get_tag_set(@ec2, @instanceID) tag_set.each do |tag| if /name/i =~ tag[:key] @name = tag[:value] return tag[:value] end end reruen "" end
  • 22. ec2起動時にアラーム設定を クラウドウォッチに追加したい  手動でスクリプトを実行し、動作を確認します。 # ruby entryAlert.rb # ruby deleteAlert.rb (5/6)
  • 23. ec2起動時にアラーム設定を クラウドウォッチに追加したい (6/6)  起動停止時にスクリプトを実行するように設定す る。
  • 24. # vi /etc/init.d/entry-to-cloudwatch #!/bin/sh # chkconfig: 345 80 20 # # This script will be executed *before* all the other holt scripts. # You can put your own terminate stuff in here. case "$1" in start) # Alert entry to Cloud Watch touch /var/lock/subsys/entry-to-cloudwatch /usr/bin/ruby /opt/aws/entry_alert.rb ;; stop) # Alert delete form Cloud Watch rm -f /var/lock/subsys/entry-to-cloudwatch /usr/bin/ruby /opt/aws/delete_alert.rb ;; *) echo "Usage: $0 {start|stop}" exit 1 esac exit 0
  • 25. パーミッションを変更 # chmod 755 /etc/init.d/entry-to-cloudwatch 自動起動の設定 # chkconfig entry-to-cloudwatch on