どうも、千葉です。
小ネタです。自動化というこで、AWS CLIを使ってCloudWatchのEC2メトリクスを監視して、異常時インスタンスを再起動する設定を行います。
CloudWatchのEC2メトリクスとアラーム機能、アクション機能を使います。
EC2の障害を確認できる2つのメトリクス
CloudWatchで確認できるEC2の障害は、大きく2パターンがあります。
システムステータスチェックと、インスタンスチェックです。
レイヤーとしては上から、インスタンス、ホストOS(ハイパーバイザー)、物理レベル(ネットワークや物理的なハード障害)となります。
以下、CloudWatchで確認できるEC2のステータスチェクとして利用できるメトリクスとなります。
システムステータスチェック
- ネットワーク接続の喪失
- システム電源の喪失
- 物理ホストのソフトウェアの問題
- 物理ホストのハードウェアの問題
インスタンスステータスのチェック
- 失敗したシステムステータスチェック
- 正しくないネットワークまたは起動設定
- メモリの枯渇
- 破損したファイルシステム
- 互換性のないカーネル
ステータスチェック
上記記載の、システムチェックとインスタンスチェック両方をチェックするメトリクス
メトリクスに対するアラーム、アクションの登録
これらのメトリクスに対してアラームとアクションを定義することができます。
つまり、何らかのインスタンス障害時に何かしらのアクションを実行できます。アクションにはメール通知、AutoScaling実行、インスタンス停止または削除、インスタンス再起動があります。
今回は、システムステータスチェック異常時 または インスタンスステータスチェック異常時にEC2を自動で再起動させて、自動復旧するアラームを、AWS CLIにて追加します。
※もちろん、アプリなどが乗っている場合、OS起動時にプロセスの自動起動を設定す必要があります。
チェックするメトリクスは「StatusCheckFailed」となります。こちらは、システムステータス・インスタンスステータスのどちらも監視可能なメトリクスとなります。
それでは早速ですが、AWC CLIのコマンドを記載します。
※前提として、AWSアクセスキーの設定済みであることです(環境変数に設定 or aws configureを実行)
と、いうことでコマンドは以下となります。
instance_id="i-XXXXXXXX"
aws cloudwatch put-metric-alarm \
--alarm-name ec2_auto-recovery_${instance_id} \
--alarm-description "EC2 Auto Recovery" \
--metric-name StatusCheckFailed \
--namespace AWS/EC2 \
--statistic Maximum \
--period 300 \
--threshold 1 \
--comparison-operator GreaterThanOrEqualToThreshold \
--dimensions Name=InstanceId,Value=${instance_id} \
--evaluation-periods 1 \
--alarm-actions arn:aws:automate:ap-northeast-1:ec2:recover
参考URL
まとめ
簡単に、インスタンスレベルの自動復旧が設定できます。
自動復旧は、インスタンス・ハード周りの障害時に復旧可能ですが、アプリレベル(Webアプリ等)での自動復旧を行いたい場合は、ELB+AutoScalingを利用することにより自動復旧が可能です。