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