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-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
以上です。