こんなソースに誰がした

都内で末端SE/PGをやっている4年目の社会人のブログ。

Who made such a source?

こんなソースに誰がした

独自スクリプトを使用してCloudWatchのカスタムメトリクスに値を通知する

 

前書き

 

どうもお久しぶりです。煉獄乙女です。

前書きとは書いてますが全然関係のない話です。

もう5月ですね!誕生日も過ぎてまた一歩三十路に近づきました。

(友達にはn度目の17歳を祝ってもらっているけれども)

今年は誕生日にPS4Proをもらいました!!!!!!やったー!!!!!!!!

海外の子どものように奇声を発しながら包装紙を破いて泣きながらジーザス!!!!!!!!!!!!!!!!!!とか言ってませんけど、心の中ではめちゃめちゃめちゃめちゃに喜んでます。

やっと私の家にもPS4が・・・・・・うれしい・・・・・・・・PS3とはおさらばだ・・・・・・・・

もうMHWやるために上司にお願いしてPS4借りて壊さないようにATフィールド張りながら持って帰らなくていいんだ!!!!!ありがとう神様!!!!!!!

会社の事業計画発表会で勝ち取ったアマギフを足しにして、ソフト買おうと思います。

なにやろうかな?!?!!?!ていうかVRほしいな?!?!?!ボーナス出たら買おうかな・・・・・・・・・

 

 

 

本題

独自Shellを使用することで、標準では準備されていない(ファイルサイズとかの)値をCloudWatch上で監視したい!!

 

 

1.Shellの準備

 

CloudWatchの権限を持つIAMロールをEC2に付与している場合だと、

例えばこんな感じでシェルを書く。(awsコマンド使用の場合)

ちなみに当たり前だけど各変数やコマンドの場所は各自で置き換えてくだちい。


#!/bin/bash
#===========================================================================
# ファイルサイズチェック用バッチ
#===========================================================================

export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export EC2_REGION=ap-northeast-1
instanceid=$(curl -sS http://169.254.169.254/latest/meta-data/instance-id)

# batch start
LOG_FILE="ログファイルのパス"
echo $(date +'%Y-%m-%d[%H:%M:%S]')"log-batch START" >> $LOG_FILE

# log filesize check
FILENAME="サイズをチェックしたいファイルの名前"
FILESIZE_MB=$(du -m /var/log/$FILENAME | awk '{print $1}')

# setting value 0 then file not found
if [ -z "$FILESIZE_MB" ]; then
FILESIZE_MB=0
fi

# put cloudwatch
RESULT=$(aws cloudwatch put-metric-data --metric-name "ApiLogFileSize" --namespace "System/Linux" --dimensions "InstanceId=$instanceid" --value "$FILESIZE_MB" --unit "Megabytes" --region $EC2_REGION)

# end log
echo $(date +'%Y-%m-%d[%H:%M:%S]')"log-batch END" >> $LOG_FILE

 

put-metric-dataしてるところの、metric-nameはわかりやすい名前をつけるといいよ。

namespaceとかunitとかdimensionsとかの値は「CloudWatch ディメンション」とかでググったら出てくるよ。調べてね。*1

 

2.cronへ登録

上で書いたShellで値を送るけど、一々手で叩いてられないから(そんなことするなら別にShellいらないし)cronに登録するよ。

定期的に実行したいだけだからcronじゃなくて他のジョブスケジューリングでもいいよ。

 

3.CloudWatchで確認

一度Shellを叩いたら、CloudWatch側でちゃんと受け取れているか確認しよう。

f:id:sephirothff7:20180521182638p:plain

叩いたあとしばらくして、正常にCloudWatchが受け取れていたら、

上のShellだと右下の「Linuxシステムメトリクス」の「instanceId」に値が通知されているよ。

「namespace」と「dimentions」に書いたところに納まってるはず。

 

あとはダッシュボードに追加するなり、Alert設定して一定以上だとメール飛ばすなりすると完成だよ。

 

注意点

ちなみに、なぜデータのputがaws-cliを使用したawsコマンドでの書き方なのかというと、EC2にCloudWatchの権限をもつIAMロールを付与して許可をしようとする場合、

aws-cliawsコマンドしか使用できないから。

ディスク容量とか監視できる、「Amazon CloudWatch Monitoring Scripts for Linux」のコマンドではIAMロールに対応していないみたい。

なので、「Amazon CloudWatch Monitoring Scripts for Linux」(以下CloudWatchスクリプト)を使用する場合は以下みたいな感じの手順になるよ。

 

 

2−1.Credentialsファイルを編集する

 

CloudWatchスクリプトをインストールしたディレクトリの「aws-scripts-mon」ディレクトリにある、awscreds.templateをコピーし、

awscreds(awscreds.confでもいいっぽい)ファイルを作成する

そしてCloudWatchの権限を持つアクセスキーとシークレットキーの設定をする

こんな感じ。


AWSAccessKeyId=アクセスキーの値を設定
AWSSecretKey=シークレットキーの値を設定

 

2−2.Shellの準備

 最初のShellとちょっと書き方が違う。


#!/bin/bash
#===========================================================================
# ファイルサイズチェック用バッチ
#===========================================================================

export JAVA_HOME=/usr/lib/jvm/jre
export AWS_CLOUDWATCH_HOME=/usr/local/cloudwatch/aws-scripts-mon
export AWS_CREDENTIAL_FILE=$AWS_CLOUDWATCH_HOME/awscreds
export AWS_CLOUDWATCH_URL=https://monitoring.amazonaws.com
export EC2_REGION=ap-northeast-1
instanceid=$(curl -sS http://169.254.169.254/latest/meta-data/instance-id)

# batch start
LOG_FILE="ログファイルのパス"
echo $(date +'%Y-%m-%d[%H:%M:%S]')"log-batch START" >> $LOG_FILE

# log filesize check
FILENAME="サイズをチェックしたいファイルの名前"
FILESIZE_MB=$(du -m /var/log/$FILENAME | awk '{print $1}')

# setting value 0 then file not found
if [ -z "$FILESIZE_MB" ]; then
FILESIZE_MB=0
fi

# put cloudwatch
RESULT=$(mon-put-data --metric-name "MaillogRotateFileSize" --namespace "System/Linux" --dimensions "InstanceId=$instanceid" --value "$FILESIZE_MB" --unit "Megabytes" --region ap-northeast-1)

# end log
echo $(date +'%Y-%m-%d[%H:%M:%S]')"log-batch END" >> $LOG_FILE

 

これでOK。(のはず)

ちなみにRESULTの値でエラー判定できるかなと思ってRESULT=$~にしたけど、

成功時は特に何も返ってこない。

だから別にRESULT=$(コマンド)にしなくても、普通に実行でいい気がする。

ここ失敗したら何か返ってくるのかな。。。。 

 

あとは

2−3.cronへ登録

2−4.CloudWatchで確認

 で完了。

 

 

とまあ、ひとまずこれで標準で準備されているCPU使用率やディスク容量などの監視以外にも、

自分で好きな値をCloudWatchにPutしてCloudWatch側で監視することができるのだ。

お〜便利〜

 

 

*1:追記:cloudpack.mediaさんがめちゃわかりやすくまとめてたしなんならこの記事要らなくね?

cloudpack.media