メモ。
何がしたいかってーと
EC2の名前でフィルタリングして取得、それらのインスタンスにcloudwatch alarmをサクッと登録したい
About
-
aws ec2 describe-tags
で対象のEC2取得 -
aws cloudwatch put-metric-alarm
でalarm登録
前準備として
実行するマシンに設定してる権限要確認
スクリプト
以下のファイルを適宜改変、設置して実行権限付けて。
usage ./このshell.sh -f フィルタして拾ってくる名前 -t アラーム送る閾値
#!/bin/bash
CMDNAME=`basename $0`
while getopts f:t: OPT
do
case $OPT in
"f" ) FILTER="$OPTARG" ;;
"t" ) THRESHOLD="$OPTARG" ;;
* ) echo "Usage: $CMDNAME [-f Filter VALUE STR] [-t Threshold VALUE INT]" 1>&2
exit 1 ;;
esac
done
echo "FILTER ${FILTER}"
echo "THRESHOLD ${THRESHOLD}"
TEMP="./temp.txt"
# アクションが一つだけなら
#ARN="arn:aws:sns:ap-northeast-1:xxxxxxx:alert-xxxx"
# 複数アクションならスペースでつなげる ex.
ARN="arn:aws:sns:ap-northeast-1:xxxxxxx:alert-xxxx arn:aws:sns:ap-northeast-1:xxxxxxx:alert-slack"
# インスタンスIDの取得
aws ec2 describe-tags \
--filter "Name=resource-type,Values=instance" \
"Name=value,Values=*${FILTER}*" \
--query "Tags[*].[Value,ResourceId]" \
--output text |tr '\t' ','>${TEMP}
# 取得したインスタンスIDを元に逐次処理
while read LINE
do
echo $LINE
# インスタンス名とIDを切り出し
NAME=`echo ${LINE}|cut -d ',' -f 1`
ID=`echo ${LINE}|cut -d ',' -f 2`
# OpsWorksから作ったEC2だと、何故かインスタンス名ありと無しで2つ拾って来てた。原因追ってない。
# とりあえずインスタンス名無い場合continueしちゃってる
if [ "$NAME" = "OPS" ]; then
continue
fi
echo "${NAME}"
echo $ID
echo "#########"
# CPUUtilizationのアラームを設定
aws cloudwatch put-metric-alarm \
--alarm-name "${FILTER}-${NAME}-CpuUtilization > ${THRESHOLD}" \
--namespace AWS/EC2 \
--metric-name CPUUtilization \
--dimensions "Name=InstanceId,Value=${ID}" \
--period 300 \
--statistic Average \
--threshold ${THRESHOLD} \
--comparison-operator GreaterThanOrEqualToThreshold \
--evaluation-periods 1 --alarm-actions ${ARN}
done <${TEMP}
- disk系のalarmのようにdimensionsの指定項目が1つで無い場合、以下のようにスペース区切りで。
--dimensions Name=InstanceId,Value=${ID} Name=Filesystem,Value=/dev/XXXX
- SNSのARNを調べるなら、SNSのコンソールか、適当にAlarm定義して
aws cloudwatch describe-alarms --alarm-names "SNS TEST"
- とかで調べる。
- コマンドでdimensionsが判らない場合もcloudwatchコンソールから一回alarm設定してみて上記コマンドで調べる。(もっと良い方法有ると思うけど。)
参考
https://blog.interstellar.co.jp/2017/08/awscloudwatch-alarm.html
他にも有った気がするんだけど忘れた。。。