AWSで構築したのだよ「プロセス監視、メモリ使用率、ディスク使用率を
Cloudwatchのカスタムメトリクスに追加したい」
注意
順番に記載されているため、前のテーマで記載されている内容が前提となる場合があります。
AWS構築時のノウハウを残し共有します
ユーザのコンソール操作をログに残したい
ec2で自分のインスタンスIDが知りたい
ec2で自分についているタグを読み取りたい
ec2起動時にホスト名を変更したい
プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ
トリクスに追加したい
ec2起動時にアラーム設定をクラウドウォッチに追加したい
AmazonLinuxのsshの認証方式を、ID/PWに変更したい。
VPNのプライベートネットワークでNTPを使いたい
プライベートネットワークのRDSにssh経由で接続したい
夜間にec2を落としたい
サーバーのシャットダウン時にログを退避したい
お品書き
AWSサービスとして提供されているものについては、標準メトリクスで参照することができます。しかし、OS側からしか見えないもの、プロセスの死活監視、メモリの使用状況やディスクの使用状況はCloud Watchでは見ることができません。
プロセスの死活監視、メモリの使用状況やディスクの使用状況をスクリプトを使い、 Cloud Watch
のカスタムメトリクスとして登録します。
カスタムメトリクスに追加したい(1/5)
ユーザに、カスタムメトリクスに登録権限を付与します。
(または、ec2に権限を委譲するロールを作成します。)
カスタムメトリクスに追加したい(2/5)
メトリクスのもととなるデータを作成して、Cloudwatchに登録する、スクリプトを作成します。
カスタムメトリクスに追加したい(3/5)
権限を持ったユーザの情報、リージョンの情報など、操作に必要な情報をyml
ファイルで定義しておきます。
# vi aws.yml
access_key_id: "AKIAIFJPTCXRF943FBXA"
secret_access_key: "lLaGfDbBE+gjbSVrGyD7+35AlOAg364qtge91XDM"
ec2_endpoint: "ec2.ap-northeast-1.amazonaws.com"
region: "ap-northeast-1"
#!/usr/bin/env ruby
# encoding: utf-8
# OSの監視情報をCloudWatchのカスタムメトリクスに追加するスクリプト#
# 追加する項目# -メモリ使用率# -ディスク利用率# - / : 標準EBSボリューム# -プロセス監視# 各EC2インスタンス上のcronで5分ごとに実行# */5 * * * * ec2-user ruby /opt/aws/putMetricsrb
require 'rubygems'
require 'aws-sdk'
AWS.config(YAML.load(File.read(“./aws.yml")))
NAMESPACE = 'Custom/EC2'
# vi putMetric.rb
# プロセス監視するプロセス名@process1 = 'httpd'@process2 = 'tomcat6'
# メモリ使用率def mem_usagememinfo = {}File.open('/proc/meminfo').each do |line|line =~ /^(.*?):\s+(\d+)/ or next;meminfo[$1] = $2.to_i * 1024
end
total = meminfo['MemTotal']avail = meminfo['MemFree'] + meminfo['Cached'] + meminfo['Buffers']
100.0 * ( total - avail ) / totalend
# Disk使用状況def disk_usage(path)df = "/bin/df -k -l -P #{path} | tail -n 1"total, used = `#{df}`.chomp.split(/\s+/).values_at(1, 2)
100 * ( used.to_f / total.to_f ) / 1end
# プロセス稼働状況(init.dにstatus参照可能な起動スクリプトがある想定)def process_count(name)`/etc/init.d/#{name} status | grep "is running..." | wc -l`.chomp
end
@instanceID = `wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
dimensions = [ { "name"=> "InstanceId", "value"=> @instanceID } ]
# 個別項目metric_data = [
{ "metric_name"=> "MemoryUsage" , \
"value"=> mem_usage , "unit"=> "Percent" },
{ "metric_name"=> "DiskUsage_root" , \
"value"=> disk_usage('/') , "unit"=> "Percent" },
{ "metric_name"=> "process_#{@process1}", \
"value"=> process_count(@process1).to_i, "unit"=> "Count"},
{ "metric_name"=> "process_#{@process2}", \
"value"=> process_count(@process2).to_i, "unit"=> "Count"},
]
# 共通項目metric_data.each do |m|
m[:dimensions] = dimensions
end
# カスタムメトリクス追加cw = AWS::CloudWatch.newcw.put_metric_data( "namespace"=> NAMESPACE, "metric_data"=> metric_data )
手動で実行して動作確認を行う。ruby putMetric.rb
Cloudwatchで、実際に確認する。MetricsのEC2カスタムメトリクスを参照する。Custom/EC2というネームスペースが追加されている。
カスタムメトリクスに追加したい(4/5)
DiskとMemoryの使用状況を参照してみる
Cronに登録して、5分置きにカスタムメトリクスを追加するようにします。
(スクリプトファイルとymlファイルのパーミッションは、適宜変更してください。)
$ sudo crontab -e
*/5 * * * * ec2-user ruby /opt/aws/putMetric.rb
カスタムメトリクスに追加したい(5/5)