亚马逊AWS官方博客
EKK—基于AWS托管服务的日志收集分析系统
译者:刘磊
应用系统日志的收集分析对于运维来说是至关重要的。一个可靠、安全、可扩展的日志收集分析解决方案在分析应用系统异常终止原因时能够让一切都变得轻松起来。
在这篇博文里,我们会探讨除了流行的ELK(Elasticsearch, Logstash, and Kibana)解决方案之外的另一种选择,EKK解决方案(Amazon Elasticsearch Service, Amazon Kinesis, and Kibana)。EKK架构最大的好处是使得你不再需要自己亲自安装、部署、管理以及扩展日志收集分析系统,而将精力集中在分析日志,排除应用系统异常上面。
下面我们会介绍如何使用EKK架构来收集和分析Apache web服务器的日志,先来看看EKK架构的组成部分。
Amazon Elasticsearch Service是一个流行的搜索和分析引擎,主要用来提供实时的应用系统日志和点击类流量的分析服务。本文中我们会利用Amazon ES将Apache的日志存储并索引起来,作为一项托管服务,Amazon ES可以很轻松地在AWS云上进行部署、操作和扩展。此外使用托管服务,还能大大减轻管理上的工作,例如打补丁、异常监测、节点恢复、备份、监控等等。因为Amazon ES自身内部已经和Kibana进行了集成,所以省去了安装和配置等工作。获取Amazon ES的更多信息,请参考Amazon Elasticsearch Service。
Amazon Kinesis Agent 是一个易于安装的单机版Java应用程序,它负责收集和发送日志数据。它会持续监控Apache web服务器的日志文件,并且将新的数据不断地发送到传输数据流中。同时它还负责文件回滚、生成检查点、异常发生后的重试,以及以时间序列为准可靠地发送日志文件。获取更多利用Amazon Kinesis Agent的信息,请参考Amazon Kinesis Agent和 GitHub 相关项目。
Amazon Kinesis Firehose提供了往AWS中加载流式数据的捷径。本文中,Firehouse会获取并自动加载日志的流式数据到Amazon ES里,随后在S3中还会再进行一次备份。获取Amazon Kinesis Firehose的更多信息,请参考Amazon Kinesis Firehose。
有了AWS CloudFormation的帮助,你只需要使用一个模板就能快速实现EKK架构。模板里准备了Apache web服务器,并使用Amazon Kinesis Agent和Firehose将它的访问日志发送给Amazon ES集群,同时在S3中备份日志数据,最后使用Amazon ES Kibana endpoint来对你的日志进行可视化分析。
AWS CloudFormation template帮你快速完成如下工作:
- 准备Amazon ES集群。
- 准备Amazon EC2实例。
- 安装2.4.23版本的Apache HTTP服务器。
- 在Apache HTTP服务器之上安装Amazon Kinesis Agent。
- 准备ELB(弹性负载均衡)。
- 创建Amazon ES索引和相应的日志对应关系。
- 创建Amazon Kinesis Firehose发送系统。
- 创建所有的IAM角色以及相应的权限规则。例如,Firehose需要将日志数据备份到S3中,那么就需要往目标S3桶上传数据的权限。
- 为Firehose发送系统配置CloudWatch 日志流和日志组,以便在日志发送出现异常时进行排查。
EKK架构示意图:
要搭建本文中的EKK架构,你需要以下先决条件:
- US West区域的Amazon EC2密钥对。
- US West区域的S3桶。
- US west区域的默认VPC。
- 具有管理员权限的IAM角色,用来确保Amazon ES和Amazon S3通过Firehose获取到EC2上的日志数据
让我们开始吧:
从启动AWS CloudFormation模板开始创建整个系统
1. 在AWS CloudFormation控制台上,选择来 启动模板。请确保你在US West区域。
提示:如果你想下载这个模板并随后上传至AWS CloudFormation,你可以从随后给出的S3桶里面下载模板到你本地的电脑中。
2. 选择下一步
3. 在详细设置页面,提供以下信息:
a)软件栈名称:为你的EKK系统命名
b)实例类型:选择安装Apache HTTP服务器的EC2实例类型
c)密钥:选择US West区域的密钥对
d) SSH位置:可以通过SSH连接到EC2实例的IP地址范围,默认为0.0.0.0/0
e)web服务端口:Web服务器的监听端口,默认为80
4. 选择下一步
5. 在选项页面,为AWS CloudFormation模板提供你想要的可选信息,然后选择下一步。
6. 在回顾页面,检查模板的各项设置,点击确认然后选择创建系统。
整个创建过程大约耗时10-15分钟。
配置Amazon Kinesis Agent
等待AWS CloudFormation创建完整个EKK系统,然后开始配置Amazon Kinesis Agent。
1. 在AWS CloudFormation控制台中,选择资源标签页,找到Firehose发送系统的名称。你在随后的第3步中需要它来配置Agent。
2. 在输出标签页,找到并记录下Web服务器的公有IP地址。你随后需要通过它SSH登录到Web服务器上配置Agent。获得更多关于通过SSH连接EC2实例的信息,请参考通过SSH登录你的Linux实例.
3. 在Web服务器的命令行上,运行以下命令:
该命令会打开配置文件,agent.json,内容如下:
4. 将在资源标签页获得的Firehose发送系统名称填入deliveryStream栏目中,然后保存并退出。
5. 在命令行上运行以下命令:
sudo service aws-kinesis-agent restart
6. 在AWS CloudFormation 控制台中查看Amazon ES对应的逻辑ID域
7. 在AWS Elasticsearch服务页面中你可以查看到由AWS CloudFormation创建的ES集群
配置Kibana并分析日志数据
Amazon ES为每一个ES域都默认提供了Kibana的安装,你可以在域的展示页面找到Kibana endpoin的相关信息。
1. 在Amazon ES控制台,选择Kibana endpoin
2. 在Kibana中,为索引名称和模式选项键入logmonitor。该值是你为Web访问日志创建的AWS ES索引名称。来自AWS ELB的健康检查会产生Apache的访问日志,随后流经整个EKK数据线,最后在Kibana中被可视化展现出来供分析所用。
3. 在时间选择中,选择datetime
4. 在Kibana控制台,选择发现标签页来观察Apache日志。
Kibana提供了条形图、折线图、散点图、直方图、饼图等来对日志文件进行分析。
过去30天访问Web服务器的IP地址饼图
过去5分钟内访问Web服务器的IP地址条形图
你还可以将http响应、IP地址等各类信息绘制成图表,甚至组合它们,以此来提供对于Apache日志的更深洞见。
监控日志收集分析系统
在Firehose控制台上选择流数据,然后选择监控标签页来查询CloudWatch中针对Firehose发送系统的度量值。
当日志发送失败后,Amazon S3和Amazon ES上等日志会帮助你定位问题。比如,如下的截图显示了因为索引上的日期映射没有和源日志文件保持一致。
结论
本文中,我们展示了如何通过Amazon Kinesis Agent, Amazon ES和Firehose将Apache日志传输至Kibana并进行可视化分析。值得注意的是,Firehose会根据应用系统产生日志的速率来自动进行伸缩。获取更多如何扩展Amazon ES集群的信息,请参考Amazon ES 开发指南.
综上所述,使用类似Amazon ES和Amazon Kinesis Firehose这类的托管服务,让管理和维护日志收集分析系统变得十分轻松。更棒的是,你还可以通过在日志流数据上直接运行SQL语句来进一步提升EKK系统的性能和功能。而这一切都可以基于本文中给出的AWS CloudFormation 模板。
译者介绍:
刘磊,曾供职于中国银联电子支付研究院,期间获得上海市科技进步一等奖,并申请7项国家发明专利。现任职于AWS中国专家服务团队,致力于为客户提供基于AWS服务的专业大数据解决方案、项目实施以及咨询服务。