SlideShare a Scribd company logo
1 of 25
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) 
 通知用のトピックを作成する
 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

What's hot

Amazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズAmazon ElastiCache - AWSマイスターシリーズ
Amazon ElastiCache - AWSマイスターシリーズ
SORACOM, INC
 
Webサーバ勉強会03
Webサーバ勉強会03Webサーバ勉強会03
Webサーバ勉強会03
oranie Narut
 
Amazon EC2 HPCインスタンス - AWSマイスターシリーズ
Amazon EC2 HPCインスタンス - AWSマイスターシリーズAmazon EC2 HPCインスタンス - AWSマイスターシリーズ
Amazon EC2 HPCインスタンス - AWSマイスターシリーズ
Amazon Web Services Japan
 

What's hot (20)

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

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

Aws tools for power shellをつかいこなそう
Aws tools for power shellをつかいこなそうAws tools for power shellをつかいこなそう
Aws tools for power shellをつかいこなそう
Genta Watanabe
 

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

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

More from 聡 大久保

More from 聡 大久保 (20)

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