こんにちは。SCSKの松原です。
EC2インスタンス上で稼働するプロセスが停止していたら、復旧・通知等のアクションを実施するといった、プロセス監視を実装したので、ご紹介します。
実現イメージ
今回は、特定のプロセスを監視して、プロセス数が0になったらEC2インスタンスを再起動し、その通知をSNSにて管理者に送信するように実装します。
また、EC2インスタンスの再起動時に、ユーザーデータに対象プロセスの起動コマンドが実行されるように設定し、自動で対象プロセスが起動するように設定します。
前提
- 構築したEC2インスタンスにCloudWatch Agentが導入済みであること
- 監視対象プロセスのプロセス名が把握できていること
- マネージドポリシーの「AmazonEC2ReadOnlyAccess」、「AmazonSSMFullAccess」権限を付与したIAMロールが、対象インスタンスにアタッチされていること
手順
実際の実施手順を紹介します。
AWSコンソール画面へのリンクは、AWSにログイン済みの状態にてご利用ください。
設定ファイルの作成・反映
特定プロセスを監視する、CloudWatch Agent用の設定ファイルを作成し、対象インスタンスに反映します。
- AWS Systems Managerのパラメータストアから「パラメータの作成」を押す
- パラメータを下表のように設定する。
- 名前 :任意の名前(ここでは”ProcessWatchTest”としている)
- 説明 :任意の説明を記載
- 利用枠 :標準を選択
- タイプ :文字列を選択
- データ型 :Textを選択
- 値 :下記の通り
{ "metrics": { "metrics_collected": { "procstat": [ { "exe": "監視対象のプロセス名", "measurement": [ "pid_count" ], "metrics_collection_interval": 10 } ] } } }
※ “exe”の項目は自身が監視したいプロセス名を記載する。指定可能な他の項目は下記リンクを参照。
- 「パラメータを作成」を押す
これで、パラメータの作成は完了です。続いて、作成したパラメータを、対象のEC2インスタンスのCloud Watch Agentに反映します。
- AWS Systems Managerのコマンドの実行から、AmazonCloudWatch-ManageAgentを選択する
- コマンドのパラメータのActionを「configure(append)」、Optional configuration Locationに、手順2.にて設定したパラメータの名前を入力し、その他の項目は、デフォルトのまま変更しない
- ターゲットから「インスタンスを手動で選択する」を押し、対象のインスタンスを選択する
- 「実行」ボタンを押す
CloudWatchメトリクス確認
CloudWatchから、プロセスの状態を取得できているか確認します。
- CloudWatchのすべてのメトリクスから、カスタム名前空間の「CWAgent」を押す
- 「ImageId,InstanceId,InstanceType,exe,pid_finder」が追加されているはずなので押す
- 対象プロセスの起動数が、取得されていることを確認する
CloudWatchアラーム作成
プロセスが停止(起動プロセス数が0)した際に発報する、アラームを作成します。
- CloudWatchのすべてのアラーム(リンク)より「アラームの作成」を押す
- メトリクスの選択を押す
- 先ほど確認した「ImageId,InstanceId,InstanceType,exe,pid_finder」から、対象のメトリクスを選択し、「メトリクスの選択」を押す
- プロセス数が1よりも小さい場合に、アラームが発報するよう、条件を設定し、「次へ」を押す
- 通知項目から、「アラーム状態」を選択し、「既存のSNSトピックを選択」を押して、トピックを選択する
※既存のトピックがない場合は「新しいトピックの作成」から新規作成する
- EC2アクションの項目から、「アラーム状態」を押し、ここでは動作確認のため、ひとまず「このインスタンスを停止」を押す
- アラーム名と説明を任意のものを入力し、次へを押す
- プレビューと作成画面に遷移するので、問題なければアラームの作成を押す
設定は以上です。あとは、対象のEC2インスタンスに接続して、対象プロセスを停止させ、動作を確認します。
プロセスを停止させて数分後、無事対象のEC2インスタンスが停止し、通知メールが届けば成功です。
自動復旧の実現
プロセスが停止した場合に、自動でインスタンスを再起動し、また、EC2インスタンス起動時に、対象プロセスを起動するシェルスクリプトを実行するよう設定します。
- CloudWatchのすべてのアラームから、先ほど作成したアラームを選択し、アクションプルダウンから、編集を押す
- EC2アクションの項目まで次へを押し、「このインスタンスの再起動」に変更し、アラームの更新を押す
- EC2にアクセスし、対象インスタンスを選択、アクションから「インスタンスの設定」→「ユーザーデータを編集」を選択する
- ユーザーデータの編集から、「ユーザーデータをテキストで変更」を選択する
- 入力欄に下記を入力する
「#!/bin/bash」の次の行より、対象プロセスを起動させるためのコマンドを記述する
Content-Type: multipart/mixed; boundary="//" MIME-Version: 1.0 --// Content-Type: text/cloud-config; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="cloud-config.txt" #cloud-config cloud_final_modules: - [scripts-user, always] --// Content-Type: text/x-shellscript; charset="us-ascii" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="userdata.txt" #!/bin/bash //ここにプロセスを起動させるためのシェルスクリプトを記載// --//--
- 保存を押す
これで、監視対象のプロセスが停止した場合に、対象のインスタンスとプロセスを再起動するよう設定できました。
また、SNSトピックによる通知により、プロセスが停止したことを知ることもできます。
おわりに
自動復旧の方法については、いくつか手法があると思いますが、まずはお手軽そうなものを試してみました。
以上が、EC2インスタンス上で稼働するプロセスでの、プロセス監視方法のご紹介でした。