使用Lambda+Elasticsearch(Amazon Elasticsearch Service)将ELB日志无服务器地可视化在Kibana中
亚马逊发布了作为托管服务的Elasticsearch+Kibana 4可用的亚马逊 Elasticsearch 服务。
【AWS宣布】亚马逊 Elasticsearch 服务
我之前尝试使用fluentd将ELB的日志导入到Elasticsearch中,但这样的话需要运行fluentd的服务器。
使用fluentd(fluent-plugin-elb-access-log) + Elasticsearch + kibana来可视化ELB的访问日志。
我认为现在有了Lambda在东京地区可以使用,可以将将S3 ELB访问日志上传到Lambda并在Lambda中进行处理,然后将其注册到Elasticsearch中,这样就可以实现无服务器可视化。好奇心促使我尝试了一下,并记录下了。
创建针对Lambda的角色
我会预先创建一个角色,该角色可以访问IAM中的Lambda,以及注册到Elasticsearch的S3。
创建Elasticsearch
可以通过管理控制台等方式创建 Elasticsearch 的新域。
此外,还将确保可以通过先前创建的角色来操作Elasticsearch。
请将创建后的域名端点记下来。
用于创建Lambda代码
我认为需要编写代码将Lambda中的数据注册到Elasticsearch。然而,我在以下找到了AWS官方提供的Lambda示例,该示例可以使用Lambda从S3中将apache的日志数据注册到Elasticsearch。
amazon-elasticsearch-lambda-samples/src/s3_lambda_es.js 可以用以下方式进行本地化翻译成中文:
亚马逊-弹性搜索-λ函数-样例/源代码/s3_lambda_es.js
看起来日志文件的解析部分是使用了apache/nginx的解析器,所以改成适用于ELB的解析器可能会更好。
我根据apache/nginx使用的方式,尝试创建了一个npm来解析ELB的访问日志。
日志解析器
這次我們將使用這個與現有的元件稍作程式碼修改來實現。如果想更細緻地處理解析部分,同樣可以使用既有元件進行parser的建立和註冊,這樣做很簡單。
首先,在Amazon官方仓库中找到从s3到Elasticsearch注册的代码。
$git clone https://github.com/awslabs/amazon-elasticsearch-lambda-samples.git
接下来,我们将创建一个用于本次使用的Lambda项目。
# プロジェクト作成
$mkdir es-elb-log
$cd es-elb-log
$cp ../amazon-elasticsearch-lambda-samples/src/s3_lambda_es.js index.js
# 依存ライブラリのインストール。bylineはStreamを1行ごとに取り出せる
$npm install aws-sdk byline elb-log-parser
接下来我们稍微修改一下文件。请将{your-es-endpoint}替换为你刚刚创建的Elasticsearch的终端节点。
- var parse = require('clf-parser');
+ var parse = require('elb-log-parser');
- endpoint: 'my-search-endpoint.amazonaws.com',
+ endpoint: {your-es-endpoint},
- region: 'my-region',
+ region: 'ap-northeast-1',
- doctype: 'apache',
+ doctype: 'elb',
我会使用ZIP进行压缩。
$zip -r es-elb-log.zip index.js node_modules
由于代码已经编写完成,之后可以通过Lambda函数管理控制台等方式来创建LambdaFunction,并上传已创建的ZIP文件。
请在Handler中指定index.handler,并在Role中指定您先前创建的角色。此外,根据日志量的情况,您可能需要将Timeout的时间设置稍长一些。
试一试
既然准备就绪,我们将执行以下操作,确认是否可以通过Lambda访问日志进行注册。
-
- EC2を起動し、Webサーバーを起動
-
- ELBを作成し、EC2にトラフィックが流れるようにする
-
- ELBのアクセスログを任意のS3バケットに登録するように設定。アクセスログの間隔を5分にすると結果が早く分かります。
- LambdaのEventSourcesでELBのアクセスログを配置するバケット、EventTypeとしてObject Created(All)を指定します。

接下来,只需随意访问ELB,并等待日志输出。
如果设置成功,Lambda将在上传访问日志到S3时执行,并将日志信息注册到Elasticsearch中。您可以通过管理控制台确认Elasticsearch中是否存在以下记录。

在CloudwatchLogs中,您还可以检查Lambda的日志。

此外,更改Elasticsearch的访问策略,允许来自所使用环境的IP连接Kinaba,以便访问并查看以下日志信息。

在没有服务器管理的情况下能做到这一点,感觉非常不错!