【AWS SSMステートマネージャー】複数のEC2インスタンス(Linux)に対するプロセスチェック

2022.11.16

全インスタンスに特定アプリケーション(例えばエンドポイントセキュリティ) がインストールされていて、 かつ「稼働もしている」ことを棚卸ししたいケースがあると思います。

今回は特定アプリケーションが「稼働している」ことを棚卸しする一手段を紹介します。 Systems Manager(SSM) ステートマネージャーを使います。

※1: 「インストールされている」ことは Configルールを使って簡単に実現できます。 (参考: DevelopersIO)

※2: プロセスダウンをすぐに検知しないといけない、といったリアルタイム性が求められる場合は CloudWatch Agent や他 Third Party の「ちゃんとしたプロセス監視」を実装しましょう。

前提条件

EC2インスタンスが SSM管理下であることが前提条件です。

SSM管理下にする方法については以下ブログが参考になります。

また、「そもそもSSM管理下かどうか」は ConfigルールやSecurity Hubで検知できます。

作ってみる

今回は全インスタンスに CloudWatch Agent ( amazon-cloudwatch-agent ) が稼働しているか、 定期的にチェックする環境を作ってみます。

Systems Manager のステートマネージャーページに移動します。 [関連付けの作成] を選択します。

img

「名前」を適当に記載します。今回は process-check-amazon-cloudwatch-agent としました。

img

「ドキュメント」部分は AWS-RunShellScript を選択します。 これはパラメータに指定したコマンドをEC2インスタンス上で実行できるドキュメントです。

img

「パラメータのCommands」には 以下の ps コマンド ( ps -C ${プロセス名} )を指定します。

img

このコマンドで、実行ファイル名を指定してプロセス情報を表示します。 もし起動していなかったときは、このコマンドは異常終了扱いになります。以下挙動の例です。

$ ps -C amazon-cloudwatch-agent
#  PID TTY          TIME CMD
#  2643 ?        00:00:40 amazon-cloudwat

$ echo $?
# 0 (= 成功)

$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a stop
$ ps -C amazon-cloudwatch-agent
#   PID TTY          TIME CMD

$ echo $?
# 1 (= 失敗)

次に「ターゲット」です。今回は すべてのインスタンスを選択 とします。 (必要に応じてターゲットの範囲を変えてください。タグ指定なども可能です)

img

「スケジュール」は デフォルト(30分ごとの実行)、cron間隔のみの実行 とします。 (ここも好みに合わせて変更して下さい)

img

他の項目は特に変えずに、作成します。

img

以上でプロセス棚卸し環境の作成は完了です。

確認する

できたステートマネージャの関連付けリソースはこんな感じです。

img

しばらく待つと関連付けが実行されました。 [リソース] タブを見ると成功したインスタンス、失敗したインスタンスが確認できます。

img

成功したインスタンスは ps -C ${プロセス名} が正常終了したもの、つまりプロセスが稼働していることを示しています。 失敗したインスタンスは ps -C ${プロセス名} が異常終了したもの、つまりプロセスがダウンしていることを示しています。

以上、確認でした。こんな感じで、簡易なプロセス棚卸し環境を作れます。SSM、便利。

カスタマイズ

EventBridge連携

EventBridgeを使って通知の仕組みを作成できます。 以下にフィルタ例を記載します。チェックに失敗したイベントを拾うものです。 (適宜 association-name 値を変えてください)

{
  "source": ["aws.ssm"],
  "detail-type": ["EC2 State Manager Association State Change"],
  "detail": {
    "association-name": ["process-check-amazon-cloudwatch-agent"],
    "status": ["Failed"]
  }
}

▼ 参考: 失敗したイベントのJSONサンプル

{
  "version": "0",
  "id": "15f581f9-f5ad-1768-dc0f-3c55b0267937",
  "detail-type": "EC2 State Manager Association State Change",
  "source": "aws.ssm",
  "account": "123456789012",
  "time": "2022-11-16T07:00:22Z",
  "region": "ap-northeast-1",
  "resources": [
    "arn:aws:ssm:ap-northeast-1::document/AWS-RunShellScript"
  ],
  "detail": {
    "association-id": "57b54c20-aa8d-4a69-805d-3ba24c1e84a1",
    "association-name": "process-check-amazon-cloudwatch-agent",
    "document-name": "AWS-RunShellScript",
    "association-version": "1",
    "document-version": "Optional.empty",
    "targets": "[{\"key\":\"InstanceIds\",\"values\":[\"*\"]}]",
    "creation-date": "2022-11-16T06:43:53.635736Z",
    "last-execution-date": "2022-11-16T07:00:19.417Z",
    "last-updated-date": "2022-11-16T06:43:53.635736Z",
    "status": "Failed",
    "detailed-status": "Failed",
    "association-status-aggregated-count": "{\"Failed\":1,\"Success\":1}",
    "schedule-expression": "cron(0 */30 * * * ? *)",
    "association-cwe-version": "1.0"
  }
}

おわりに

「ゆるいプロセス監視」の実装例でした。 SSM管理下であればサクッと作成できるので便利だと思います。

参考