How to monitor free disk space at AWS EC2 with Cloud Watch in windows

In Windows EC2 instance (tested on Server 2019) Download and install CloudWatch Agent based on your instance type.

AWS CloudWatch Agent Installation

After that you'll notice a new service called Amazon CloudWatch Agent: it won't start until you configure it.

To configure that run the wizard located at C:\Program Files\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent-config-wizard.exe

Answer to all questions (you can skip log analysis and choos Basic metric for free storage percentage) and eventually a file called config.json will be created at C:\Program Files\Amazon\AmazonCloudWatchAgent

Move this file to C:\ProgramData\Amazon\AmazonCloudWatchAgent, rename it as amazon-cloudwatch-agent.json and start the service Cloudwatch Agent.

The service should start and collect metrics,check the log to see if there's are any error

If in log located at C:\ProgramData\Amazon\AmazonCloudWatchAgent\Logs you see this...

2020/05/27 16:11:27 I! Config has been translated into TOML C:\ProgramData\Amazon\AmazonCloudWatchAgent\amazon-cloudwatch-agent.toml 2020-05-27T14:11:31Z I! cloudwatch: get unique roll up list [] 2020-05-27T14:11:31Z I! Starting AmazonCloudWatchAgent 2020-05-27T14:11:31Z I! Tags enabled: host=[your host] 2020-05-27T14:11:31Z I! Agent Config: Interval:1m0s, Quiet:false, Hostname:[your host], Flush Interval:1s 2020-05-27T14:11:31Z I! cloudwatch: publish with ForceFlushInterval: 1m0s, Publish Jitter: 23s 2020-05-27T14:11:31Z I! Started the statsd service on :8125 2020-05-27T14:11:31Z I! Statsd listener listening on: [::]:8125

...all's gone well, as long as you have attached a IAM role to your instance to give it permissions to report to cloudwatch.

See this: CloudWatch permissions

Then you can find all your new defined metrics at CWAgent Parameters section in Cloudwatch, so that you can create an alarm


  1. Download and install the latest EC2Config to your windows instance (https://aws.amazon.com/developertools/5562082477397515)
  2. Edit the settings file here C:\Program Files\Amazon\Ec2ConfigService\Settings\AWS.EC2.Windows.CloudWatch.json

Insert some counters in the appropriate place

    {    
        "Id": "PerformanceCounterMemory",
        "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": {
            "CategoryName": "Memory",
            "CounterName": "Available MBytes",
            "InstanceName": "",
            "MetricName": "Available-Memory",
            "Unit": "Gigabytes",
            "DimensionName": "InstanceId",
            "DimensionValue": "{instance_id}"
        }
    },
    {
        "Id": "PerformanceCounterDisk",
        "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
        "Parameters": {
            "CategoryName": "LogicalDisk",
            "CounterName": "% Free Space",
            "InstanceName": "C:",
            "MetricName": "FreeDiskPct",
            "Unit": "Percent",
            "DimensionName": "InstanceId",
            "DimensionValue": "{instance_id}"
        }
    }

Make sure to include them in the flow section:

"Flows": {
            "Flows": 
            [
                "(ApplicationEventLog,SystemEventLog),CloudWatchLogs",
                "(PerformanceCounterMemory,PerformanceCounterDisk),CloudWatch"
            ]
        }

Remember to set the key and secret of a user with cloudwatch policy rights.

  1. Restart the EC2Config service. Follow progress in the log: C:\Program Files\Amazon\Ec2ConfigService\Logs\Ec2ConfigLog.txt
  2. Create an alarm in cloudwatch on your new FreeDiskPct counter.

This is how to configure a Windows 2016 EC2 instance to report free disk space (or any other performance counter on your server)

  • Download a sample AWS.EC2.Windows.CloudWatch.json file. This is where I found one. https://s3.amazonaws.com/ec2-downloads-windows/CloudWatchConfig/AWS.EC2.Windows.CloudWatch.json

  • Copy the sample AWS.EC2.Windows.CloudWatch.json file on your Windows Server 2016 EC2 Instance here C:\Program Files\Amazon\SSM\Plugins\awsCloudWatch\

  • Edit AWS.EC2.Windows.CloudWatch.json and set IsEnabled true

  • Add additional metrics as required. There is a sample one in the config for memory usage. Copy/paste this and alter the Metric name like this:

{
    "Id": "PerformanceCounterDisk",
    "FullName": "AWS.EC2.Windows.CloudWatch.PerformanceCounterComponent.PerformanceCounterInputComponent,AWS.EC2.Windows.CloudWatch",
    "Parameters": {
        "CategoryName": "LogicalDisk",
        "CounterName": "% Free Space",
        "InstanceName": "C:",
        "MetricName": "FreeDiskPercentage",
        "Unit": "Percent",
        "DimensionName": "InstanceId",
        "DimensionValue": "{instance_id}"
    }
}
  • Run Powershell as administrator and run Restart-Service AmazonSSMAgent

  • New CloudWatch metrics appear almost instantly in AWS CloudWatch.

  • Configure AWS CloudWatch alarms as required.

Additionally, I made a short video with some tips on setting this up on Windows Server 2016.

https://www.youtube.com/watch?v=xKVrJJyG-4I

The following guide from AWS contains a step by step guide. http://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/send_logs_to_cwl_instances.html#send_logs_cwl_configfile