使用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)を指定します。
Screen Shot 2015-10-12 at 6.32.21 PM.png

接下来,只需随意访问ELB,并等待日志输出。

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

Screen Shot 2015-10-12 at 5.23.49 PM.png

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

Screen Shot 2015-10-12 at 6.39.52 PM.png

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

Screen Shot 2015-10-12 at 5.35.36 PM.png

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

广告
将在 10 秒后关闭
bannerAds