俺の報告

RoomClipを運営するエンジニアの日報(多分)です。

日報 #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がうんたらかんたら

 

知らん!

 

寝る!