狠狠撸

狠狠撸Share a Scribd company logo
AWSで構築したのだよ 
「プロセス監視、メモリ使用率、ディスク使用率を 
Cloudwatchのカスタムメトリクスに追加し 
たい」
AWS構築時のノウハウを残し 
共有します 
? 注意 
順番に記載されているため、前のテーマで記載さ 
れている内容が前提となる場合があります。
お品書き 
? ユーザのコンソール操作をログに残したい 
? ec2で自分のインスタンスIDが知りたい 
? ec2で自分についているタグを読み取りたい 
? ec2起動時にホスト名を変更したい 
? プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ 
トリクスに追加したい 
? ec2起動時にアラーム設定をクラウドウォッチに追加したい 
? Amazon Linuxのsshの認証方式を、ID/PWに変更したい。 
? VPNのプライベートネットワークでNTPを使いたい 
? プライベートネットワークのRDSにssh経由で接続したい 
? 夜間にec2を落としたい 
? サーバーのシャットダウン時にログを退避したい
カスタムメトリクスに追加した 
い(1/5) 
? AWSサービスとして提供されているものについて 
は、標準メトリクスで参照することができます。 
しかし、OS側からしか見えないもの、プロセスの 
死活監視、メモリの使用状況やディスクの使用状 
況はCloud Watchでは見ることができません。 
? プロセスの死活監視、メモリの使用状況やディス 
クの使用状況をスクリプトを使い、Cloud Watch 
のカスタムメトリクスとして登録します。
カスタムメトリクスに追加した 
い(2/5) 
? ユーザに、カスタムメトリクスに登録権限を付与 
します。 
(または、ec2に権限を委譲するロールを作成しま 
す。)
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい
カスタムメトリクスに追加した 
い(3/5) 
? メトリクスのもととなるデータを作成して、 
Cloudwatchに登録する、スクリプトを作成します。
権限を持ったユーザの情報、リージョンの情報など、操作に必要な情報を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"
# vi putMetric.rb 
#!/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'
# プロセス監視するプロセス名 
@process1 = 'httpd' 
@process2 = 'tomcat6' 
# メモリ使用率 
def mem_usage 
meminfo = {} 
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 ) / total 
end
# 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 ) / 1 
end 
# プロセス稼働状況(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.new 
cw.put_metric_data( "namespace"=> NAMESPACE, "metric_data"=> metric_data )
カスタムメトリクスに追加したい 
(4/5) 
? 手動で実行して動作確認を行う。 
ruby putMetric.rb 
? Cloudwatchで、実際に確認する。MetricsのEC2カスタムメ 
トリクスを参照する。Custom/EC2というネームスペースが 
追加されている。
? DiskとMemoryの使用状況を参照してみる
カスタムメトリクスに追加した 
い(5/5) 
? Cronに登録して、5分置きにカスタムメトリクス 
を追加するようにします。 
(スクリプトファイルとymlファイルのパーミッ 
ションは、適宜変更してください。) 
$ sudo crontab -e 
*/5 * * * * ec2-user ruby /opt/aws/putMetric.rb

More Related Content

Awsで構築したのだよ 05 プロセス監視、メモリ使用率、ディスク使用率をCloudWatchのカスタムメトリクスに追加したい

  • 2. AWS構築時のノウハウを残し 共有します ? 注意 順番に記載されているため、前のテーマで記載さ れている内容が前提となる場合があります。
  • 3. お品書き ? ユーザのコンソール操作をログに残したい ? ec2で自分のインスタンスIDが知りたい ? ec2で自分についているタグを読み取りたい ? ec2起動時にホスト名を変更したい ? プロセス監視、メモリ使用率、ディスク使用率をCloudwatchのカスタムメ トリクスに追加したい ? ec2起動時にアラーム設定をクラウドウォッチに追加したい ? Amazon Linuxのsshの認証方式を、ID/PWに変更したい。 ? VPNのプライベートネットワークでNTPを使いたい ? プライベートネットワークのRDSにssh経由で接続したい ? 夜間にec2を落としたい ? サーバーのシャットダウン時にログを退避したい
  • 4. カスタムメトリクスに追加した い(1/5) ? AWSサービスとして提供されているものについて は、標準メトリクスで参照することができます。 しかし、OS側からしか見えないもの、プロセスの 死活監視、メモリの使用状況やディスクの使用状 況はCloud Watchでは見ることができません。 ? プロセスの死活監視、メモリの使用状況やディス クの使用状況をスクリプトを使い、Cloud Watch のカスタムメトリクスとして登録します。
  • 5. カスタムメトリクスに追加した い(2/5) ? ユーザに、カスタムメトリクスに登録権限を付与 します。 (または、ec2に権限を委譲するロールを作成しま す。)
  • 10. カスタムメトリクスに追加した い(3/5) ? メトリクスのもととなるデータを作成して、 Cloudwatchに登録する、スクリプトを作成します。
  • 11. 権限を持ったユーザの情報、リージョンの情報など、操作に必要な情報を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"
  • 12. # vi putMetric.rb #!/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'
  • 13. # プロセス監視するプロセス名 @process1 = 'httpd' @process2 = 'tomcat6' # メモリ使用率 def mem_usage meminfo = {} 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 ) / total end
  • 14. # 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 ) / 1 end # プロセス稼働状況(init.dにstatus参照可能な起動スクリプトがある想定) def process_count(name) `/etc/init.d/#{name} status | grep "is running..." | wc -l`.chomp end
  • 15. @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
  • 16. # カスタムメトリクス追加 cw = AWS::CloudWatch.new cw.put_metric_data( "namespace"=> NAMESPACE, "metric_data"=> metric_data )
  • 17. カスタムメトリクスに追加したい (4/5) ? 手動で実行して動作確認を行う。 ruby putMetric.rb ? Cloudwatchで、実際に確認する。MetricsのEC2カスタムメ トリクスを参照する。Custom/EC2というネームスペースが 追加されている。
  • 19. カスタムメトリクスに追加した い(5/5) ? Cronに登録して、5分置きにカスタムメトリクス を追加するようにします。 (スクリプトファイルとymlファイルのパーミッ ションは、適宜変更してください。) $ sudo crontab -e */5 * * * * ec2-user ruby /opt/aws/putMetric.rb