こんにちは。
以前カスタムメトリクスを使ってLinuxのプロセス監視を行うブログを書いたのですが、今回Windowsで同様のことをやってみたいと思います。
Linux編はこちら。 qiita.com
環境
- WindowsServer2012R2 (ami-281ad849)
- AWS CLI (ver 1.10.63)
目次
- IAMロール作成
- batファイル作成
- テスト
作業
1. IAMロール作成(AWSコンソール作業)
まず、インスタンスにアタッチするIAMロールを作成します。
ポリシーは PutMetoricData
のみ許可します。
IAMポリシー
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "cloudwatch:PutMetricData" ], "Resource": [ "*" ] } ] }
上記ポリシーを持ったIAMロールを作成し、WIndowsServer起動時に、アタッチします。
2. batファイル作成(WindowsServer作業)
WIndowsServerを起動したら、プロセスの状態をCloudWatchにPutするバッチを作成します。 今回AWSCLIのインストール手順は割愛します。必要であればクラメソさんの記事を参照ください。
Windows Server への AWS CLIのインストール | Developers.IO
監視するプロセスは、特になんでもいいのですが、W32Time
にしてみました。
スクリプト内容を記載していますので、コピー&ペーストでbatファイルを作成してください。
スクリプト概要
- for分でメタデータより、incetanceidを変数(incetanceid)に格納
sc query
コマンドで、プロセスの状態がRUNNING
かどうか確認sc query
コマンドの返り値を確認- 返り値が1(プロセスが起動中)ならば、変数(Processes)に1を格納
- 返り値が0(プロセス起動中以外)ならば、変数(Processes)に0を格納
- 格納した変数をもとに、CloudWatchにデータをPUT
スクリプト
@echo off for /f "usebackq tokens=*" %%a in (`PowerShell.exe -Command invoke-restmethod -uri http://169.254.169.254/latest/meta-data/instance-id`) do @set incetanceid=%%a sc query W32Time | findstr STATE | findstr RUNNING > null if %errorlevel% == 0 ( set Processes=1 ) else ( set Processes=0 ) aws cloudwatch put-metric-data --metric-name "W32Time" --namespace "System/Windows" --region ap-northeast-1 --value %Processes% --unit "Count" --dimensions "InstanceId=%incetanceid%"
3. テスト
最後にスクリプトのテストをします。
- W32Timeプロセスが起動している場合(1を返す)
- W32Timeプロセスが停止している場合(0を返す)
あとは、タスクマネージャーにスクリプトを仕込んで定期実行すれば、プロセスの監視ができますね。
プロセスが停止している場合にアラートを上げる設定は、カスタムメトリクスの値をトリガーにCloudWatchの設定をしてください。
以上となります。 ご指摘事項がありましたら、ご連絡お願いします。
参考
http://docs.aws.amazon.com/ja_jp/AWSEC2/latest/WindowsGuide/ec2-instance-metadata.html