EC2上のプロセスを監視し自動復旧する

こんにちは。
ご機嫌いかがでしょうか。
"No human labor is no human error" が大好きな吉井です。

今回は EC2 インスタンス上のプロセスを監視し、
プロセスが停止していたらアクションを実行する方法を試してみます。

ビジネス上の重要度は高くないので冗長化にコストをかけたくない、
しかし、サービスが落ちていたら自動で復旧してほしいな
という需要に応えます。

前提

CloudWatch Agent セットアップ

まずは対象の EC2 インスタンスに対して CloudWatch Agent のセットアップを行います。
セットアップは以下のエントリを参照して行ってください。

新しいCloudWatch Agentでメトリクスとログの収集が行なえます

実装

今回は例として 「httpd を監視して、プロセス数が 0 になったら EC2 インスタンスを停止する」 という実装をします。

プロセス監視用 CloudWatch Agent 設定ファイルの作成

特定プロセスを監視する設定ファイルを作成します。
設定ファイルはパラメータストアに格納します。

パラメータストア を開きます。

パラメータの作成 をクリックします。

<パラメータの詳細> 画面では以下の値を入力します。

項目 設定値
名前 識別しやすい名前を入力します。後で使うのでメモしておきます。
説明 説明文を入力します
利用枠 標準を選択します
タイプ 文字列を選択します
以下参照
{
    "metrics": {
        "metrics_collected": {
            "procstat": [
                {
                    "exe": "httpd",
                    "measurement": [
                        "pid_count"
                    ],
                    "metrics_collection_interval": 60
                }
            ]
        }
    }
}

"exe" にプロセス名を記述します。
記述した文字列は正規表現として評価されます。

"exe" 以外にも指定が可能です。

  • pid_file: 作成するプロセス識別番号 (PID) ファイルの名前でプロセスを選択します。
  • exe: 正規表現の照合ルールを使用して、指定した文字列と一致するプロセス名のプロセスを選択します。
  • pattern: プロセスの起動に使用するコマンドラインでプロセスを選択します。正規表現の照合ルールを使用して指定した文字列と一致するコマンドラインを持つすべてのプロセスが選択されます。コマンドで使用されるパラメータやオプションも含めて、コマンドライン全体がチェックされます。

パラメータの作成 をクリックし、<パラメータの詳細> 画面を閉じます。

設定ファイルの反映

設定ファイルを CloudWatch Agent に反映します。

ランコマンド を開きます。

コマンドの実行 をクリックします。

AmazonCloudWatch-ManageAgent を探し、ラジオボタンにチェックを入れます。

コマンドのパラメータは以下のようにします。
※記載の無いパラメータはデフォルトのまま

  • Action → Configure (append)
  • Optional Configuration Location → 前の手順で作成した設定ファイルの名前

ターゲットインスタンス から対象のインスタンスを選択します。

出力オプション で任意の S3 バケットを選択します。
Run Command の出力はコンソールでは2500文字しか表示されず、日本語が文字化けします。
エラー時の解析を容易にするため、及び、実行証跡を残すために必ず S3 バケットを出力するようにします。

実行 ボタンをクリックすると処理が実行されます。
実行の詳細が表示されるので成功することを確認します。

CloudWatch メトリクスの確認

メトリクス を開きます。

数分待ちます。
CloudWatch メトリクスの「すべて > CWAgent > ImageId, InstanceId, InstanceType, exe, pid_finder」に
メトリクスが収集されています。

CloudWatch アラームの作成

メトリクスが収集されていることを確認したらアラームを設定します。
アラーム を開きます。

アラームの作成 をクリックします。

<新しいアラームの作成> 画面では、メトリクスの選択 をクリックします。

「CWAgent > ImageId, InstanceId, InstanceType, exe, pid_finder」を選択します。
下の図のように期間は 1分 にします。

アラーム詳細は以下のように設定します。

項目 設定値
名前 識別しやすい名前
説明 説明文を入力します
< 1
期間 1 / 1

アクションは EC2 アクション を選択し以下のように設定します。
※本エントリでは動作確認を容易にしたいため「インスタンスの停止」にしていますが、
実際の運用では貴社の望むアクションを選択してください。(おそらく再起動になると思います)

項目 設定値
アラームが次の時 状態:警告
次のアクションを実行 このインスタンスの停止

アラームの作成 をクリックし、<新しいアラームの作成> 画面を閉じます。

テスト

EC2 インスタンスにログインして httpd を停止します。

想定通り EC2 インスタンスが停止しました。

アラームのステータスをクリックしてみます。
前の手順で作成したアラームでした。

さいごに

本気で可用性を確保するのであれば、ELB 配下で複数台構成にしたり、
クラスタリング構成をとりますが、その分コストは発生します。
例えば、ビジネスに影響が少ない社内システムで数時間以内に復旧すれば良いサーバーには
本エントリの内容で十分対応出来るのではないでしょうか。

参考

procstat プラグインでプロセスメトリクスを収集する
CloudWatch Agent でProcstatプラグインの利用が可能になりました