CloudWatch可以实时监控AWS资源和应用,收集和跟踪指标,可根据定义的指标阈值发送通知或更改资源配置,可基于 AWS 环境中发生的事件执行目标操作。

CloudWatch

CloudWatch指标

CloudWatch现提供如下类别的指标:

  • Application ELB
  • EBS
  • EC2
  • ELB
  • 事件
  • Lambda
  • 日志
  • NAT Gateway
  • Network ELB
  • RDS
  • S3
  • SNS
  • SQS

CloudWatch警报

CloudWatch警报可根据定义的规则发送通知或者对所监控的资源自动进行更改,警报可以包含一个或多个指标图表。比如,监控EC2指标,当超过设定的阈值时,可以发送通知、执行AutoScaling 操作、启停EC2等。

CloudWatch事件

CloudWatch事件提供近乎实时的系统事件流来描述AWS资源的变化。通过设置简单的规则,匹配的事件将路由到一个或多个目标函数或流。

事件源
CloudWatch支持两种类型的事件源:事件模式和计划

事件模式支持的服务:

  • API Gateway
  • AWS 控制台
  • Auto Scaling
  • CloudFormation
  • CloudTrail
  • CloudWatch Events
  • CloudWatch Logs
  • CodeBuild
  • CodeDeploy
  • Config
  • Direct Connect
  • DynamoDB
  • EC2
  • ECS
  • SSM
  • EMR
  • ElastiCache
  • Elastic Beanstalk
  • Elastic Load Balancing
  • Elastic MapReduce
  • Glacier
  • IAM
  • Kinesis
  • Lambda
  • Monitoring
  • Redshift
  • RDS
  • STS
  • SNS
  • SQS
  • S3
  • SWF
  • Storage Gateway
  • Support
  • Tags

计划使用cron或rate表达式在某些时间自行触发自动化操作。

Cron表达式有六个必填字段,分别为分钟、小时、日期、月、星期、年,之间以空格分隔。

字段 通配符
分钟 0-59 , - * /
小时 0-23 , - * /
日期 1-31 , - * ? / L W
1-12 或 JAN-DEC , - * /
星期 1-7 或 SUN-SAT , - * ? L #
1970-2199 , - * /

例如:

cron(0 12 * * ? *)
cron(15 10 ? * 6L 2002-2005)

Rate 表达式有两个必需字段:值和单位,值必须为正数,单位可选值minute | minutes | hour | hours | day | days。
例如:

rate(1 hour)
rate(5 minutes)

事件目标
支持的目标:

  • CodeBuild Project
  • ECS任务
  • Kinesis流
  • Lambda函数
  • SNS主题
  • SQS队列
  • 另一AWS账户中的事件总线

CloudWatch CLI

list-metrics

$ aws cloudwatch list-metrics --namespace "AWS/EC2"

get-metric-statistics

$ aws cloudwatch get-metric-statistics --metric-name CPUUtilization --start-time 2014-04-08T23:18:00 --end-time 2014-04-09T23:18:00 --period 3600 --namespace AWS/EC2 --statistics Maximum --dimensions Name=InstanceId,Value=i-abcdef

put-metric-data
自定义CloudWatch指标。CloudWatch将数据与指定的指标相关联,如果指标不存在,CloudWatch将创建指标。当创建指标时,可能需要十五分钟才能在list-metrics中显示。

示例:

$ aws cloudwatch put-metric-data --namespace "Usage Metrics" --metric-data file://metric.json

metric.json

[
  {
    "MetricName": "New Posts",
    "Timestamp": "Wednesday, June 12, 2013 8:28:20 PM",
    "Value": 0.50,
    "Unit": "Count"
  }
]

自定义监控Instance 80端口访问情况
首先编写一个简单的shell script(port.sh):

#!/bin/sh

instanceid='curl -s http://169.254.169.254/latest/meta-data/instance-id'
count='sudo netstat -np | grep -w 80 | grep ESTABLISHED | wc -l'
aws cloudwatch put-metric-data --metric-name RequestCount --namespace Application --dimensions "InstanceID=$instanceid" --value "$count" --unit None

说明: curl -s http://169.254.169.254/latest/meta-data/instance-id, 这是通过instance metadata查询instancd id的一种方法。这样脚本比较通用,不用在脚本中指定instance id。

然后编辑调度任务

$ crontab -e

输入以下内容:

* * * * * /home/ec2-user/port.sh

这样即可监控80端口每分钟的访问次数了,在Cloud Watch Console的Custom Metrics中可查看。

CloudWatch日志

可以使用 CloudWatch日志监控、存储和访问EC2、CloudTrail和其他来源的日志文件,可以从 CloudWatch日志中检索关联的日志数据。

安装CloudWatch Logs Agent

为监控EC2日志文件,需要AWS账号,在EC2上安装AWS CLI、CloudWatch Logs Agent。CloudWatch Logs Agent自动发送日志数据到CloudWatch Logs。

$ sudo yum update -y
$ curl https://s3.amazonaws.com/aws-cloudwatch/downloads/latest/awslogs-agent-setup.py -O
$ sudo python ./awslogs-agent-setup.py --region cn-north-1

安装过程中需要配置:
账户信息:AWS access key ID、AWS secret access key、Default region name、Default output format
监控的文件信息:Path of log file to upload、Destination Log Group name、Destination Log Stream name、Timestamp format、Initial position

可以监控多个文件,否则在提示“是否配置另一个文件”时,输入N。

配置文件保存在~/.aws, /var/awslogs/etc目录下。

配置成功后,稍候,可以在CloudWatch控制台中查看日志。

/var/awslogs/etc/awslogs.conf文件保存了监控log的配置。

启动/停止awslogs service

$ sudo service awslogs start/stop

CloudWatch Logs CLI

create-log-group
创建日志组,组名在AWS 账户region内必须唯一,每个账户最多能创建500个日志组。

$ aws logs create-log-group --log-group-name my-logs

在logs agent中配置的log group,如不存在会自动创建。

create-log-stream
Creates a new log stream in the specified log group. The name of the log stream must be unique within the log group. There is no limit on the number of log streams that can exist in a log group.

$ aws logs create-log-stream --log-group-name my-logs --log-stream-name 20161010

put-log-events
Uploads a batch of log events to the specified log stream.

Every put-log-events request must include the sequenceToken obtained from the response of the previous request. An upload in a newly created log stream does not require a sequenceToken . You can also get the sequenceToken using describe-log-streams .

$ aws logs put-log-events --log-group-name my-logs --log-stream-name 20161010 --log-events file://events

file events:

[
  {
    "timestamp": 1476084773350,
    "message": "Example Event 1"
  },
  {
    "timestamp": 1476084773358,
    "message": "Example Event 2"
  },
  {
    "timestamp": 1476084773360,
    "message": "Example Event 3"
  }
]

注意:时间必须在14天内,否则不能导入。

describe-log-streams

$ aws logs describe-log-streams --log-group-name my-logs

delete-log-group
Deletes the log group with the specified name and permanently deletes all the archived log events associated with it.

$ aws logs delete-log-group --log-group-name my-logs

delete-log-stream
Deletes a log stream and permanently deletes all the archived log events associated with it.

$ aws logs delete-log-stream --log-group-name my-logs --log-stream-name 20161010

参考文档

AWS CloudWatch Developer Guide
Amazon CloudWatch Logs
CloudWatch Logs Agent Reference
Monitoring Amazon EC2
Instance Metadata and User Data
Install and Configure CloudWatch Logs on an Existing EC2 Instance