LoginSignup
0
0

More than 5 years have passed since last update.

EC2にまとめてCloudwatchAlarmを設定

Last updated at Posted at 2018-05-21

メモ。

何がしたいかってーと

EC2の名前でフィルタリングして取得、それらのインスタンスにcloudwatch alarmをサクッと登録したい

About

  1. aws ec2 describe-tags で対象のEC2取得
  2. 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
他にも有った気がするんだけど忘れた。。。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0