awsで構築したのだよ 06...

25
AWSで構築したのだよ 「ec2起動時にアラーム設定を クラウドウォッチに追加したい」

Upload: satosi-okubo

Post on 13-Jul-2015

240 views

Category:

Technology


5 download

TRANSCRIPT

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

AWSで構築したのだよ

「ec2起動時にアラーム設定を

クラウドウォッチに追加したい」

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

注意

順番に記載されているため、前のテーマで記載されている内容が前提となる場合があります。

AWS構築時のノウハウを残し共有します

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

ユーザのコンソール操作をログに残したい

ec2で自分のインスタンスIDが知りたい

ec2で自分についているタグを読み取りたい

ec2起動時にホスト名を変更したい

プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ

トリクスに追加したい

ec2起動時にアラーム設定をクラウドウォッチに追加したい

AmazonLinuxのsshの認証方式を、ID/PWに変更したい。

VPNのプライベートネットワークでNTPを使いたい

プライベートネットワークのRDSにssh経由で接続したい

夜間にec2を落としたい

サーバーのシャットダウン時にログを退避したい

お品書き

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

ec2を新しく起動したときに、自動でCloudwatch

にアラーム設定を行い、監視対象とする。

ec2を停止するときに、Cloudwatchのアラーム設定を解除し監視対象から外す。

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(1/6)

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

ユーザに、カスタムメトリクスに登録権限を付与します。

設定方法は、カスタムメトリクス追加の回をご覧ください。

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(2/6)

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

通知用のトピックを作成する

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(3/6)

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

Subscribeしたメール宛てに、確認メールが届きますのでリンクをクリックして確認を行います。

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

Alertと同様に、CautionとWarningを作成します。

作成したAlert、Caution、WarningのTopic ARNをメ

モします。これから作成するスクリプトに埋め込むのに使います。

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

アラートの追加と削除用のスクリプトを用意する。

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(4/6)

監視内容 閾値 備考

StatusCheckFailed >= 0 サーバダウン時0(成功) か 1(失敗)

DiskUsage_root >=80 使用率が80%を超えたら

CPUUtilization >=90 CPU使用率

MemoryUsage >=90 メモリ使用率

process_http <1 プロセスが無くなったら

process_tomcat6 <1 プロセスが無くなったら

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

#!/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'

# vi entryAlert.rb

アラート登録用スクリプトを用意します。

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

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"],

},

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

{

"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"],

},

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

{

"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"],

},

]

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

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

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

#!/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'

# vi deleteAlert.rb

アラート削除用スクリプトを用意します。

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

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"],

},

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

{

"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"],

},

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

{

"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"],

},

]

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

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

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

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

# vi ec2tag.rb

タグ取得用スクリプトを用意します。

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

手動でスクリプトを実行し、動作を確認します。

# ruby entryAlert.rb

# ruby deleteAlert.rb

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(5/6)

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

起動停止時にスクリプトを実行するように設定する。

ec2起動時にアラーム設定をクラウドウォッチに追加したい

(6/6)

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

# 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

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

パーミッションを変更# chmod 755 /etc/init.d/entry-to-cloudwatch

自動起動の設定# chkconfig entry-to-cloudwatch on