Amazon 的 CloudWatch 为 EC2 提供了一系列的指标的跟踪和收集,方便用户去了解 EC2 的使用情况,但部分涉及用户数据的性能指标是无法直接通过**CloudWacth** 来获取,如硬盘的使用情况,内存占用等。为了能获取这些指标,需要用户自行在 EC2 上安装 **CloudWacth Agent** 来获取 EC2 上的资源使用情况,并通过 **CloudWacth Agent** 将数据发送到 CloudWatch。
本教程主要有三个部分:
1. 对于单台或者少量 EC2,可以 ssh 登录到 EC2 中手动运行脚本实现设置
2. 对于还未启动的实例,通过 userdata 的方式在 EC2 创建时的启动脚本,以便开机自动实现此功能。
3. 对于多台 EC2 ,可以利用 System Manager 做批量设置。
您可以根据自己的需求选择对应的安装方法。
**注:本次实验区域是在 us-east-1,使用的实例 AMI 是 Amazon Linux 2,可以根据自己的区域和实例 AMI 对文档中的一些操作自行做一些调整。本教程中使用的由 Amazon 提供的默认监控指标(如硬盘使用,内存,网络接口,硬盘读写和读写时间等),如果有其他指标的话可以通过修改配置文件的方法,或者启动配置向导的方法来自行添加监控指标。linux 下的可监控指标参考:**[Linux下的可监控指标](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html#linux-metrics-enabled-by-CloudWatch-agent?trk=cndc-detail)。
1. 对于单台或者少量 EC2,可以 ssh 登录到 EC2 中手动运行脚本实现设置
通过脚本的方式来安装 CloudWatch Agent 到实例
1.1 选择 IAM 服务,并创建 Role

如上图所示:在进入 IAM 控制台后选择1处的角色,然后选择箭头2处的创建角色。

如上图所示:选择箭头1处的 Amazon **产品**,选择2处的 **EC2**,然后点击箭头3处的 **下一步:权限**然后开始附加权限
在这一步我们需要给创建的 Role 附加下面的策略:

在附加这个策略后,然后我们点击**下一步:标签**,点击**下一步:审核**,在最后一步我们给角色命名为 **CloudWatchAgentServerRole** 然后点击创建角色以创建角色。
我们先给需要做监测的 EC2 上附加我们在前面创建的 Role

上图所示,进入到下面的界面

如上图所示,在 EC2 控制台给 EC2 附加在创建的角色 **CloudWatchAgentServerRole**
1.2 登陆 EC2 并运行 shell 脚本来启动 CloudWatch Agent
在通过1.1的步骤创建并附加 Role 后,我们连接上 EC2([连接EC2教程](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/EC2\_GetStarted.html#ec2-connect-to-instance-linux?trk=cndc-detail))后,将**文档附录**的**默认shell脚本**复制进命令行运行。
在运行成功后,我们可以下面的指令检查 CloudWatch Agent 的运行状态:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status 当出现下面的状态后就表示 CloudWatch Agent 成功运行:



如上图箭头处所示,点击 **MyCustomNamespace_demo(这个名称可以在附录的脚本中的 namespace 处定义,脚本默认的命名空间是MyCustomNamespace)** 即可查看我们通过 shell 脚本定义的默认监控指标:
点击下面箭头处即可查看**硬盘监控和内存监控**,其他指标如**网络接口监控**,**硬盘写入读取,硬盘读取写入时间,cpu 使用情况**等也可以点击相应的指标进行查看。



如果想做一些自定义的指标监控,可以[修改配置文件的方式来修改监控指标](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html?trk=cndc-detail),配置文件默认的位置是:
/opt/aws/amazon-cloudwatch-agent/bin/config.json 修改好配置文件后,可以用下面的指令来重启动 CloudWacth Agent:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json也可以[通过配置文件向导 amazon-cloudwatch-agent-config-wizard的方式来自定义监控指标](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html?trk=cndc-detail)。
2. **对于还未启动的实例,通过 userdata 的方式在 EC2 创建时的启动脚本,以便开机自动实现此功能**
**通过 userdata 启动带 CloudWatch Agent 的实例****
2.1 选择IAM服务,并创建 Role
参考步骤 1.1 创建 Role 部分
2.2 启动实例并添加 userdata
启动 ec2 实例的教程可以参考文档:[启动实例](https://docs.aws.amazon.com/zh_cn/AWSEC2/latest/UserGuide/LaunchingAndUsingInstances.html?trk=cndc-detail)
如下图所示,选择需要的 EC2 实例,在本教程使用的是 Amazon Linux 2实例。在配置实例给实例附加在第一步中创建的 IAM 角色。

在高级详细信息设置用户数据,点击**以文本形式**的复选框,然后将**文档附录**中的 shell 脚本复制到箭头处的白板中,在本文档使用的 CloudWatch Agent 的配置是由官方提供的默认配置,如果有需求的话可以对文档中的配置部分做进一步的修改。

然后点击审核和启动(本教程主要是在 EC2 上用脚本的形式安装 CloudWatch Agent,使用的是默认由 Amazon 提供的[默认配置](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html#CloudWatch-Agent-Configuration-File-Complete-Example?trk=cndc-detail),忽略了其他配置步骤,用户可以根据自己的需求酌情选择)
之后我们等待实例启动,等机器在**2/2安全检查**结束后,可以登陆上实例,用下面的指令检查 CloudWatch Agent 的运行状态:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status当出现下面的状态后就表示 CloudWatch Agent 成功运行:

2.3 查看定义的内存,硬盘等的指标
参考步骤 1.3
3. 对于多台 EC2 ,可以利用 System Manager 做批量设置
通过SSM批量安装 CloudWatch Agent 到实例
3.1 选择 IAM 服务,并创建 Role(与1.1不同,这一步需要额外添加一个策略)


如上图所示:在进入 IAM 控制台后选择1处的角色,然后选择箭头2处的创建角色。

上图所示:选择箭头1处的 **Amazon 产品**,选择2处的 **EC2**,然后点击箭头3处的 **下一步:权限**然后开始附加权限
在这一步我们需要给创建的 Role 附加两个策略:


在附加这两个策略后,然后我们点击**下一步:标签**,点击**下一步:审核**,在最后一步我们给角色命名为 **CloudWatchAgentServerRole** 然后点击创建角色以创建角色。
我们先给需要做监测的 EC2 上附加我们在前面创建的 Role

上图所示,进入到下面的界面

如上图所示,在 EC2 控制台给 EC2 附加在创建的角色CloudWatchAgentServerRole
3.2 通过 System Manager 去配置实例,启动指标监控
先进入到 System Manger 的控制台,如下所示:

然后点击**运行命令**进入到**运行命令**界面:

在运行命令界面下,命令文档部分选择 **Amazon-RunShellScript**,如下:

在**命令参数**部分,将文档附录的 shell 脚本复制上去:

在**目标**部分我们选择自己需要开启额外指标监控的实例(**可以在 Instances 处批量选择实例**):

点击底下的 **运行** 即可,出现下面的界面时即代表配置完成

3.3 查看定义的内存,硬盘等的指标
参考步骤 1.3
附录:使用 system manager 批量设置的 shell 脚本
**注意:在这个 shell 脚本中,所使用的 CloudWacth Agent 的架构是AMD64,适用于Amazon Linux 和 Amazon Linux 2。可以根据自己的 AMI 类型更改下载超链**,[根据实际情况选择下载超链](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/download-cloudwatch-agent-commandline.html?trk=cndc-detail)。
```
\#!/bin/bash
sudo yum update -y
\#可以根据自己的AMI 类型修改此处的donwloadlink链接来获取合适的cloudwatch版本
downloadlink="https\://s3.amazonaws.com/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm"
sudo wget $downloadlink
sudo rpm -U ./amazon-cloudwatch-agent.rpm
sudo -s
sudo cat >/opt/aws/amazon-cloudwatch-agent/bin/config.json<<'EOF'
{
"agent": {
"metrics_collection_interval": 10,
"logfile": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log"
},
"metrics": {
"namespace": "MyCustomNamespace",
"metrics_collected": {
"cpu": {
"resources": \[
"\*"
],
"measurement": \[
{"name": "cpu_usage_idle", "rename": "CPU_USAGE_IDLE", "unit": "Percent"},
{"name": "cpu_usage_nice", "unit": "Percent"},
"cpu_usage_guest"
],
"totalcpu": false,
"metrics_collection_interval": 10,
"append_dimensions": {
"customized_dimension_key\_1": "customized_dimension_value\_1",
"customized_dimension_key\_2": "customized_dimension_value\_2"
}
},
"disk": {
"resources": \[
"/",
"/tmp"
],
"measurement": \[
{"name": "free", "rename": "DISK_FREE", "unit": "Gigabytes"},
"total",
"used"
],
"ignore_file_system_types": \[
"sysfs", "devtmpfs"
],
"metrics_collection_interval": 60,
"append_dimensions": {
"customized_dimension_key\_3": "customized_dimension_value\_3",
"customized_dimension_key\_4": "customized_dimension_value\_4"
}
},
"diskio": {
"resources": \[
"\*"
],
"measurement": \[
"reads",
"writes",
"read_time",
"write_time",
"io_time"
],
"metrics_collection_interval": 60
},
"swap": {
"measurement": \[
"swap_used",
"swap_free",
"swap_used_percent"
]
},
"mem": {
"measurement": \[
"mem_used",
"mem_cached",
"mem_total"
],
"metrics_collection_interval": 1
},
"net": {
"resources": \[
"eth0"
],
"measurement": \[
"bytes_sent",
"bytes_recv",
"drop_in",
"drop_out"
]
},
"netstat": {
"measurement": \[
"tcp_established",
"tcp_syn_sent",
"tcp_close"
],
"metrics_collection_interval": 60
},
"processes": {
"measurement": \[
"running",
"sleeping",
"dead"
]
}
},
"append_dimensions": {
"ImageId": "${aws:ImageId}",
"InstanceId": "${aws:InstanceId}",
"InstanceType": "${aws:InstanceType}",
"AutoScalingGroupName": "${aws:AutoScalingGroupName}"
},
"aggregation_dimensions" : \[\["ImageId"], \["InstanceId", "InstanceType"], \["d1"],\[]],
"force_flush_interval" : 30
},
"logs": {
"logs_collected": {
"files": {
"collect_list": \[
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/amazon-cloudwatch-agent.log",
"log_group_name": "amazon-cloudwatch-agent.log",
"log_stream_name": "amazon-cloudwatch-agent.log",
"timezone": "UTC"
},
{
"file_path": "/opt/aws/amazon-cloudwatch-agent/logs/test.log",
"log_group_name": "test.log",
"log_stream_name": "test.log",
"timezone": "Local"
}
]
}
},
"log_stream_name": "my_log_stream_name",
"force_flush_interval" : 15
}
}
EOF
sudo mkdir -p /usr/share/collectd/
sudo touch /usr/share/collectd/types.db
```
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -s -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json 参考文档
- [手动创建或编辑 CloudWatch 代理配置文件](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html?trk=cndc-detail)
- [使用命令行安装 CloudWatch 代理](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/installing-cloudwatch-agent-commandline.html?trk=cndc-detail)
- [使用 AWS Systems Manager 安装 CloudWatch 代理](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/installing-cloudwatch-agent-ssm.html?trk=cndc-detail)
- [创建 IAM 角色和用户以用于 CloudWatch 代理](https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/create-iam-roles-for-cloudwatch-agent.html?trk=cndc-detail)