亚马逊AWS官方博客

从 ELK 堆栈到 EKK:使用 Amazon Elasticsearch Service、Amazon Kinesis 和 Kibana 聚合和分析 Apache 日志

Original URL:https://aws.amazon.com/blogs/devops/from-elk-stack-to-ekk-aggregating-and-analyzing-apache-logs-with-amazon-elasticsearch-service-amazon-kinesis-and-kibana/

作者:Pubali Sen、Shankar Ramachandran

日志聚合对您的运营基础设施至关重要。可靠、安全且可扩展的日志聚合解决方案在关键时间如调试过程中起到重要作用。 在本文中,我们探索了流行的开源日志聚合解决方案的AWS 对应解决方案,即 ELK 堆栈(Elasticsearch Logstash Kibana ):EKK 堆栈(Amazon Elasticsearch Service Amazon Kinesis Kibana )。借助 EKK 解决方案,不再需要进行重复的繁重工作,对日志聚合解决方案进行部署、管理和扩展等。使用 EKK 堆栈,您可以专注于分析日志和调试应用程序,而不是管理和扩展聚合日志的系统平台本身。 在本篇博文中,我们将介绍如何使用 EKK 堆栈来监控 Apache 日志。让我们先看看 EKK 解决方案的组件。

Amazon Elasticsearch Service(本文有时候简写为Amazon ESES) 是一种流行的搜索和分析引擎,可提供实时应用程序监控以及日志和点击流分析。对于本博文,您将在 Amazon ES 中存储和索引 Apache 日志。作为托管服务,Amazon ES 易于在AWS 云中部署、运行、操作和扩展。使用托管服务还可以消除管理开销,例如补丁管理、故障检测、节点替换、备份和监控等。由于 Amazon ES 包含与 Kibana 的内置集成,因此无需安装和配置该平台。这进一步简化了您的流程。有关 Amazon ES 的更多信息,请参阅 Amazon Elasticsearch Service 详细信息页面。

Amazon Kinesis Agent 是一个易于安装的独立 Java 软件应用程序,用于收集和发送数据。此代理持续监控 Apache 日志文件,并将新数据发送到传输流。此代理还负责日志文件轮换、检查点、故障重试以及及时可靠地传输日志数据。有关更多信息,请参阅使用 Amazon Kinesis Agent 写入 Amazon Kinesis Firehose GitHub 中的Amazon Kinesis Agent

Amazon Kinesis Firehose 提供了将流数据加载到 AWS 的最简单方法。在本文中,Firehose 可帮助您捕获并自动将流日志数据加载到 Amazon ES,并在Amazon Simple Storage Service (Amazon S3) 中备份。有关更多信息,请参阅 Amazon Kinesis Firehose 详细信息页面。

您将使用 AWS CloudFormation 模板 交付EKK 堆栈。该模板堆栈会统一交付一个 Apache Web 服务器,以及 Amazon Kinesis Agent Firehose Apache 访问日志发送到 Amazon ES 集群环境。最终所有日志将备份到 S3 存储桶保存。要查看日志,您可以利用 Amazon ES Kibana 可视化查询日志。

通过使用该交付模板,您可以快速完成以下任务:

·      预置 Amazon ES 集群。

·      预置 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

·      安装 Apache HTTP Server 版本 2.4.23。

·      在 Web 服务器上安装 Amazon Kinesis Agent。

·      预置 Elastic Load Balancing 负载均衡器。

·      创建 Amazon ES 索引和关联的日志映射。

·      创建 Amazon Kinesis Firehose 传输流。

·      创建所有 AWS Identity and Access Management (IAM) 角色和策略。例如,Firehose 传输流将 Apache 日志备份到 S3 存储桶。这要求 Firehose 传输流与一个角色相关联,该角色允许将日志上传到正确的 S3 存储桶。

·      为 Firehose 传输流配置 Amazon CloudWatch Logs 日志流和日志组。这有助于您在日志事件未到达目标时进行故障排除。

EKK 堆栈架构

以下架构图显示了 EKK 堆栈的工作原理。

Arch8-2-2-2

先决条件

要构建 EKK 堆栈,您必须拥有以下内容(此处以美国西部Oregon区域为例):

·      Amazon EC2 密钥对(美国西部(俄勒冈)区域)。如果您没有,请创建一个。

·      S3 存储桶(美国西部(俄勒冈)区域)。如果您没有,请创建一个。

·      默认 VPC(美国西部(俄勒冈州)区域)。如果您已删除默认 VPC,请在控制台重新创建一个。

·      IAM 中的管理员级权限,以便使 Amazon ES 和 Amazon S3 能够通过 Firehose 从 EC2 实例接收日志数据。

入门

首先启动 AWS CloudFormation 模板以创建堆栈。

1.     在 AWS CloudFormation 控制台中,选择启动堆叠 AWS CloudFormation 模板。确保您在美国西部(俄勒冈)区域。

注意:如果要将模板下载到计算机,然后将其上传到 AWS CloudFormation,则可以从此 Amazon S3 存储桶执行此操作。将模板保存到计算机上易于记忆的位置。

2.     选择“下一步”。

3.     在“指定详细信息”页面上,提供以下内容:

Screen Shot 2016-11-01 at 9.44.20 AM

a)    堆栈名称:堆栈的名称。

b)   InstanceType:选择托管 Web 服务器的 EC2 实例的实例系列。

c)     KeyName:在美国西部(俄勒冈)区域中选择 Amazon EC2 密钥对。

d)    SSHLocation:可以使用 SSH 连接到 EC2 实例的 IP 地址范围。接受默认值,0.0.0.0/0。

e)    WebserverPort:Web 服务器的 TCP/IP 端口。接受默认值,80。

4.     选择“下一步”。

5.     在“选项”页面上,可选择为 AWS CloudFormation 模板指定标记,然后选择“下一步”。

createStack2

6.     在“查看”页面上,查看模板详细信息。选中“确认”复选框,然后选择“创建”以创建堆栈。

创建整个堆栈大约需要 10-15 分钟。

配置 Amazon Kinesis 代理

AWS CloudFormation 创建堆栈后,配置 Amazon Kinesis 代理。

1.     在 AWS CloudFormation 控制台中,选择“资源”选项卡以查找 Firehose 传输流名称。您需要此名称来配置代理。记录此值,因为您将在步骤 3 中需要它。

createStack3

2.     在“输出”选项卡上,查找并记录 Web 服务器的公共 IP 地址。使用 SSH 连接到 Web 服务器配置代理的时候需要用到。有关如何使用 SSH 连接到 EC2 实例的说明,请参阅使用 SSH 连接到 Linux 实例

输出结果

3.在 Web 服务器的命令行上,运行以下命令:

sudo vi /etc/aws-kinesis/agent.json

此命令会打开配置文件 agent.json,如下所示。

{ "cloudwatch.emitMetrics": true, "firehose.endpoint": "firehose.us-west-2.amazonaws.com", "awsAccessKeyId": "", "awsSecretAccessKey": "", "flows": [ { "filePattern": "/var/log/httpd/access_log", "deliveryStream": "", "dataProcessingOptions": [ { "optionName": "LOGTOJSON", "logFormat": "COMMONAPACHELOG" } ] } ] } 

4.     对于 deliveryStream 键,输入从堆栈的“资源”选项卡中检索的 KinesisFirehoseDeliveryName 的值。输入值后,保存并终止 agent.json 文件。

5.     在 CLI 上运行以下命令:

sudo service aws-kinesis-agent restart

6.    在 AWS CloudFormation 控制台上,选择资源选项卡,并记下与LogicalID ESDomain 对应的 Amazon ES 集群的名称。

7.     转到 AWS 管理控制台,然后选择 Amazon Elasticsearch Service。在 My Domains(我的域)下,您可以看到 AWS CloudFormation 模板创建的 Amazon ES 域。

createStac5

配置 Kibana 并查看 Apache 日志

Amazon ES 为每个 Amazon ES 域默认安装 Kibana。您可以在 Amazon ES 控制台中的域控制面板上找到 Kibana 终端节点。

1.     在 Amazon ES 控制台中,选择 Kibana 终端节点。

2.     在 Kibana 中,对于索引名称或模式,输入 logmonitor。logmonitor 是您为 Web 服务器访问日志创建的 AWS ES 索引的名称。Amazon Elastic Load Balancing 的运行状况检查会在 Web 服务器上生成访问日志,该日志通过 EKK 管道流向 Kibana 以进行发现和可视化。

3.    在时间字段名称中,选择日期时间。

kibana1

4.     在 Kibana 控制台上,选择“发现”选项卡以查看 Apache 日志。

kibana3

使用 Kibana 通过创建条形图、折线图和散点图、直方图、饼图等来可视化日志数据。

Kibana4

过去 30 天内访问 Web 服务器的 IP 地址饼图

Kibana5

过去 5 分钟内访问 Web 服务器的 IP 地址条形图

您可以用图形表示有关 http 响应、字节或 IP 地址的信息,以提供有关 Apache 日志的有意义的见解。Kibana 还通过组合图表来简化控制面板的制作。

监控日志聚合器

如需监控 Firehose 传输流,请导航至 Firehose 控制台。选择流,然后选择“监控”选项卡,以查看流的 Amazon CloudWatch 指标。

monito1

 

当日志传输失败时,Amazon S3 Amazon ES 日志可帮助您进行故障排除。例如,以下屏幕截图显示了传输到 Amazon ES 目标失败的日志,是因为索引上的日期映射与提取日志不符导致。

monitor2

小结

在本博文中,我们展示了如何使用 Amazon Kinesis Agent、Amazon ES 和 Firehose 将 Apache 日志发送到 Kibana。值得指出的是,Firehose 会根据应用程序生成日志的速率自动扩大或缩小。要了解有关扩展 Amazon ES 集群的更多信息,请参阅 Amazon Elasticsearch Service 开发人员指南

Amazon ES 和 Amazon Kinesis Firehose 等托管服务简化了日志聚合系统的预置和管理。可使用 Amazon Kinesis Analytics 对流式日志数据运行 SQL 查询,这进一步强化了使用 EKK 堆栈的案例。本文中使用的 AWS CloudFormation 模板可用于扩展和构建您自己的 EKK 堆栈。