Posted on May 23
CloudWatch
のエージェントっぽいのを bash
で作ったChef
でというノリだけで作ったせっかくなので cloudwatch-agent
についてもちょっと。
Load Average
とか Memory
使用率、Disk
使用率を CloudWatch
にポストするAlarm
の設定までしてしまうSNS
の Topic ARN
を指定してメールで通知する(事前に Topic ARN
を作っておく必要がある)aws cli
の Python
版を利用するSensu
をやりたかったけどチーム内を説得しきれなかった為bash
でとりあえず作った簡単に監視項目を追加出来るようにそれぞれの監視項目をシェル関数として定義してメインのスクリプトから呼ぶだけのアーキテクチャ(笑)で実装した。例えば、特定のプロセス数を監視したい場合には plugins
ディレクトリ以下に get_
から始まる以下のようなシェル関数を置くだけ。
function get_count_process_middleman() {
v=`ps aux | grep middleman | grep -v grep`
t="1"
u="Count"
}
尚、上記で設定される変数は下記の通り。
v
=> 監視結果t
=> しきい値u
=> CloudWatch
にポストする際に利用する Unit
を指定。一応、監視そのものを行うスクリプトには以下のようなルールを設けている。
.sh
を除く)は同じにするget_
から始めるこのルールに従って監視スクリプトを置けば監視項目の追加が出来る。
ノリと勢いで作ったものだけに上記にあるように課題も多い。
など、など。今後、誰も使わないかもしれないが気が向いたら改善していきたい。
cloudwatch-agent
で使っている aws cli
についてちょっと。
メトリクスデータを CloudWatch
に投げるコマンドで cloudwatch-agent
内では以下のように利用している。
function put_metrics_data() {
aws --region ${REGION} cloudwatch put-metric-data \
--namespace "${NAMESPACE}" \
--metric-data file:///tmp/${1}.json
}
--namespace
を引数で指定する以外は --metric-data
で以下のような JSON
ファイル化したメトリクスデータを引数として与える。
[
{
"MetricName": Metrics Name,
"Value": Metrics Value,
"Unit": Unit,
"Dimensions": [
{
"Name": "Instanceid",
"Value": Instance_id
},
{
"Name": "Hostname",
"Value": hostname
}
]
}
]
詳細についてはこちらで。
このコマンドは初回のみしか利用されないがスクリプト内で以下のように利用されている。
aws --region ${REGION} cloudwatch put-metric-alarm \
--actions-enabled \
--alarm-name ${NAMESPACE}-${hostname}-${1} \
--alarm-actions ${ARN} \
--ok-actions ${ARN} \
--metric-name ${1} \
--namespace ${NAMESPACE} \
--statistic Average \
--period 300 \
--evaluation-periods 1 \
--threshold ${t} \
--unit ${u} \
--comparison-operator GreaterThanOrEqualToThreshold \
--dimensions Name=Instanceid,Value=${Instance_id} Name=Hostname,Value=${hostname}
詳しくはこちらを見て頂くとして、この設定の場合に以下の条件で Alarm
が設定される。
--threshold ${t}
で指定--period
で指定された 300
秒の間にしきい値が --evaluation-periods
で指定された回数(1
)を超えた場合に…--alarm-actions
で指定された SNS
の Topic ARN
を利用して通知する日本語がオカシイかもしれないけどこんな感じ。
で Chef
で配布すっかーと作ったのが cloudwatch-agent-chef
…これまた Sensu
のマネ。
cloudwatch-agent
をインスタンスに配布するCron
も設定されるの収束させて 5
分後に監視が開始されるAlarm
の設定も行われるLWRP
の独自リソースで設定するAWS
の API
キーは Encrypt
な data_bags
で管理したかった(現状は Attribute
)監視項目を追加したい場合には LWRP
の独自リソース(cloudwatch_agent_chef_create_script
)を下記のように書いて収束させる。
cloudwatch_agent_chef_create_script "get_hoge-huga.sh" do
action :create
metrics_name "hoge-huga"
get_metrics_command "v=`ps aux| grep hoge | wc -l`"
unit "Count"
threshold "1"
bin_path "#{BINPATH}"
end
上記をレシピに書いて収束を実行させると…以下のような内容の #{BINPATH}/plugins/get_hoge-huga.sh
が作成される。
function get_hoge-huga() {
v=`ps aux| grep hoge | wc -l`
t="1"
u="Count"
}
CloudWatch
とシェルで簡単にインスタンスリソースを監視することが出来たSensu
のエージェント型のアーキテクチャやプラグイン機構等自分なりの認識の中で色々と真似てみたCookbook
を作るにあたって LWRP
を利用してみたがこちらは簡単に利用することが出来たLWRP
で定義したリソース名にハイフンが使えないっぽいのはホント?2014 かっぱのほげふが