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