WorkSpacesにCloudWatchAgentを導入してWindowsイベントログを出力してみた

2020.11.09

どうもコンサルティング部の後藤です。

今回はWindowsのWorkSpacesで、WindowsイベントログをCloudWatchLogsに出力する事をやってみたので、その作業内容をまとめた記事になります。

CloudWatchAgent導入

WorkSpacesにCloudWatchAgentを導入する方法は2通りあるかと存じます。

  • SSMでWorkSpacesを管理してRunCommandを実行する
  • AWSのドキュメントよりmsiをダウンロードして手動インストールする

今回はWorkSpacesがインターネットに接続できる環境だったため、後者のやり方を取りました。

まず、AWSドキュメントからamazon-cloudwatch-agent.msiをダウンロードして、そのままインストールします。

インストールが完了すると、以下PATHにCloudWatchAgentのフォルダが作成されているかと思います。

C:\Program Files\Amazon\AmazonCloudWatchAgent

環境変数の設定

WindowsイベントログをCloudWatchAgentからCloudWathcLogsに送信するための権限を設定します。WorkSpacesにはIAMロールを付与することが出来ないため、CloudWatchLogsに送信するための権限のみを持たせたIAMユーザを作成して、そのクレデンシャル情報を使用します。

今回使用するIAMユーザには、AWS管理ポリシーの「CloudWatchAgentAdminPolicy」を付与して作成しています。

IAMユーザのクレデンシャル情報が判明したら、その情報をWorkSpacesに保持させます。今回はWorkSpacesにクレデンシャル情報を保持させるため「システム環境変数」に設定していきます。
システム環境変数は以下から新規に設定可能です。

・「システム」->「システムの詳細設定」->「環境変数」-> システム環境変数の「新規」

環境変数として、以下の3つの変数を設定します。

  • AWS_REGION : リージョン名を記入(例 : ap-northeast-1
  • AWS_SECRET_ACCESS_KEY : シークレットアクセスキー
  • AWS_ACCESS_KEY_ID : アクセスキー

Powershellの実行権限

WorkSpacesのPowershell実行権限は以下の通りになっています。

> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process       Undefined
  CurrentUser       Undefined
 LocalMachine      Restricted

このままではCloudWatchAgentのスクリプトを実行できないので、以下のコマンドを実行して権限を与えます。。

> Set-ExecutionPolicy RemoteSigned -Scope Process
実行ポリシー変更しますか?の問いに対して、y で回答。

> Get-ExecutionPolicy -List

        Scope ExecutionPolicy
        ----- ---------------
MachinePolicy       Undefined
   UserPolicy       Undefined
      Process    RemoteSigned
  CurrentUser       Undefined
 LocalMachine      Restricted

Process部分がRemote Signedに変更されていれば実行権限変更完了です。

CloudWatchAgentのConfig設定

Powershellを管理者権限で実行して、以下を実行します。

> cd "C:\Program Files\Amazon\AmazonCloudWatchAgent\"
> .\amazon-cloudwatch-agent-config-wizard.exe

configウィザードで必要な部分を選択していきます。今回は最低限Windowsイベントログを出力するconfig.jsonを作成しました。

{
        "logs": {
                "logs_collected": {
                        "windows_events": {
                                "collect_list": [
                                        {
                                                "event_format": "xml",
                                                "event_levels": [
                                                        "VERBOSE",
                                                        "INFORMATION",
                                                        "WARNING",
                                                        "ERROR",
                                                        "CRITICAL"
                                                ],
                                                "event_name": "System",
                                                "log_group_name": "System",
                                                "log_stream_name": "{hostname}"
                                        }
                                ]
                        }
                }
        }
}

config.json作成後、以下コマンドを実行します。

> .\amazon-cloudwatch-agent-ctl.ps1 -a fetch-config -c file:config.json
Successfully fetched the config and saved in C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp
Start configuration validation...
2020/11/09 14:02:19 Reading json config file path: C:\ProgramData\Amazon\AmazonCloudWatchAgent\Configs\file_config.json.tmp ...
Valid Json input schema.
No csm configuration found.
Configuration validation first phase succeeded
Configuration validation second phase succeeded
Configuration validation succeeded

Succeededと表示されれば完了です。

CloudWatchAgent実行とログ確認

CloudWatchAgentを実行するため、以下を実行します。

> .\amazon-cloudwatch-agent-ctl.ps1 -a status
{
  "status": "stopped",
  "starttime": "",
  "version": "1.247346.0b249609"
}

> .\amazon-cloudwatch-agent-ctl.ps1 -a start

> .\amazon-cloudwatch-agent-ctl.ps1 -a status
{
  "status": "running",
  "starttime": "2020-11-09T14:06:28",
  "version": "1.247346.0b249609"
}

CloudWatchAgentが実行出来たら、CloudWatchLogsを確認しにいきます。

CloudWatchLogsに指定したロググループが出来ていると思うので、そちらを確認すると以下画像のようにWindowsイベントログが出力されていることが確認出来ました。

最後に

如何だったでしょうか。WindowsのWorkSpacesからCloudWatchAgent経由でWindowsイベントログから出力することが出来ました。が、しかし見難いですね。。出力するWindowsイベントのレベルは設定出来るため、全てのイベントを出力するのではなく重要なイベントのみ通知して検知する仕組みとして使用出来るかなといった所感です。
この記事が何方かのお役になれば幸いです。