日報 #12 - CloudWatchを使ってみたり
気が付くと追い詰められている。そんな経験ございませんか。
さて、今日も明るく日報ですよ、奥さん。
1. CloudWatchって結構使えるんじゃね?
2. mod-evasiveの設定ってこれでいいのかよ!
3. RDSからアラート?俺は負けんぞ
さて、今日は盛りだくさんの汁ダクです。
1. CloudWatchって結構使えるんじゃね?
監視ツールっていっぱいあるけど、AWS使ってんならCW使おうぜって言うことで色々と。
EC2とかの内部情報は標準のCWじゃさすがに見えないので、カスタムマトリックス使いますよ。そんなのあるの?便利だね!
いやいや簡単そうに見えて、色々と厄介だからざっくり手順を。
-第一の罠
A. IAM roleを作る
B. IAM userを作る→cloudwatch:PutMetricDataにパーミッション通す
C. インスタンス作る→この時にAMI RoleをAで作ったroleに繋ぐ
-第二の罠
D. 必要なソフトのインストール
-そして太平洋へ
E. 送るシェルを書いてcronに登録
-だがしかし
F. 最後の処理しましょうね
こんな感じ。
AのRoleっていうのが結構罠なのでご注意あれ。
インスタンスをつくるときにRoleってやつを指定してないと、やる気失せる意味不明エラーをオエッとしてきますよ。
あと、DなんだけどDebian系(Ubuntu)使っていると結構うぜぇので色々と。
D. 必要なソフトのインストール
まず絶対条件なのがperl系。
というのもAWS CloudWatchCLI系はなんだかperlばっかり充実してるみたいなので。
Googleからウンコ扱いを受けている悪名高いlibwww-perlとかをインストールしましょう。
公式
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.html
だとapt-getでいけるぜ!みたいなこと書いてあるけど、俺の環境ではナシのつぶてだったのでCPANでいれるぜ。
# unzipが入ってなかったの。意外だった。。。
sudo apt-get install unzip
# 安定のCPAN
perl -MCPAN -e 'install Bundle::LWP'
perl -MCPAN -e 'install Bundle::SSLeay'
perl -MCPAN -e 'install LWP::Protocol::https'
こんな感じかな。
注意なのはLWPはhttpsと同梱じゃなくなったってとこ。別口でインストールしましょう。
あと、javaもなかったら突っ込んどいて。
sudo apt-get install default-jre
みたいな感じ?
ほいだら、 公式の手引にあるようにwgetしてスクリプトを手に入れて、どんとやってみましょう。
もちろんIAMで作った監視用ユーザのキーとかをいれてね。
メモリ使用率とかを飛ばせた!やった!と思ったのも束の間、LoadAverageは??
公式を読めよ俺。
mon-scripts-perlでは、ロードアベレージはとれないのです。
なんたる片手落ち。
ということなので、もう諦めてAPI使いましょう。
wget http://ec2-downloads.s3.amazonaws.com/CloudWatch-2010-08-01.zip
これでもってbinをDLします。このmon-putみたいな奴が万能丸さん。
コレさえ手に入ればなにをmatirxで送るかは俺の自由だー!ということでこんなシェルを書きました。
#!/bin/bash
export AWS_CLOUDWATCH_HOME=/hoge/CloudWatch-1.0.20.0
export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/credentials
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export PATH=$AWS_CLOUDWATCH_HOME/bin:$PATH
# get ec2 instance id
instanceid=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
CPU_LOAD_AVERAGE=`uptime | sed -e "s/load/|/" | sed -e "s/,//g" | cut -d'|' -f2 | cut -d':' -f2`
CPU_AVR_1min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f2`
CPU_AVR_5min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f3`
CPU_AVR_15min=`echo "$CPU_LOAD_AVERAGE" | cut -d' ' -f4`
mon-put-data --metric-name "LoadAverage" --namespace "System/Linux" --dimensions "InstanceId=$instanceid" --value "$CPU_AVR_1min" --unit "Count" --region ap-northeast-1
まぁ大体でね。
CPUのところはuptimeからとってきました。どうでもいいけどuptimeってmacとか環境によって全然書式違わない?
結構困るんだけど。。。
まぁコレで晴れてLoadAvgとメモリ両方共ぶっこめるようになったのでcronに登録。
ちゃんと送られてきているのを確認した後は、歴戦のエンジニアを見習ってコーヒーを飲みに行きましょう。
これから来るであろう、最後の罠に向けて心を落ち着かせるのです。
はいやっぱり変なことがおきます。
http://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/DeveloperGuide/mon-scripts-perl.htmlこいつは、
instance_idとかを勝手にキャッシュにするので、AMIからインスタンスを作ると、最初のinstance_idを記憶して、
ずぅっとそれで送ってきやがります。
キャッシュファイルの場所ですが、CloudWatchClient.pm的なコードを良く読むと、
read_meta_dataなるサブルーチンから読んでいるらしいので、その中で使われている$locationを見たいのをdumpしてみましょう。
うちの場合は/var/tmp/aws-monあたりにキャッシングしているとゲロしました。
だので、きっと/var/tmp/aws-monあたりにあるであろうキャッシュファイルをサーバごとに削除することをおすすめします。
そうしてようやく作業終了です。
あぁなげぇ。
適当にやろう。
2. mod-evasiveの設定ってこれでいいのかよ!
よく考えたらこの設定見せたらだめじゃんか!!!だから秘匿事項!
3. RDSがうんたらかんたら
知らん!
寝る!