借助Userdata为EC2 Windows上部署Cloudwatch Agent并配置基础监控

本文更新于2023年9月,中国区测试通过

一、背景

为了实现Windows的内存监控、文件系统使用率监控等,需要部署CloudWatch Agent。

在创建EC2时候,这个工作可以通过Userdata脚本自动部署。如果EC2 Windows创建时候没有使用Userdata,那么也可以通过Powershell执行命令完成自动安装。

此外,为了方便安装软件,本文的脚本也将部署choco包管理工具。

二、准备工作

1、为CloudWatch生成具有上传监控数据的IAM Role角色

进入IAM,点击左侧角色,点击右侧新建角色。如下截图。

在界面上选择AWS Service,从下方选择使用本角色的服务是EC2,点击下一步继续。如下截图。

从策略界面中,搜索如下两个策略:

  • AmazonSSMManagedInstanceCore
  • CloudWatchAgentAdminPolicy

注意:每次只能搜索一条。因此搜索一条,选中一条;然后继续搜索另外一条。另外很多策略名字很相似,只有几个字母的差别,请务必仔细选择正确的策略。策略一个字母的差别就无法正常工作。如下截图。

选中后点击下一步,设置IAM Role的名字,例如ec2-ssm-login等名字,并保存下来用于下一步配置。

2、预设CloudWatch Agent的配置文件

构建CloudWatch Agent for Windows所需要的配置文件,如下例子是最小化的监控参数,只采集内存使用率和文件系统使用率。如果您需要监控更多Windows OS操作系统级别的参数,那么请参考本文末尾的CloudWatch文档链接中的配置说明。

{
        "metrics": {
                "append_dimensions": {
                        "AutoScalingGroupName": "${aws:AutoScalingGroupName}",
                        "ImageId": "${aws:ImageId}",
                        "InstanceId": "${aws:InstanceId}",
                        "InstanceType": "${aws:InstanceType}"
                },
                "metrics_collected": {
                        "LogicalDisk": {
                                "measurement": [
                                        "% Free Space"
                                ],
                                "metrics_collection_interval": 60,
                                "resources": [
                                        "*"
                                ]
                        },
                        "Memory": {
                                "measurement": [
                                        "% Committed Bytes In Use"
                                ],
                                "metrics_collection_interval": 60
                        }
                }
        }
}

本文已经将这个文件放到了可以在AWS中国区和AWS海外区域部署的CDN下载点上,并且加入了Userdata脚本,按照下文即可自动安装。

三、新创建EC2时候通过Userdata脚本自动安装

本章节讲述新创建一台EC2时候通过Userdata脚本自动部署CloudWatch。如果您是为现有EC2配置CloudWatch Agent,那么请跳过本章节。

1、创建EC2时使用IAM Role

在2023年新版的创建EC2界面中,点击创建页面最下方的Advance高级选项按钮,展开菜单。如下截图。

在选择IAM Instance Profile的位置,选择上一步创建的IAM角色的名字。如下截图中选择的名称部分请替换为您前一步自己指定的名字。如下截图。

不要急于创建EC2,继续向下滚动页面。

2、打开启用增强监控的选项

在高级设置部分,继续向下滚动页面,找到Detailed CloudWatch monitoring增强监控的位置,将其选为启用。如下截图。

不要急于创建EC2,继续向下滚动页面。

3、填写Userdata脚本

向下滚动到页面最下方,然后输入如下脚本。如下截图。

在AWS中国区部署CloudWatch Agent时候从中国区S3下载Agent的脚本内容如下:

<powershell>
# Cloudwatch Agent download from China 
# 以下为中国区域下载例子,海外区域请替换下载地址
Invoke-WebRequest https://s3.cn-north-1.amazonaws.com.cn/amazoncloudwatch-agent/windows/amd64/latest/amazon-cloudwatch-agent.msi -O C:\Users\Administrator\Downloads\amazon-cloudwatch-agent.msi

# Installation
Start-Process C:\Users\Administrator\Downloads\amazon-cloudwatch-agent.msi
rm -Force C:\Users\Administrator\Downloads\amazon-cloudwatch-agent.msi

# Download configuration file for Windows
Invoke-WebRequest https://blogimg.bitipcman.com/workshop/cloudwatch/cloudwatch-windows-config.json -O 'C:\Program Files\Amazon\AmazonCloudWatchAgent\config.json'

# Start service
# Please keep & in the front of below command
# 如下命令前边的&符号不要去掉,否则无法执行
& "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"

# Choco package management
Set-ExecutionPolicy Bypass -Scope Process -Force; iex ((New-Object System.Net.WebClient).DownloadString('https://chocolatey.org/install.ps1'))
choco install grep -y

# Finally, Restart EC2
# 以上配置不需要重启即可生效,如果改动了本脚本还安装了别的软件可按需重启
# Restart-Computer -Force
</powershell>

如果是海外区域部署,请替换把第一段的下载地址从中国区的:

https://s3.cn-north-1.amazonaws.com.cn/amazoncloudwatch-agent/windows/amd64/latest/amazon-cloudwatch-agent.msi

替换为海外区域的:

https://amazoncloudwatch-agent.s3.amazonaws.com/windows/amd64/latest/amazon-cloudwatch-agent.msi

这样即可在快速完成下载,不会遇到网络问题导致下载失败。

最后按创建按钮,完成EC2创建。

四、现有EC2的配置

本章节讲述为已经存在的现有EC2配置CloudWatch Agent。如果您是新创建一台EC2、且已经按照上一章节的流程配置好了Userdata,那么本章节请跳过。

1、为EC2额外配置CloudWatch Agent上传监控数据需要的IAM Role

如果您的EC2以前绑定过别的IAM Role,那么可以找到现有Role后,向其中添加一条名为CloudWatchAgentAdminPolicy的IAM Policy即可生效。如果您的EC2之前没有绑定任何IAM Role,那么请按照本流程做配置。

找到现有EC2选中之,点击更多操作,从下拉框中找到安全,选择Modify IAM Role。如下截图。

在选择IAM Role的位置,选择前文创建的IAM Role。然后点击保存生效。如下截图。

如果EC2之前没有绑定过IAM Role,可能需要30分钟才能完全生效。如果您不想等待30分钟,可重启EC2即可立刻生效。如果是生产环境不能重启,那么什么都不用做,只需要等待5~30分钟后IAM Role完全生效。(下文有方法验证是否生效)

2、打开EC2增强监控

选中EC2,选择更多操作,从下拉框中找到增强监控,并启用之。如下截图。

3、通过Powershell执行命令安装CloudWatch Agent

点击开始菜单,对其中的Powershell点击鼠标右键,选择使用管理员权限打开Powershell。如下截图。

打开Powershell后,执行上文Userdata的Powershell脚本即可。执行时候请注意不需要输入Userdata开头和结尾的<powershell>及</powershell>标识。这两个标签只是在Userdata使用,在Windows的Powershell下直接执行脚本即可。

至此Agent安装完成。

五、验证EC2 Instance Profile绑定的IAM Role生效

为了验证EC2 Instance Profile绑定的IAM Role生效,也就意味着EC2有权限上传监控数据到CloudWatch了,这里使用Session Manager登陆EC2来进行测试。

进入EC2界面,选中要登陆的Windows EC2,点击页面上方的“连接”按钮。如下截图。

在页面上方连接方式的位置,选择Session Manager,点击连接。即可打开Powershell控制台。如下截图。

登录成功的话,就表示EC2 Instance Profile绑定的IAM Role生效。如下截图。

六、检查CloudWatch数据

当新EC2启动完成大约5~10分钟后,访问Cloudwatch,检查。监控数据是否正常发布。如果是先有EC2修改配置,那么根据IAM Role生效时间,可能需要更长(例如30分钟)完全生效。

进入CloudWatch服务,首先选择正确的区域,因为CloudWatch是区域型的服务。然后点击All metrics所有指标查看监控数据,再找到Custome namespaces自定义命名空间,从中可以看到名为CWAgent的目录,点击进入。如下截图。

即可看到Cloudwatch Windows Agent返回的内存使用情况数据。

由于Agent刚配置好,监控数据看起来曲线还不连续,等待一段时间,即可观察到连续的曲线。

至此配置完成。

七、参考资料

CloudWatch Agent下载(中国区域):

https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html#download-CloudWatch-Agent-on-EC2-Instance-commandline-first

CloudWatch Agent下载(海外区域):

https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html

Cloudwatch Agent安装说明:

https://docs.amazonaws.cn/en_us/AmazonCloudWatch/latest/monitoring/install-CloudWatch-Agent-on-EC2-Instance-fleet.html

更多CloudWatch参数的配置说明:

https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html