LoginSignup
4

More than 3 years have passed since last update.

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

Last updated at Posted at 2015-03-16

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

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

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_PREFIX=$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 `echo $ALARM_NAME_PREFIX'_'$INSTANCE_ID` \
        --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

ちなみに、STOPされているインスタンスはエラーがでてしまいます。

以上です。

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
4