可以使用 AWS CloudWatch 从 AWS EC2 实例中收集日志。如 Web 服务器上常见的 Apache2 访问和错误日志等文件,或者任何日志文件。如果你在负载平衡器后面有一组扩展的实例,这特别有用。CloudWatch 不需要连接到每个实例并使用 grep 手动搜索日志,而是将日志集中到一个日志流中,允许你从一个地方搜索所有日志文件。例如,我们在负载均衡器后面有几个 EC2 实例来运行我们的主平台 API,它们都运行 Apache2,此时我们将 Apache2 错误日志的内容发送给 CloudWatch。即使只有几台服务器,也比单独登录每台服务器并使用 grep 命令搜索每个文件要容易得多。如果发生问题,我们能够在 AWS 控制台中看到所有的日志,而不需要浪费时间登录所有的服务器。要在Ubuntu 上设置 CloudWatch,需要做以下工作。
- 创建一个新的 IAM 角色(仅此一次)
- 将 IAM 角色附加到 EC2 实例上。
- 安装并配置 CloudWatch 代理
创建一个新的 IAM 角色
要允许 EC2 实例与 CloudWatch 通信,您首先需要创建一个 IAM 角色。只需要做一次这个操作,可以在创建后跳过此步骤。
- 打开 IAM 控制台。从菜单中,选择角色,然后点击创建角色按钮。
- 在选择将使用此角色的服务下,选择 EC2 并点击 Next: Permissions 按钮。
- 搜索CloudWatchAgentServerPolicy策略,选中复选框并单击Next: Tags。
- 如果需要,可以添加标签。点击 Next: Review。
- 输入角色名称(例如:CloudWatchAgentServerRole)。然后
单击创建角色。
附加 IAM 角色
要将IAM角色附加到 EC2 实例,您可以通过AWS 控制台或通过 AWS 命令行接口(CLI)来完成:
1.使用 AWS 控制台
转到 EC2仪表板,从菜单中选择实例,并选中要从 EC2 实例流转日志旁边的复选框。要附加 IAM 角色,请单击"操作"下拉菜单,然后选择实例设置 > 附加/替换 IAM 角色。
搜索并选择上面创建的 IAM 角色(例如CloudWatchAgentServerRole),然后单击应 用以附加 IAM 角色。
2.使用的 AWS CLI命令是在1.11.46版本中添加到 AWS CLI 中的,所以要确保使用正确的版本(可以用aws --version
检查版本)。
$ aws ec2 associate-iam-instance-profile --instance-id YourInstanceId --iam-instance-profile Name=CloudWatchAgentServerRole
安装 CloudWatch 代理
现在一切就绪,连接到要记录数据的 EC2 实例,并运行以下几个命令。首先是从 S3 下载 CloudWatch Agent(以下是针对 AMD64 Ubuntu 的,如果想下载Centos、Debian等,请在这里查看完整列表)。
$ wget https://s3.amazonaws.com/amazoncloudwatchagent/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
使用下面的命令安装:
$ sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
安装好后,在启动之前需要进行配置。有两种方法可以实现,使用向导,向导会询问一系列问题并生成配置文件,或者手动添加配置文件。由于这里只是为了验证将一个文件记录到 CloudWatch,而且每个 EC2 实例上的文件都是一样的,手动添加配置文件很简单。
1 手动创建 config.json
日志 agent 使用的配置文件在/opt/aws/amazon-cloudwatchagent/bin/config.json
。使用编辑器(如 vim)来创建和编辑一个包含以下内容的文件,如:
sudo vim /opt/aws/amazon-cloudwatch-agent/bin/config.json
{
"agent": {
"run_as_user": "root"
},
"logs": {
"logs_collected": {
"files": {
"collect_list": [
{
"file_path": "/var/log/apache2/error.log",
"log_group_name": "apache-error-log",
"log_stream_name": "{instance_id}"
}
]
}
}
}
}
配置文件中最重要的部分是 file_path
。这是服务器上你想收集数据的日志文件的路径。/var/log/apache2/error.log
是 Ubuntu 上 Apache 的默认错误日志。log_group_name
和 log_stream_name
选项只是用来分别命名 CloudWatch 中的日志组和日志流。我建议在log_stream_name
中保留{instance_id}
,这有助于识别是哪个 EC2 实例发送的日志数据。
2 向导
启动向导:
$ sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agentconfig-wizard
日志代理可以用来收集系统级指标,会被问到这些问题,可以忽略这些问题,因为它们与收集日志无关。如果确实使用了向导,你可以随时生成配置文件,随后手动将其添加到任何其他实例中(按照上面的步骤)。
开启 agent
运行以下命令来运行 agent。CloudWatch Agent 与 systemd 集成,因此它将在重启后自动启动。
$ 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
查看日志
一旦正在查看的日志文件中写入了数据,我们就可以在 CloudWatch 中找到。转到 CloudWatch 概述 并从菜单中选择日志。应该可以看到在配置中使用的日志组的标签(例如:apache-error-log)。
点击日志组名称查看日志流。每个日志流都使用 EC2 实例 ID,从而可知是哪个 EC2 实例记录了数据:
要搜索日志,单击搜索日志组按钮。在过滤器文本框中,输入一个检索条件以一次性搜索 所有 日志文件: