Help us understand the problem. What is going on with this article?

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

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_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されているインスタンスはエラーがでてしまいます。

以上です。

takashi0314
新井ひとみさん推してます
cloudpack
Amazon Web Services (AWS) の導入設計、環境構築、運用・保守をサポートするマネジドホスティングサービス
https://cloudpack.jp/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away