🔍搜索⌘K

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 日志权限)

  1. 登录 AWS IAM 控制台,进入「策略」→「创建策略」;
  2. 切到「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": "*"
    }
  ]
}
  1. 点「下一步」,填个策略名(比如 CloudWatchEC2LogAccess),创建完事。

步骤 2:为 EC2 实例附加 IAM 角色

  1. 进 EC2 控制台,选中目标 Ubuntu 实例,点「操作」→「安全」→「修改 IAM 角色」;
  2. 点「选择 IAM 角色」——要是有现成合适的角色,直接把上面建的 CloudWatchEC2LogAccess 策略挂上就行;没有角色就点「创建新 IAM 角色」:
  • 信任实体类型选「AWS 服务」→「EC2」,下一步;
  • 搜到并勾上 CloudWatchEC2LogAccess 策略,下一步;
  • 填个角色名(比如 EC2CloudWatchLogRole),把角色建好;
  1. 选新建的角色,点「保存」,等几秒权限就生效了。

第一步:安装 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-SyslogCloudWatch 中存储该日志的「日志组名称」(建议包含实例标识,如 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 日志控制台

  1. 登录 AWS CloudWatch 控制台;
  2. 左侧导航栏选「日志」→「日志组」,搜第三步配的「日志组名称」(比如 EC2-Ubuntu-Syslog);
  3. 点进日志组,能看到以「EC2 实例 ID」命名的日志流(如 i-0a1b2c3d4e5f6g7h8);
  4. 点进日志流,就能看到从 EC2 上来的日志(比如 /var/log/syslog 的系统日志),支持按时间范围筛、按关键字搜。

2. 手动触发日志上报(验证)

要是没马上看到日志,可以手动造一条再等上报:

# 向监控的日志文件写入一条测试日志(以 /var/log/syslog 为例)
sudo echo "CloudWatch Agent 日志测试: $(date)" >> /var/log/syslog

过 1-2 分钟,在 CloudWatch 日志流里搜「CloudWatch Agent 日志测试」,能搜到就说明配通了。

常见问题与解决方案

问题 1:Agent 启动成功,但 CloudWatch 无日志

可能原因:

  1. 实例角色权限不够:Agent 没权限建日志组 / 传日志;
  2. 日志文件路径写错:配的路径不存在,或者 Agent 没权限读;
  3. 配置文件没加载:启动命令指的配置路径不对。

解决方案:

  1. 查 IAM 角色:确认 EC2 实例角色已经挂了 CloudWatchEC2LogAccess 策略,跑 aws logs describe-log-groups 测一下权限(得先装 AWS CLI:sudo apt install awscli);
  2. 验证日志路径:跑 ls -lh /var/log/syslog 确认路径在,sudo cat /var/log/syslog 确认 root 能读;
  3. 看 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 没权限碰配置文件或日志文件。

解决方案:

  1. 确保配置文件权限正确:sudo chmod 644 /opt/aws/amazon-cloudwatch-agent/bin/config.json;
  2. 以 root 身份重启 Agent(启动命令前加 sudo)。

问题 3:日志上报延迟超过 5 分钟

原因:CloudWatch Agent 默认 5 秒刷一次日志,但网络延迟或 CloudWatch 服务本身压力大也会拖慢。

解决方案:

  1. 查 EC2 实例网络:确保能访问 CloudWatch 服务(出方向放行 logs.{region}.amazonaws.com,默认 VPC 一般不用额外配);
  2. 翻 Agent 日志看有没有「retry」关键字:要是频繁重试,多半是权限或网络的问题。

总结

照上面几步走,Ubuntu EC2 实例到 CloudWatch 的日志监控就配好了,核心流程其实就是四步:

  1. 权限先行:用 IAM 实例角色给 Agent 最小日志权限;
  2. 装组件:CloudWatch Agent(必装)+ collectd(可选,管指标);
  3. 配日志:用交互式向导指定监控日志路径和 CloudWatch 目标;
  4. 启动验证:拉起 Agent,去 CloudWatch 控制台确认日志真上来了。

后面还能在 CloudWatch 日志组上配「日志保留策略」(别让存储费飙太高)、「日志告警」(比如检测到 ERROR 关键字就发邮件),让日志监控更实用。