こんにちは。村主です。
前回(↓)の記事の反響が多かったので、少し掘りげて技術的なところを書きます。
今回の趣旨
前回の「内部の見える化のための、リソース系の情報取得」を実装する。
リソース系の情報をCloudWatchにPutしてみよう
1. EC2作成
EC2作成手順はあちこちにあるのでGoogle先生に聞いてください。
注意点は、EC2作成時にIAMロールを付与してください。
2. IAMロール割り当て
EC2作成時に割り当てるIAMロールのポリシーは以下でOKです。
IAMロールを割り当ててないEC2で行う場合は、IAMを発行の上で
アクセスキー・シークレットキーを発行し、ポリシー付与などの対応ください。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1449132764000", "Effect": "Allow", "Action": [ "cloudwatch:PutMetricAlarm", "cloudwatch:PutMetricData" ], "Resource": [ "*" ] } ] }
3. サンプルスクリプトの実行
cloudwatchへ送信するためのサンプルスクリプトを用意しました。
サンプルスクリプトに以下の引数を渡すことで動きます。
このスクリプトcronで5分置きなどで実行すると、
cloudwatchの[カスタムメトリックス]という項目にメトリクスが飛んでいきます。
サンプルスクリプト
#!/bin/sh # default INSTANCEID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id) TIMESTAMP=$(date -u +%Y-%m-%dT%H:%M:%S.000Z) REGION=$(curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone | sed -e 's/.$//') # metrics while getopts n:m:c: opt do case ${opt} in n) NAMESPACE=${OPTARG};; m) METRICNAME=${OPTARG};; c) COMMAND=$(eval ${OPTARG});; *) exit 1;; esac done # put metrics aws cloudwatch put-metric-data --dimensions InstanceId=$INSTANCEID --timestamp $TIMESTAMP --region $REGION --namespace $NAMESPACE --metric-name $METRICNAME --value $COMMAND --unit Count
実行例
./metric-put.sh -n process -m process_httpd -c "ps aux|grep [h]ttpd |wc -l"
使い方
オプション | 使い方 | 例 |
-n | 名前グループを付けてください | process |
-m | メトリックの名前を付けてください | process_httpd |
-c | ここにコマンドを記載ください。数値のみ扱えます。 | ps aux | grep [h]ttpd | wc -l |
スクリプトの説明
# default | awsコマンドを実行するために必要な情報を取得(インスタンスID、タイムスタンプ、リージョン情報) |
# option | 引数に渡すためのオプション定義 |
# put metrics | awsコマンドでcloudwatchにメトリクス送信 |
上記はApacheのプロセス数でしたが、もちろん以下のような色々な値を取ることができるので、思いついたものを記載します。
(数値化出来るものはcloudwatchに送信することが可能です。)
その他サンプル
- sshプロセスの有無
./metric-put.sh -n process -m process_sshd -c "ps aux|grep [s]shd |wc -l"
- sshログインユーザ数
./metric-put.sh -n sshd -m user_count -c "w -h |wc -l"
- 特定ファイルの有無(有れば0、無ければ1)
./metric-put.sh -n file -m file_check_index.html -c "test -f /var/www/html/index.html ;echo $?"
- 特定ディレクトリの容量
./metric-put.sh -n directory -m dir_size_var_www -c "du -s /var/www/ |awk '{print $1}'"
上記をヒントにシステム毎に必要なメトリクスを取得し、システムの状態を外から見えるようすることで、
SSHログインをしない設計に近づくかと思います。
上記のような内容も、可能な限り汎用性を保ってください。。。
個別要件だけが増えていくのだけは避けるように切に願います。
(汎用性を重点に設計をシンプルにし、システム特有のもののみ変数化するイメージで)
なお、今回はCloudWatchへのメトリクス送信例ですが、システム内部の情報を外出しして見える化出来れば、
muninでもgrafanaでも使いやすいものであれば何でも良いかと思います。
以上、