AWS CloudWatch 监控 EC2 日志:Ubuntu 实例完整配置指南
概述
Amazon CloudWatch 是 AWS 里做监控和可观测性的一站式服务,能把 EC2 实例、你的应用、还有第三方服务的日志和指标都收拢到一起。用 CloudWatch 看 EC2 日志,主要能帮你干这几件事:
- 实时查问题:不用登机器,直接在 CloudWatch 控制台翻应用日志、系统日志,出事了一眼就能定位;
- 日志集中存:机器一多,日志散在各台实例上太难管,统一扔进 CloudWatch Logs,按时间检索、筛选都方便;
- 关键字告警:比如日志里冒出 “Error” 这种关键字,就能自动触发告警(邮件、SNS 都行)。
这篇就拿 Ubuntu 系统的 EC2 实例开刀,从装 CloudWatch Agent 一直到验证日志真上报了,一步步走完整个流程,保证日志稳稳地进到 CloudWatch。
前置准备:EC2 实例 IAM 权限配置
CloudWatch Agent 得靠 IAM 权限才能跟 AWS 那些服务打交道(建日志组、传日志之类的)。优先推荐用「EC2 实例角色」来授权,别用本地的 credentials 文件手管 Access Key,前者更安全。
步骤 1:创建 IAM 策略(授予 CloudWatch 日志权限)
- 登录 AWS IAM 控制台,进入「策略」→「创建策略」;
- 切到「JSON」标签,把下面这段策略粘进去(只给了上报日志必需的最小权限,遵循「最小权限原则」,够用就好):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"logs:CreateLogGroup", // 允许创建 CloudWatch 日志组
"logs:CreateLogStream", // 允许创建日志流
"logs:PutLogEvents", // 允许上传日志事件
"logs:DescribeLogStreams" // 允许查询日志流信息
],
"Resource": "arn:aws:logs:*:*:*" // 限制日志操作范围(* 表示所有区域/账户,可按需缩小)
},
{
"Effect": "Allow",
"Action": "ec2:DescribeTags", // 可选:Agent 需获取 EC2 标签用于日志分组(推荐保留)
"Resource": "*"
}
]
}
- 点「下一步」,填个策略名(比如 CloudWatchEC2LogAccess),创建完事。
步骤 2:为 EC2 实例附加 IAM 角色
- 进 EC2 控制台,选中目标 Ubuntu 实例,点「操作」→「安全」→「修改 IAM 角色」;
- 点「选择 IAM 角色」——要是有现成合适的角色,直接把上面建的 CloudWatchEC2LogAccess 策略挂上就行;没有角色就点「创建新 IAM 角色」:
- 信任实体类型选「AWS 服务」→「EC2」,下一步;
- 搜到并勾上 CloudWatchEC2LogAccess 策略,下一步;
- 填个角色名(比如 EC2CloudWatchLogRole),把角色建好;
- 选新建的角色,点「保存」,等几秒权限就生效了。
第一步:安装 CloudWatch Agent(Ubuntu 系统)
CloudWatch Agent 是 EC2 实例跟 CloudWatch 通信的关键组件,负责收日志、收指标再上报。Ubuntu 用 deb 包装,步骤如下:
1. 下载 CloudWatch Agent 安装包
从 AWS 官方 S3 地址下对应系统架构的安装包(Ubuntu 一般是 amd64 架构):
# 下载最新版 CloudWatch Agent(Ubuntu amd64)
wget https://s3.amazonaws.com/amazoncloudwatch-agent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
# 验证安装包完整性(可选,避免下载损坏)
ls -lh amazon-cloudwatch-agent.deb
# 正常输出示例:-rw-r--r-- 1 ubuntu ubuntu 200M Aug 12 10:00 amazon-cloudwatch-agent.deb
2. 安装 Agent 包
用 dpkg 装,要是缺依赖,让 apt -f install 自动补上:
# 安装 Agent
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
# 若出现依赖错误(如提示 "unmet dependencies"),执行以下命令修复
sudo apt update && sudo apt -f install -y
第二步:安装 collectd(可选,用于系统指标收集)
collectd 是个开源的系统监控工具,CloudWatch Agent 能借它收更丰富的系统指标(CPU 使用率、内存占用、磁盘 I/O 这些)。只盯着日志监控的话这步可以跳过;要顺带监控系统指标,那就得装。
# 更新 apt 源并安装 collectd
sudo apt update && sudo apt install -y collectd
第三步:配置 CloudWatch Agent(核心:指定监控日志)
用 CloudWatch 自带的交互式配置向导生成配置文件,这个文件说白了就是规定「要盯哪些日志路径」「日志上报到 CloudWatch 的哪个日志组」这些核心规则。
1. 启动配置向导
跑下面这条命令启动向导(路径是固定的 /opt/aws/amazon-cloudwatch-agent/bin/):
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
2. 按向导提示逐步配置
向导会一路问问题来生成配置,下面是几个关键步骤怎么选(按你实际情况来):
| 向导问题 | 推荐选择 | 说明 |
|---|---|---|
| 1. Are you using EC2 or On-Premises hosts? | 1 (EC2) | 目标是 EC2 实例,选择 1 |
| 2. Which user are you planning to run the agent? | root | 用 root 权限确保能读取所有日志文件(如 /var/log/ 下的系统日志) |
| 3. Do you want to turn on StatsD daemon? | n | 仅日志监控无需开启 StatsD,若需指标聚合可选 y |
| 4. Do you want to monitor metrics from Collectd? | y/n | 若已安装 collectd 并需监控系统指标选 y,仅日志监控选 n |
| 5. Do you want to monitor any log files? | y | 核心:开启日志监控 |
| 6. Log file path | 例如 /var/log/syslog | 输入要监控的日志路径(Ubuntu 系统日志默认路径,可追加其他路径如 /var/log/nginx/access.log) |
| 7. Log group name | 例如 EC2-Ubuntu-Syslog | CloudWatch 中存储该日志的「日志组名称」(建议包含实例标识,如 EC2-i-123456-Syslog) |
| 8. Log stream name | 例如 {instance_id} | 用 EC2 实例 ID 作为日志流名称(便于区分多实例日志),直接输入 {instance_id} 即可自动填充 |
| 9. Do you want to specify another log file? | y/n | 若需监控多个日志(如应用日志 + 系统日志),选 y 继续添加;否则选 n |
| 10. Do you want to store the config in the SSM Parameter Store? | n | 简单场景无需存储到 SSM,直接生成本地配置文件 |
| 11. Do you want to generate a new config file? | y | 生成配置文件 |
| Where do you want to save the config file? | 直接回车 | 默认保存到 /opt/aws/amazon-cloudwatch-agent/bin/config.json(推荐默认路径,后续启动命令无需修改) |
3. 验证配置文件(可选)
配置完可以打开生成的 config.json 确认日志部分对不对:
# 查看配置文件内容(重点检查 "logs" 部分)
cat /opt/aws/amazon-cloudwatch-agent/bin/config.json
正常配置的 logs 部分示例(监控 /var/log/syslog):
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/syslog",
"log_group_name": "EC2-Ubuntu-Syslog",
"log_stream_name": "{instance_id}",
"retention_in_days": 30 // 日志保留天数(向导中会设置,默认 30 天)
}
]
}
}
}
第四步:启动 CloudWatch Agent 并加载配置
配置文件生成后,跑命令把配置加载上、把 Agent 启起来,日志才能开始上报。
1. 启动 Agent 并加载配置
执行下面这条(-c file:/… 指定配置文件路径,-s 表示启动 Agent):
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl \
-a fetch-config \
-m ec2 \
-c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json \
-s
- -a fetch-config:加载指定的配置文件;
- -m ec2:指定运行环境为 EC2;
- -c file:…:配置文件的本地路径(跟向导生成的路径一致);
- -s:启动 Agent。
2. 验证 Agent 运行状态
跑下面这条看看 Agent 是不是真在跑:
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -m ec2 -a status
正常输出示例(包含 status: running):
{
"status": "running",
"starttime": "2024-09-04T10:00:00+00:00",
"configstatus": "configured",
"version": "1.247354.0"
}
要是状态是 stopped,就手动 sudo systemctl start amazon-cloudwatch-agent 拉起来,再用 sudo journalctl -u amazon-cloudwatch-agent 翻启动日志查错。
第五步:验证日志是否上报到 CloudWatch
配置完等个 1-2 分钟(上报有延迟),去 CloudWatch 控制台确认日志确实收到了。
1. 进入 CloudWatch 日志控制台
- 登录 AWS CloudWatch 控制台;
- 左侧导航栏选「日志」→「日志组」,搜第三步配的「日志组名称」(比如 EC2-Ubuntu-Syslog);
- 点进日志组,能看到以「EC2 实例 ID」命名的日志流(如 i-0a1b2c3d4e5f6g7h8);
- 点进日志流,就能看到从 EC2 上来的日志(比如 /var/log/syslog 的系统日志),支持按时间范围筛、按关键字搜。
2. 手动触发日志上报(验证)
要是没马上看到日志,可以手动造一条再等上报:
# 向监控的日志文件写入一条测试日志(以 /var/log/syslog 为例)
sudo echo "CloudWatch Agent 日志测试: $(date)" >> /var/log/syslog
过 1-2 分钟,在 CloudWatch 日志流里搜「CloudWatch Agent 日志测试」,能搜到就说明配通了。
常见问题与解决方案
问题 1:Agent 启动成功,但 CloudWatch 无日志
可能原因:
- 实例角色权限不够:Agent 没权限建日志组 / 传日志;
- 日志文件路径写错:配的路径不存在,或者 Agent 没权限读;
- 配置文件没加载:启动命令指的配置路径不对。
解决方案:
- 查 IAM 角色:确认 EC2 实例角色已经挂了 CloudWatchEC2LogAccess 策略,跑
aws logs describe-log-groups测一下权限(得先装 AWS CLI:sudo apt install awscli); - 验证日志路径:跑
ls -lh /var/log/syslog确认路径在,sudo cat /var/log/syslog确认 root 能读; - 看 Agent 日志:Agent 自己的日志在 /var/log/amazon/cloudwatch-agent/amazon-cloudwatch-agent.log,搜 error 关键字定位问题:
grep "error" /var/log/amazon/cloudwatch-agent/amazon-cloudwatch-agent.log
问题 2:Agent 启动失败,提示「permission denied」
原因:Agent 没权限碰配置文件或日志文件。
解决方案:
- 确保配置文件权限正确:
sudo chmod 644 /opt/aws/amazon-cloudwatch-agent/bin/config.json; - 以 root 身份重启 Agent(启动命令前加 sudo)。
问题 3:日志上报延迟超过 5 分钟
原因:CloudWatch Agent 默认 5 秒刷一次日志,但网络延迟或 CloudWatch 服务本身压力大也会拖慢。
解决方案:
- 查 EC2 实例网络:确保能访问 CloudWatch 服务(出方向放行 logs.{region}.amazonaws.com,默认 VPC 一般不用额外配);
- 翻 Agent 日志看有没有「retry」关键字:要是频繁重试,多半是权限或网络的问题。
总结
照上面几步走,Ubuntu EC2 实例到 CloudWatch 的日志监控就配好了,核心流程其实就是四步:
- 权限先行:用 IAM 实例角色给 Agent 最小日志权限;
- 装组件:CloudWatch Agent(必装)+ collectd(可选,管指标);
- 配日志:用交互式向导指定监控日志路径和 CloudWatch 目标;
- 启动验证:拉起 Agent,去 CloudWatch 控制台确认日志真上来了。
后面还能在 CloudWatch 日志组上配「日志保留策略」(别让存储费飙太高)、「日志告警」(比如检测到 ERROR 关键字就发邮件),让日志监控更实用。