亚马逊AWS官方博客

使用Cloudwatch Agent在Cloudwatch中收集、展现EC2的内存及系统、应用日志

背景介绍:

默认情况下,AWS的监控服务Cloudwatch并没有对EC2内的内存总量和使用情况进行监控,因为内存属于用户操作系统内的信息,在AWS的产品设计中,所有系统内的信息都属于用户的私有财产和信息。所以默认情况下,AWS的Cloudwatch不收集相关信息。

但在实际使用的项目中,以内存监控为代表的系统、应用层面的监控是系统监控中的非常重要的一环,所以AWS提供了Cloudwatch Agent来帮助用户将EC2实例中的系统层面的信息,如:内存及其他相关信息通过Cloudwatch展现出来,这些信息的访问权仍然属于用户自己。

事实上,Cloudwatch Agent不仅仅能够收集内存信息,还能在更多系统层面收集信息,比如: CPU Active/Idle time,Disk IO Time,Network的包转发数等等,相比EC2的默认Cloudwatch,它可以提供更为详细和多样性的监控。

同时通过Cloudwatch Agent还可以对系统中的各种日志进行统一的收集并存放至Cloudwatch Logs中,方便用户后续的分析等操作,这些收集的信息的访问权仍然属于用户自己。

https://docs.aws.amazon.com/zh_cn/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html

目前Cloudwatch Agent支持以下操作系统:

  • Amazon Linux版本03.02 或更高版本
  • Amazon Linux 2
  • Ubuntu Server 版本04 和 14.04
  • CentOS 版本0 和 6.5
  • Red Hat Enterprise Linux (RHEL) 版本5、7.4、7.0 和 6.5
  • Debian 8.0
  • SUSE Linux Enterprise Server (SLES) 12 或更高版本
  • 64 位版本的 Windows Server 2016、Windows Server 2012 和 Windows Server 2008

 

本文档将介绍如何在EC2上安装、配置、分发Cloudwatch Agent并通过Cloudwatch和Cloudwatch Logs展现相关的信息和日志。

 

本文档将主要使用到AWS Cloudwatch和System Manager服务(简称SSM)。

准备工作:

1.在IAM中创建2个Role,分别用户创建Cloudwatch Agent策略和使用Cloudwatch Agent策略

 

  • CloudWatch Agent Admin Policy:用于创建Cloudwatch Agent模版并保存至System Manager中。

 

对于 Choose the service that will use this role,选择 EC2 Allows EC2 instances to call AWS services on your behalf。选择 Next: Permissions (下一步: 权限)。

配置角色名称:CloudWatch Agent Admin Policy

创建完成之后,再添加策略CloudWatch Agent Admin Policy到角色中。

#请注意创建的SSM的 参数存储名将会以AmazonCloudwatch- 开头,如果需要用自定义前缀名称,请修改对应策略。

 

参考上述步骤,创建另外一个Role专门用于使用此策略的Role。差别仅为Cloudwatch策略改为:CloudWatchAgentServerPolicy

 

2.安装、配置Cloudwatch Agent及其策略

启动一台主机,本例中使用Amazon Linux,启动时关联角色CloudWatchAgentAdminPolicy

并在用户数据中对amazon-ssm-agent进行更新。

#!/bin/bash

yum update -y amazon-ssm-agent

yum -y install collectd

###Collectd如果不安装可能会遇到Cloudwatch agent启动失败的问题。

为了方便管理,配置了标签。

 

在EC2启动后,我们可以在服务AWS System Manager的托管实例中,可以看到此EC2实例已经被关联。

接下来我们安装Cloudwatch Agent。

 

选择 运行命令,选择AWS-ConfigureAWSPackage,

 

在名称 中输入 AmazonCloudWatchAgent,然后点击运行

系统会很快完成运行,并给予输出结果。

 

可以看到当前的Cloudwatch Agent版本为1.2.0.6336。

配置Cloudwatch Agent 作为样例:

登陆对应的EC2,开始配置需要通过Cloudwatch进行监控的指标。

 

运行如下命令:

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard

第一部分选择默认即可:

第二部分,根据实际情况收集:
请注意Do you want to monitor any host metrics? E.g CPU, Memory,请选择Yes。
本例中,metric config选择的Standard

 

所有这些配置后续都保存在本地,并可以进行编辑,所以建议选择Yes。
在Cloudwatch Agent之前,AWS通过Cloudwatch Logs Agent来收集相关信息,如果系统中有使用过Cloudwatch Logs Agent可以导入相关配置。
#Cloudwatch Logs Agent已经被Cloudwatch Agent替代。

 

接下来就是对日志的收集,本例中我就收集了/var/log/messages,如果需要可以增加更多日志,并指定到对应的Cloudwatch Logs Group中。
#所有系统、应用日志都可以使用相同方式进行配置。

 

至此配置就完成了,配置文件以json格式存放在本地,并可以进行编辑。
/opt/aws/amazon-cloudwatch-agent/bin/config.json

 

同时可以把所有的配置文件保存到SSM的 参数存储 中,这样其他EC2只要拥有权限就可以进行获取,而无需再进行配置。

 

回到SSM的控制台,可以看到刚才创建的 参数存储 已经存在。

 

运行命令,来启动Cloudwatch Agent服务。

sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:AmazonCloudWatch-linuxsample -s

#请记住这个名字AmazonCloudWatch-linuxsample,后续需要使用

可以看到Cloudwatch Agent已经正常工作。
同时使用此命令后,主机重启此服务会自动启动保持工作状态。

等待几分钟,在Cloudwatch的Metric中,我们就可以看到此EC2实例的相关监控信息。比如:内存
#Cloudwatch会增加一个新的分类:CWAgent

 

在Cloudwatch Logs Group中就可以看到此EC2实例的/var/logs/messages的信息

 

在其他EC2上配置Cloudwatch Agent来收集信息:

后续如果要使用Cloudwatch Agent及相同配置,则只需要在对应的EC2实例中安装Cloudwatch Agent并对应 参数存储 中的函数进行调用即可。

本例中,通过部署一个AutoScaling Group来让所有的机器都使用前序配置的的Cloudwatch Agent的配置。
选择的AMI是标准的Amazon Linux,IAM角色选择前序创建的CloudWatchAgentServerPolicy。

 

在用户数据中,配置如下信息:

#!/bin/bash

yum update -y amazon-ssm-agent

yum -y install collectd

wget https://s3.cn-north-1.amazonaws.com.cn/amazoncloudwatch-agent/amazon_linux/amd64/latest/amazon-cloudwatch-agent.rpm

rpm -U ./amazon-cloudwatch-agent.rpm

/opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c ssm:AmazonCloudWatch-linuxsample -s

#本例中使用了前序配置的SSM参数存储 中的配置信息,本例为:AmazonCloudWatch-linuxsample

 

当启动完成之后,

在Cloudwatch Logs Group中,新创建的EC2实例的相关信息自动更新到其中。

在Cloudwatch的Metric的CWAgent分类中,会拥有更多的子分类。

 

对于AutoScaling Group则会把相关信息归类到其子分类中。

 

3.变更、修改Cloudwatch Agent的配置信息

对于Cloudwatch的配置文件因为存放在2个地方本地json和 SSM参数存储中,同样有2种修改方式:

1) 对于单台机器,可以直接修改本地的json文件

修改方式可以直接再运行一次wizard,或者直接修改对应的json文件。

#修改了的文件就和前序的 参数存储 将无关。

 

2)第二种方式是修改之前生成的 参数存储 中的函数

这样所有读取此函数的实例只要再运行重新读取一次此函数就会获得最新的配置信息。这种也是我们推荐的方式,因为所有调用这个函数EC2主机都会更新相应的配置。

 

同时在对于每次修改都会记录有版本记录,

 

本例中,我增加了下面两个配置:
/var/log/secure
和metric 中的mem_used

来作为样例。

可以看到在Cloudwatch 日志组中输出了对应日志。

CWAgent的在Cloudwatch中也输出了对应的mem_used指标。

 

根据需要可以把所有这些监控的指标保存到Cloudwatch控制面板中, 这样方便后续的持续跟踪。

 

参考文档:

https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html

https://docs.amazonaws.cn/AmazonCloudWatch/latest/monitoring/metrics-collected-by-CloudWatch-agent.html

https://docs.amazonaws.cn/systems-manager/latest/userguide/sysman-install-ssm-agent.html

 

本篇作者

钱凯

AWS解决方案架构师,负责基于 AWS 的云计算方案的咨询与架构设计.在加入AWS之前曾在HP、Citrix服务多年,熟悉传统虚拟化、虚拟桌面、微软Windows等产品。