EC2 WindowsインスタンスにCloudWatchエージェントをインストールして稼働させる

2023.12.07

WindowsインスタンスにCloudWatchエージェントを導入してみます。 カスタムメトリクスやイベントログ/テキストログを CloudWatch コンソールから確認できるようにします。

今回は多くのインスタンスへ適用することを想定して、なるべく AWS CLIで完結するように設定していきます。

前提条件

対象のWindowsインスタンスが Systems Manager(SSM)管理下であることが前提条件です。

具体的にどのような前提条件があるのかは以下を参照ください。

今回は以下のような設定で Windowsインスタンスを作成します。

導入してみる

[準備] Windowsインスタンスを起動する

今回の検証用に Windows インスタンスを作成します。 Microsoft Windows Server 2022 Base AMI を選択しました。

img

img

SSMフリートマネージャーから、SSM管理下であることを確認します。

img

CloudWatchエージェントをインストールする

今回は SSM Run Command を使います。 Run Command はインスタンスへSSH or RDP接続せずに、 各種操作を行える機能です。

Run Command で使うSSMドキュメントは「AWS-ConfigureAWSPackage」です。 このSSMドキュメントを使うと、 各種パッケージのインストール/アンインストールが簡単に実行できます。

以降、AWS CloudShellから実行していきます。

##### EC2インスタンスのNameタグ値
instance_name="windows-test"
echo "- Instance Name: ${instance_name}"
# - Instance Name: windows-test

##### EC2インスタンスIDを取得
instance_id=$(aws ec2 describe-instances --output text \
  --filters Name="tag:Name",Values="${instance_name}" \
  --query "Reservations[].Instances[0].InstanceId")
echo "- Instance ID: ${instance_id}"
# - Instance ID: i-0535example

##### CloudWatchエージェントのインストール by SSM Run Command
aws ssm send-command --output yaml \
  --instance-ids "${instance_id}" \
  --document-name "AWS-ConfigureAWSPackage" \
  --parameters name="AmazonCloudWatchAgent",action="Install"
# Command:
#   AlarmConfiguration:
#     Alarms: []
#     IgnorePollAlarmFailure: false
#   CloudWatchOutputConfig:
#     CloudWatchLogGroupName: ''
#     CloudWatchOutputEnabled: false
#   CommandId: 262c6b05-8081-4361-80ef-890954186860
#   ... (略)

その後 SSM Run Command コンソールから実行成功を確認します。

img

img

CloudWatchエージェント設定ファイルを作成する

今回は以下のような設定ファイルとします。

  • テキストログ
    • SSMエージェントのログを "/WindowsTextLog/amazon-ssm-agent.log" へ送信
  • イベントログ
    • システムログの Error, Critical を "/WindowsEventLog/System" へ送信
    • セキュリティログの Error, Critical を "/WindowsEventLog/Security" へ送信
    • アプリケーションログの Error, Critical を "/WindowsEventLog/Application" へ送信
  • カスタムメトリクス
    • ディスク容量をカスタムメトリクスとして発行
    • メモリ使用量をカスタムメトリクスとして発行
    • SSMエージェントのプロセスメトリクスを発行

※今回は手動で設定ファイルを作成しましたが、 設定ファイルを作成するウィザードも活用できます。 詳細はこちらを参照ください。

作成したJSONがこちら。

{
  "logs": {
    "logs_collected": {
      "files": {
        "collect_list": [
          {
            "file_path": "C:\\ProgramData\\Amazon\\SSM\\Logs\\amazon-ssm-agent.log",
            "log_group_name": "/WindowsTextLog/amazon-ssm-agent.log",
            "log_stream_name": "{instance_id}",
            "retention_in_days": 90
          }
        ]
      },
      "windows_events": {
        "collect_list": [
          {
            "event_format": "xml",
            "event_levels": [
              "ERROR",
              "CRITICAL"
            ],
            "event_name": "System",
            "log_group_name": "/WindowsEventLog/System",
            "log_stream_name": "{instance_id}",
            "retention_in_days": 90
          },
          {
            "event_format": "xml",
            "event_levels": [
              "ERROR",
              "CRITICAL"
            ],
            "event_name": "/WindowsEventLog/Application",
            "log_group_name": "Application",
            "log_stream_name": "{instance_id}",
            "retention_in_days": 90
          },
          {
            "event_format": "xml",
            "event_levels": [
              "ERROR",
              "CRITICAL"
            ],
            "event_name": "/WindowsEventLog/Security",
            "log_group_name": "Security",
            "log_stream_name": "{instance_id}",
            "retention_in_days": 90
          }
        ]
      }
    }
  },
  "metrics": {
    "aggregation_dimensions": [
      [
        "InstanceId"
      ]
    ],
    "append_dimensions": {
      "ImageId": "${aws:ImageId}",
      "InstanceId": "${aws:InstanceId}",
      "InstanceType": "${aws:InstanceType}",
      "AutoScalingGroupName": "${aws:AutoScalingGroupName}"
    },
    "metrics_collected": {
      "LogicalDisk": {
        "measurement": [
          "% Free Space"
        ],
        "metrics_collection_interval": 60,
        "resources": [
          "*"
        ]
      },
      "Memory": {
        "measurement": [
          "% Committed Bytes In Use"
        ],
        "metrics_collection_interval": 60
      },
      "procstat": [
        {
          "exe": "amazon-ssm-agent.exe",
          "measurement": [
            "pid_count"
          ],
          "metrics_collection_interval": 60
        }
      ]
    }
  }
}

これを SSMパラメータストアに登録します。

IAMロール権限として CloudWatchAgentServerPolicy を使っている場合は パラメータ名に制約がある点に注意です。 AmazonCloudWatch- から始まるパラメータのみ取得可能です。

今回は AmazonCloudWatch-windows-test パラメータを作成しました。

img

CloudWatchエージェントを起動する

こちらも SSM Run Commandを活用します。 使うSSMドキュメントは「AmazonCloudWatch-ManageAgent」です。 指定した設定ファイルをベースに、CloudWatchエージェントを起動させます。

以下 CloudShellから実行しました。

##### EC2インスタンスのNameタグ値
instance_name="windows-test"
echo "- Instance Name: ${instance_name}"
# - Instance Name: windows-test

##### EC2インスタンスIDを取得
instance_id=$(aws ec2 describe-instances --output text \
  --filters Name="tag:Name",Values="${instance_name}" \
  --query "Reservations[].Instances[0].InstanceId")
echo "- Instance ID: ${instance_id}"
# - Instance ID: i-0535example

##### CloudWatchエージェントの起動 by SSM Run Command 
aws ssm send-command --output yaml \
--instance-ids $instance_id \
--document-name "AmazonCloudWatch-ManageAgent" \
--parameters \
action="configure",mode="ec2",\
optionalConfigurationSource="ssm",\
optionalConfigurationLocation="AmazonCloudWatch-${instance_name}",\
optionalRestart="yes"
# Command:
#   AlarmConfiguration:
#     Alarms: []
#     IgnorePollAlarmFailure: false
#   CloudWatchOutputConfig:
#     CloudWatchLogGroupName: ''
#     CloudWatchOutputEnabled: false
#   CommandId: 1157fbfd-5a30-47c5-b808-ff29d524ac27
#   ... (略)

その後 SSM Run Command コンソールから実行成功を確認します。

img

メトリクス・ログを確認する

テキストログ

"/WindowsTextLog/amazon-ssm-agent.log" へログ発行されていることを確認しました。

img

イベントログ

今回は Error と Critical に絞っていましたが、 "/WindowsEventLog/System" にていくつか観測できました。

img

カスタムメトリクス

ディスク空き容量とメモリ使用率のカスタムメトリクスを確認できました。

img

また設定したプロセスメトリクス(SSMエージェントのプロセス状態)も確認できました。

img

おわりに

Windowsインスタンス上にCloudWatchエージェントを稼働させてみました。

取得したかったメトリクス(メモリ使用量やプロセス)、ログ(イベントログやアプリログ) をCloudWatchへ集約することができました。

以上、参考になれば幸いです。

参考