目次
BeeXの榊原です。今回案件でタイトルの内容を設定する機会があったので、その詳細手順を共有します。本記事はEC2(Windows)にCloudWatchエージェントが導入済みであることを前提とします。もし1から詳細な設定手順を知りたい方はQiitaで弊社エンジニアが丁寧に記事化していますので、こちらをご参照ください。また、今回最後まで設定するにあたりAWSサポートの方にもアドバイスをいただきました。いつも本当にありがとうございます。
知っておくと便利なコマンド
本題に入る前に、2つコマンドを紹介します。今回監視したいサービス名の実行パスが必要なので、それに関連するコマンドです。Windowsのサービスから確認するのもOKです。
tasklist /v /fi "STATUS eq running"
現在実行されているすべてのプロセスの情報を一覧表示するコマンドです。コマンドプロンプトを立ち上げた状態の実行結果は以下の通りです。コマンドプロンプトに関する結果だけ抜粋しています。
C:\Users\Administrator> tasklist /v /fi "STATUS eq running"
イメージ名 PID セッション名 セッション# メモリ使用量 状態 ユーザー名 CPU 時間 ウィンドウ タイトル
========================= ======== ================ =========== ============ =============== ================================================== ============ ========================================================================
<省略>
cmd.exe 2264 RDP-Tcp#0 2 5,408 K Running EC2AMAZ-NQ0313C\Administrator 0:00:00 管理者: コマンド プロンプト
<省略>
Get-WmiObject -Class Win32_Process | Select-Object Name, ProcessID, CommandLine | Format-List
プロセス名と、プロセスID、プロセス起動時のコマンドラインをリストにして返してくれます。結果はコマンドプロンプトとCloudWatchAgentに関する部分を抜粋しています。
PS C:\Users\Administrator> Get-WmiObject -Class Win32_Process | Select-Object Name, ProcessID, CommandLine | Format-List
<省略>
Name : cmd.exe
ProcessID : 2264
CommandLine : "C:\Windows\system32\cmd.exe"
Name : start-amazon-cloudwatch-agent.exe
ProcessID : 6644
CommandLine : "C:\Program Files\Amazon\AmazonCloudWatchAgent\start-amazon-cloudwatch-agent.exe"
Name : amazon-cloudwatch-agent.exe
ProcessID : 4148
CommandLine : "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.exe" -config C:\ProgramData\Amazon
\AmazonCloudWatchAgent\amazon-cloudwatch-agent.toml -envconfig C:\ProgramData\Amazon\AmazonCloudWatchAgen
t\env-config.json -otelconfig C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.yaml
<省略>
設定手順
今回コマンドプロンプトを監視対象とします。その場合、監視すべき実行パスは上の結果から「"C:\Windows\system32\cmd.exe"」です。これを前提として以下設定を進めます。
CloudWatchAgentの設定ファイル編集と反映
設定ファイルはウィザードで設定しており、OSの「C:\ProgramFiles\Amazon\AmazonCloudWatchAgent\config.json」内の設定ファイルを編集します。
プロセスの収集にはprocstatを使います。今回は以下のように記載しています。実行パス入力の際はエスケープ文字を使う点、パスを%で挟む点でご注意ください。例えば今回「"C:\Windows\system32\cmd.exe"」が監視対象ですが、jsonファイル内では「"%C:\\Windows\\System32\\cmd.exe%"」と記載する必要があります。
Windows Server を実行するサーバーの場合、これらの文字列は WMI クエリとして評価されます。文字列の例は
pattern: "%apache%"
などです。詳細については、「LIKE Operator」を参照してください。(引用元:procstat プラグインでプロセスメトリクスを収集する)
最終的に以下のようなファイルになります。
{
"metrics": {
"metrics_collected": {
"LogicalDisk": {
"measurement": [
"% Free Space"
],
"resources": [
"*"
]
},
"Memory": {
"measurement": [
"% Committed Bytes In Use"
]
},
"procstat": [
{
"pattern": "%C:\\Windows\\System32\\cmd.exe%",
"measurement": [
"pid_count"
],
"metrics_collection_interval": 60
}
]
}
}
}
configファイルの設定を反映、保存したら下記2つのコマンドを入力してCloudWatchAgentを再度起動しましょう。
& "C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1" -a fetch-config -m ec2 -s -c file:"C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json"
****** processing amazon-cloudwatch-agent ******
I! Trying to detect region from ec2
D! [EC2] Found active network interface
I! imds retry client will retry 1 timesSuccessfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp
Start configuration validation...
<省略>
Configuration validation second phase succeeded
Configuration validation succeeded
AmazonCloudWatchAgent has been stopped
AmazonCloudWatchAgent has been started
& $Env:ProgramFiles\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-ctl.ps1 -m ec2 -a status
{
"status": "running",
"starttime": "2024-08-20T12:37:33",
"configstatus": "configured",
"version": "1.300043.0b781"
}
もし最初のコマンドでエラーが出た場合はconfig.jsonをエディタで整形して再チャレンジしてみてください。以上でCloudWatchAgentの設定は完了です。
CloudWatchメトリクスの確認
数分時間を置いたらAWSコンソールを確認してみましょう。上の設定であればCloudWatchのメトリクスから「CWAgent」>「host, pattern, pid_finder」で内容が確認できます。タブのグラフ化したメトリクスの統計を「合計」にすることをお忘れなく。プロセスが立ち上がっているので1で出力されています。
CloudWatchアラームの設定
CloudShellから下記コマンドでCloudWatchアラームを設定します。慣れていない方はコンソールから作成いただいても問題ありません。内容はパターンにマッチしたプロセスが取れなくなったら、アラートを発報するものです。発報用SNSトピックの作成手順は省略します。
aws cloudwatch put-metric-alarm \
--alarm-name "test-alarm" \
--alarm-actions <SNSトピックのARN> \
--namespace "CWAgent" \
--dimensions "Name=host,Value=<ホスト名>" "Name=pattern,Value=%C:\Windows\System32\cmd.exe%" "Name=pid_finder,Value=native" \
--metric-name "procstat_lookup pid_count" \
--threshold 1 \
--comparison-operator "LessThanThreshold" \
--period 60 \
--evaluation-periods 1 \
--datapoints-to-alarm 1 \
--statistic "Sum" \
--treat-missing-data missing
実行後エラーが出なければアラームが作成されます。少し待って状態が「OK」になるまで待ちましょう。状態が「データ不足」からずっと動かない場合、アラームのパラメータ設定に問題がある可能性が高いです。
アラームテスト
試しに監視対象インスタンスのコマンドプロンプトを閉じましょう。正しく設定できていれば以下のようにメールが届きます。
もしアラート状態になったのにメールが届かない場合はSNSトピックのアクセスポリシーが下記のようになっているか確認してください。参考
{
"Sid": "Allow_Publish_Alarms",
"Effect": "Allow",
"Principal": {
"Service": [
"cloudwatch.amazonaws.com"
]
},
"Action": "sns:Publish",
"Resource": "arn:aws:sns:us-east-1:ACCOUNT_ID:TOPIC_NAME"
}
最後に
今回はCloudWatchメトリクスを用いてWindowsのプロセスを監視するための設定手順、アラート作成、テストを実施しました。1度設定したらなんてことはないのですが、自分はここまで来るのに非常に時間を要したため今回記事化しました。この記事が誰かのお役に立てば幸いです。ここまでお読みいただきありがとうございました。
参考URL
procstat プラグインでプロセスメトリクスを収集する
tasklist
CloudWatch アラームトリガーに関する SNS 通知が届かないのはなぜですか?
CloudWatchでのログとメトリクス収集(Windows)