Edited at

EC2のAuto Recovery機能をアカウント内の全インスタンスで有効にしてみた

More than 3 years have passed since last update.

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

https://aws.amazon.com/jp/about-aws/whats-new/2015/01/12/amazon-ec2-auto-recovery-now-available-in-the-us-east-region/

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

AWSのほかのサービスのようにus-east(virginia)限定で開始されたのですが、

どうやらap-northeast(東京)でも使えるようになったみたいです。

さっそくAWSコンソールから設定してみましたが、だるい、だるすぎる…

1台,2台ならいいですがたくさんある場合は途方にくれてしまいますね。

そこで AWS CLI です。

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

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

http://docs.aws.amazon.com/cli/latest/reference/cloudwatch/put-metric-alarm.html

使い方はこんな感じ

 put-metric-alarm

--alarm-name <value>
[--alarm-description <value>]
[--actions-enabled | --no-actions-enabled]
[--ok-actions <value>]
[--alarm-actions <value>]
[--insufficient-data-actions <value>]
--metric-name <value>
--namespace <value>
--statistic <value>
[--dimensions <value>]
--period <value>
[--unit <value>]
--evaluation-periods <value>
--threshold <value>
--comparison-operator <value>
[--cli-input-json <value>]
[--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-nameに StatusCheckFailed_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

以上です。