亚马逊AWS官方博客

使用 Amazon Kinesis Firehose、AWS Lambda 和 Amazon Elasticsearch Service 摄取、聚合和可视化 Apache 日志的无服务器扩展

Original URL:https://aws.amazon.com/blogs/database/serverless-scaling-for-ingesting-aggregating-and-visualizing-apache-logs-with-amazon-kinesis-firehose-aws-lambda-and-amazon-elasticsearch-service/

Pubali Sen 和 Shankar Ramachandran 是 Amazon Web Services 的解决方案架构师。

2016 年,AWS 推出了EKK 堆栈(Amazon Elasticsearch ServiceAmazon Kinesis Kibana),作为 ELKAmazon Elasticsearch Service、开源工具 Logstash Kibana)的替代品,用于提取和可视化 Apache 日志。EKK 堆栈的主要功能之一是通过 Amazon Kinesis Firehose 代理处理数据转换。在本文中,我们将介绍如何优化 EKK 解决方案通过 AWS Lambda 处理 Amazon Kinesis Firehose 中的数据转换。

ELK 堆栈中,Logstash 集群处理 Apache 日志的解析。但是,必须设计和维护 Logstash 集群以进行扩展管理。此类服务器管理需要在用户方面进行大量繁重的工作。借助 Amazon Kinesis FirehoseAWS Lambda Amazon Elasticsearch Service (本文有时简称为Amazon ESES)EKK 解决方案无需再进行此项工作。

解决方案概览

让我们来看看 EKK 优化解决方案的组件和架构。

Amazon Kinesis Firehose

Amazon Kinesis Firehose 提供了将流数据加载到 AWS 的最简单方法。在此解决方案中,Firehose 帮助捕获并自动将流日志数据加载到Amazon ES,并在 Amazon S3 中将其备份。有关 Firehose 的更多信息,请参阅什么是 Amazon Kinesis Firehose?

AWS Lambda

AWS Lambda 允许您在无预置或管理务器的情况下运行代码。它通过运行响应每个触发器的代码自动扩展应用程序。您的代码并行运行并单独处理每个触发器,并根据工作负载的大小进行精确扩展。在 EKK 解决方案中,Amazon Kinesis Firehose 调用 Lambda 函数来转换传入的源数据,并将转换后的数据传输到托管的 Amazon ES 集群。有关 AWS Lambda 的更多信息,请参阅 AWS Lambda 文档

Amazon Elasticsearch Service

Amazon ES 是一种流行的搜索和分析引擎,可提供实时应用程序监控以及日志和点击流分析。在此解决方案中,Apache 日志在 Amazon ES 中存储并编制索引。作为托管服务,Amazon ES 易于在AWS 云中部署、操作和扩展。使用托管服务可以消除管理开销,包括补丁管理、故障检测、节点替换、备份和监控。由于 Amazon ES 包含与 Kibana 的内置集成,因此无需安装和配置该平台,从而进一步简化了流程。有关 Amazon ES 的信息,请参阅什么是 Amazon Elasticsearch Service?

Amazon Kinesis 数据生成器

此解决方案使用 Amazon Kinesis 数据生成器 (KDG) 生成 Apache访问日志。KDG 可以轻松模拟 Apache 访问日志,并演示解决方案的处理流程和可扩展性。

架构

下图显示了 EKK 优化堆栈的架构。

 

配置 EKK 优化堆栈

本节介绍设置 EKK 优化解决方案的步骤。(请在想要的任何区域进行设置。)

创建用于数据转换的 AWS Lambda 函数

Firehose 提供以下 Lambda 蓝图,您可以使用它们创建用于数据转换的 Lambda 函数:

  • 常规 Firehose 处理:包含数据转换和状态。将此蓝图用于任何自定义转换逻辑。
  • Apache Log 到 JSON:使用预定义的 JSON 字段名称解析Apache 日志行并将其转换为 JSON 对象。
  • Apache Log 到 CSV:解析 Apache 日志行并将其转换为 CSV格式。
  • Syslog 到 JSON:使用预定义的 JSON 字段名称解析并将Syslog 行转换为 JSON 对象。
  • 系统日志到 CSV:解析 Syslog 行并将其转换为 CSV 格式。

在 AWS Lambda 控制台中,通过选择 kinesis-firehose-apachelog-to-json 蓝图来创建新的 Lambda 函数。将 Lambda 函数的超时设置为一分钟。

将 Amazon ES 和 Amazon CloudWatch Logs 的完整访问策略附加到 Lambda 函数。通过附加 Amazon ES 权限,可以允许 Lambda 函数在 Amazon ES 集群中写入日志。CloudWatch Logs 访问将帮助您监控 Lambda 功能。

设置 Elasticsearch 集群

在 Amazon ES 控制台中创建 Amazon ES 域,或在 AWS CLI 中使用 create-elasticsearch-domain 命令。

此示例使用以下配置:

  • 域名: LogESCluster
  • Elasticsearch 版本:1
  • 实例计数:2
  • 实例类型:medium.elasticsearch
  • 启用专用主控:true
  • 启用区域感知:true

其他设置保留为默认值。

设置 Firehose 传输流并链接关联 Lambda 函数

在 Firehose 控制台中,使用 Amazon ES 作为目标创建新的传输流。在配置部分中,启用数据转换,并选择从蓝图创建的通用 Firehose 处理 Lambda 函数。

有关此过程中的详细步骤,请参阅创建到 Amazon Elasticsearch Service 的 Firehose 传输流

创建 Amazon Cognito 用户并登录 KDG

在将数据发送到 Amazon Kinesis 之前,您必须在 AWS 账户中创建一个拥有 Amazon Kinesis 访问权限的 Amazon Cognito 用户。为简化此过程,提供 Lambda 函数和 AWS CloudFormation 模板来创建用户并分配使用 KDG 的足够权限。如需了解更多信息,请参阅 KDG 帮助页面

您可以通过单击以下链接来创建 CloudFormation 堆栈。通过此链接,您将进入 AWS CloudFormation 控制台并启动堆栈创建向导。

使用 AWS CloudFormation 创建 Amazon Cognito 用户

为将用于登录 Amazon Kinesis 数据生成器的用户提供用户名和密码。其他选项接受默认值。

创建 CloudFormation 堆栈后,必须使用一个特殊 URL 访问 Amazon Kinesis 数据生成器。AWS CloudFormation 会在堆栈生成过程中创建此 URL。如需获取 URL,请选择 CloudFormation 堆栈,然后选择输出结果选显卡,如以下屏幕截图所示。在浏览器中为此 URL 添加书签,以便轻松访问 KDG。

单击 URL,并使用您在设置 CloudFormation 堆栈时提供的用户名和密码登录 KDG。

为 Apache 访问日志设置 KDG 记录模板

Amazon Kinesis 数据生成器可使用基于提供模板的随机数据生成记录。记录模板可以是任何类型:JSON、CSV 或非结构化。KDG 基于模板创建唯一记录,用实际数据替换模板记录。

以下显示了 Apache 日志的模板:

{{internet.ip}} - - [{{date.now("DD/MMM/YYYY:HH:mm:ss ZZ")}}] "GET /index.html HTTP/1.1" 200 104 "-" "ELB-HealthChecker/1.0"

在KDG中,将每秒记录数设置为 100

要启动数据流,请选择将数据发送到 Amazon Kinesis

数据转换

以下显示转换前的 Apache 日志:

以下显示转换后的 Apache 日志:

"fields": { "request": [
     "GET /index.html HTTP/1.1"
    ],
    "@timestamp": [ 1493632590000 ],
    "bytes": [ "104"  ],
    "response": 200
    "host": [ "29.244.247.116" ],
    "@timestamp_utc": [1493657790000] },
}

Amazon S3 中的文件备份

原始文件在 Amazon S3 中备份。以下显示 Amazon S3 控制台。

监控 Firehose 传输流并对其进行故障排除

Amazon Kinesis Firehose 控制台可帮助您监控数据传输和数据转换并对其进行故障排除。

以下屏幕截图显示了向 Amazon S3 和 Amazon ES 传输日志的详细信息。请注意,将日志传输到 Elasticsearch 集群时出现错误。

为 Elasticsearch 集群设置 Kibana

Amazon ES 为每个 Amazon ES 域默认安装 Kibana。您可以在 Amazon ES 控制台中的域控制面板上找到 Kibana 终端节点。(您可以将 Amazon ES 限制为基于 IP 的访问策略。)

在 Kibana 中,对于索引名称或模式,输入logdiscovery。这是您为 Web 服务器访问日志创建的 Amazon ES 索引的名称。

时间字段名称列表中,选择 @timestamp_utc

在 Kibana 控制台上,选择左侧的发现选项卡以查看 Apache 访问日志。

小结

本博文描述了如何使用无服务器架构转换和发布 Apache 日志。Firehose 和 AWS Lambda 会根据应用程序生成日志的速率自动扩大或缩小。您可以增加 Amazon Kinesis 数据生成器中的每秒记录数,以轻松测试此解决方案的端到端可扩展性。该解决方案解决了 Logstash 中遇到的挑战 — 即难以管理的扩展和繁琐的集群管理。

要了解有关扩展 Amazon ES 集群的更多信息,请参阅 Amazon Elasticsearch Service 开发人员指南

Amazon Kinesis Firehose、AWS Lambda 和 Amazon ES 等托管服务简化了日志聚合系统的配置和管理。可使用 AWS Lambda 对流日志数据运行转换和添加任何自定义转换逻辑,从而进一步强化了使用 EKK 优化堆栈的案例。