カテゴリー
AWS Cloud Watch Cloud Watch Event EC2 Simple Notification Service(SNS)

AWS システムステータスチェックエラー時にEC2を自動復旧する

今回のゴール

EC2のステータスチェックでエラーになった時に自動でリカバリーできるように、インスタンスのステータスチェックでエラーになった時はSNS通知するように設定します。

ステータスチェックとは

ステータスチェックには下記の2つがあります。

システムステータスのチェック

  • ネットワーク接続の喪失
  • システム電源の喪失
  • 物理ホストのソフトウェアの問題
  • ネットワーク到達可能性に影響する、物理ホスト上のハードウェアの問題

【インスタンスのステータスチェック】

  • 失敗したシステムステータスチェック
  • 正しくないネットワークまたは起動設定
  • メモリの枯渇
  • 破損したファイルシステム
  • 互換性のないカーネル

1つ以上のステータスチェックが失敗すると、全体のステータスが”impaired”となります。

インスタンスのステータスチェック

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html

復旧後のインスタンスは復旧前と比べて何が違うのでしょうか?
公式サイトでは下記のように記述されておりました。

復旧されたインスタンスは、インスタンス ID、プライベート IP アドレス、Elastic IP アドレス、すべてのインスタンスメタデータを含め、元のインスタンスと同じです。

正常に機能していないインスタンスにパブリック IPv4 アドレスが割り当てられている場合は、そのインスタンスの復旧後も、パブリック IPv4 アドレスは保持されます。

障害のあるインスタンスがプレイスメントグループ内にある場合、回復されたインスタンスはそのプレイスメントグループ内で実行されます。

インスタンスの復旧

“復旧”ではENIが維持されたままになりますのでMACアドレスが変わることもないようです。
特に変わることは無いようなので、何も恐れずに自動復旧できそうです。

今回の設定

完全に復旧を自動化するのであれば、

  • システムのステータスチェックエラー時 → 自動復旧
  • インスタンスのステータスチェックエラー時 → 再起動

とするのですが、インスタンスでミッションクリティカルなアプリを起動している時は簡単に再起動できないかと思いますので、インスタンスのステータスエラー時はSNS通知に留めようと思います。

補足ですが、完全に自動化するときは、下記に記載があるように再起動と修復アクション間で不具合が生じないように考慮する必要があります。

再起動と復旧アクション間で不具合が発生するのを回避するには、再起動アラームと復旧アラームを同じ検査期間に設定するのを避けます。復旧アラームを各 1 分間の 2 つの評価期間に設定し、再起動アラームを各 1 分間の 3 つの評価期間に設定することをお勧めします。

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html#AddingRecoverActions

インスタンスステータスエラーのSNS通知の設定

下記のサイトを参考にしました。

コンソールを使用したステータスチェックアラームの作成

https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/monitoring-system-instance-status-check.html#using-cloudwatch-new-console2

EC2サービス-[インスタンス]を選択、該当のEC2インスタンスを選択します。
[ステータスチェック]タブを選択して[アクション]より[ステータスアラームを作成]を選択します。

【アラームを通知】
SNSトピックを選択します。

【アラームのしきい値】
[Type of data to sample]:ステータスチェックの失敗:インスタンス
[連続した期間]:2
[期間]:1分

システムステータスエラーの自動復旧の設定

自動復旧の設定については下記のサイトを参考にしました。

Amazon CloudWatch アラームへの復旧アクションの追加

https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/monitoring/UsingAlarmActions.html#AddingRecoverActions
CloudWatchアラームの作成

cloudwatchサービス-[アラーム]-[全てのアラーム]を選択して、「アラームの作成」ボタンをクリックします。

「メトリクスの選択」ボタンを押し、[EC2]-[インスタンス別メトリクス]と選択して、該当インスタンスのStatusCheckFailed_Systemを選択して、「メトリクスの選択」ボタンをクリックします。

【メトリクス】
[統計]:最小
[期間]:1分

【条件】
[しきい値の種類]:静的
[StatusCheckFailed_Systemが次の時…]:より大きい
[…よりも]:0
[アラームを実行するデータポイント]:2/2

【アクションの設定】
[通知の連絡先]:既存のSNSトピックを選択します。

【EC2アクション】
“アラーム状態”を選択して、”このインスタンスを復旧”にチェック

[アラーム名]:alarm_ec2_system_recovery

確認

復旧の動作を確認しようとテスト方法を色々と調べてみましたが、できないようでした。

運用上で実際に復旧された時に追記しようと思います。