はじめまして、 cloudpack安食 です。

EC2インスタンスがダメになったときにSTOP-STARTした経験のある方は多いと思いますが、少し前に

こういう機能がリリースされていました。

AWSのほかのサービスのようにus-east(virginia)限定で開始されたのですが、どうやらap-northeast(東京)でも使えるようになったみたいです。

さっそくAWSコンソールから設定してみましたが、だるい、だるすぎる… 1台,2台ならいいですがたくさんある場合は途方にくれてしまいますね。

そこで AWS CLI です。

alarmを設定するためのコマンドは aws cloudwatch put-metric-alarm です。

以下はAWS CLIのマニュアル (残念ながら日本語版はないようです)

使い方はこんな感じ

 put-metric-alarm
--alarm-name 
[--alarm-description ]
[--actions-enabled | --no-actions-enabled]
[--ok-actions ]
[--alarm-actions ]
[--insufficient-data-actions ]
--metric-name 
--namespace 
--statistic 
[--dimensions ]
--period 
[--unit ]
--evaluation-periods 
--threshold 
--comparison-operator 
[--cli-input-json ]
[--generate-cli-skeleton]

実際にはこんな感じでパラメータを投入します。

aws cloudwatch put-metric-alarm 
       --alarm-name test-alarm 
       --alarm-actions arn:aws:automate:ap-northeast-1:ec2:recover 
       --alarm-description "test alarm dayo"
       --metric-name StatusCheckFailed_System 
       --namespace AWS/WC2$ 
       --statistic Maximum  
       --dimensions Name=InstanceId,Value=i-XXXXXXXX 
       --period 60 
       --evaluation-periods 1 
       --threshold 1 
       --comparison-operator GreaterThanOrEqualToThreshold

ポイントは、 --alarm-actions で revoveryの arn を指定するのと、 --metric-nameStatusCheckFailed_System というのを指定するというところでしょうか。

上記のような感じで、 dimensions にターゲットのインスタンスIDを指定すれば設定できるのですが、このままだとGUIとそう変わらない工数感なのでちょっとだけ自動化してみます。

AWS CLI 以外に jq を使って aws ec2 describe-instances の結果からインスタンスIDの抽出をしています。
credentialは適宜設定してください。(環境変数とか、configとか)

#!/bin/bash

if [ $# -ne 2 ]; then
    echo "Usage: $0 [AlarmName] [Region]"
    echo "Region: ap-northeast-1 ap-southeast-1 ap-southeast-2 eu-central-1 eu-west-1 sa-east-1 us-east-1 us-west-1 us-west-2"
    exit
fi

ALARM_NAME=$1
METRIC_NAME=StatusCheckFailed_System
NAMESPACE=AWS/EC2
STATISTIC=Maximum
PERIOD=60
EVALUATION_PERIODS=1
THRESHOLD=1
COMPARISON_OPERATOR=GreaterThanOrEqualToThreshold
ALARM_ACTIONS=arn:aws:automate:$2:ec2:recover

for INSTANCE_ID in $(aws ec2 describe-instances | jq -r '.Reservations[].Instances[].InstanceId');
do
        aws cloudwatch put-metric-alarm 
        --alarm-name $ALARM_NAME 
        --alarm-actions $ALARM_ACTIONS 
        --metric-name $METRIC_NAME 
        --namespace $NAMESPACE 
        --dimensions Name=InstanceId,Value=$INSTANCE_ID 
        --statistic $STATISTIC  
        --period $PERIOD 
        --evaluation-periods $EVALUATION_PERIODS 
        --threshold $THRESHOLD 
        --comparison-operator $COMPARISON_OPERATOR

done

以上です。