株式会社クイックのWebサービス開発blog

HAPPYなエンジニア&デザイナーのブログです

AWSのKinesis Firehoseを使ってEC2のログをElasticsearchに飛ばして可視化した話

AWSを使うと非常に簡単にアクセスログの可視化が出来ます!感動しました!
今更感はありますが、ログを可視化してグラフ化する手順を書きたいと思います。
おはこんばんちは、SREのmatsBです。

使うAWSサービス

構成イメージ

f:id:aimstogeek:20181109154910p:plain

Amazon Elasticsearch Serviceの設定

ドメインの定義

特にこだわりとか無ければ最小構成でポチポチ設定していくだけです。
まずは、好きなドメイン名を付けます。

f:id:aimstogeek:20181109171658p:plain

クラスターの設定

構成を選んでいきます。
今回はテストとしてなので、最小構成を選んでいます。

f:id:aimstogeek:20181109171707p:plain

アクセスの設定

アクセス制御方法を選んでいきます。
VPCアクセス」でもいいのですが、Amazon Kinesisを使う時にVPCを意識しながら使わなきゃいけなくなります。
弊社の場合は「パブリックアクセス」の方が都合が良いので、そちらを選択しています。
自分の接続元IPを選んで追加します。

f:id:aimstogeek:20181109171723p:plain

確認

最後に確認をして問題なければ完了です。

f:id:aimstogeek:20181109171749p:plain

Amazon Kinesisの設定

Name and source

stream nameはEC2がFluentdを設定する時の「delivery_stream_name」で使います。

f:id:aimstogeek:20181109171800p:plain

Process records

ここはデフォルトのまま「Next」でいきました。

f:id:aimstogeek:20181109171809p:plain

Select destination

飛ばす先を「Amazon Elasticsearch Service」にして、上記で作ったElasticsearchのドメイン名を入れます。
Index名は分かりやすい文字列を入れました。

f:id:aimstogeek:20181109171821p:plain


上記画像の下の部分ですが、バックアップとして飛ばすS3を設定していきます。
今回は「Failed records only」を選択してますが「All records」を選べば、Fluentdで飛んできたログ全てが保存されます。
別の方法でログを見たい時や解析したい時に活用できます!
あと、Apacheのログフォーマットや、それを飛ばすFluentdの設定をちゃんとやらないとElasticsearchに飛んでも解析してくれません。
ちゃんと出来てるかの不安があれば、全ログを取って都度確認したほうがいいと思います。

f:id:aimstogeek:20181109171830p:plain

Configure settings

「Buffer size」は「1」、「Buffer interval」は「60」に設定しました。
最小値にしてるのはできるだけリアルタイムに近づけるためです。
逆にいうと、Kinesisを使ったログの可視化はリアルタイム性は捨てなきゃいけないです。
IAM roleの設定も必要なので、ここで設定します。

f:id:aimstogeek:20181109171840p:plain

ロールの設定

IAM roleのポリシーはもう用意されてるので、それを流用して設定します。

f:id:aimstogeek:20181109171849p:plain

Configure settings

設定するとこんな感じでIAM roleが入ります。

f:id:aimstogeek:20181109171859p:plain

Review

確認画面で問題なければ作成完了です。

f:id:aimstogeek:20181109171908p:plain


EC2の設定

EC2の前提

Apacheが動いていてログが出力されてる事が前提です。
今回はアクセスログを投げて解析しますが、用途によっては他のログを飛ばしてください。
ログの出力先は

CustomLog /var/log/httpd/919/919-access_log combined_ltsv

としていて、ltsvを前提としています。
ログフォーマットは下記のようになっています。

LogFormat "remote_ip:%a\tx_f_protocol:%{X-Forwarded-Proto}i\tremote_host:%h\tident:%l\tuser:%u\ttime:%{%d/%b/%Y:%H:%M:%S %z}t\treq:%r\tmethod:%m\tpath:%U%q\thttp_protocol:%H\tstatus:%>s\tsize:%b\treferer:%{Referer}i\tua:\"%{User-Agent}i\"\tresponse_time:%D" combined_ltsv

Fluentdのインストール

Amazon Linuxを使ってるので、yumでインストールします。

$ yum install td-agent

fluent-pluginのインストール

kinesisに関するプラグインはいくつかあるのですが、awslabsが公開している「fluent-plugin-kinesis」を使います。

$ gem search -rd fluent-plugin | grep kinesis
fluent-plugin-in-kinesis (0.0.2)
    Homepage: https://github.com/yusukeyamatani/fluent-plugin-in-kinesis
fluent-plugin-kinesis (2.1.1)
    Homepage: https://github.com/awslabs/aws-fluent-plugin-kinesis
fluent-plugin-kinesis-aggregation (0.3.1)
    https://github.com/atlassian/fluent-plugin-kinesis-aggregation
fluent-plugin-kinesis-alt (0.0.2)
    Homepage: https://bitbucket.org/winebarrel/fluent-plugin-kinesis-alt
fluent-plugin-kinesis-firehose (0.1.1)
    https://github.com/winebarrel/fluent-plugin-kinesis-firehose
fluent-plugin-kinesis-intuit (2.1.1)
    https://github.intuit.com/cloud-logging/aws-fluent-plugin-kinesis-in

インストールをします。

$ td-agent-gem install fluent-plugin-kinesis

インストールされたことを確認します。

$ td-agent-gem list | grep kinesis
fluent-plugin-kinesis (2.1.1)

td-agentの設定

td-agentにkinesis用の設定と飛ばすログの設定を追加します。

$ vim /etc/td-agent/conf.d/919_apache.conf
<source>
  @type config_expander
  <config>
    @type tail
    #format none
    format ltsv
    time_format %d/%b/%Y:%H:%M:%S %z
    path /var/log/httpd/919/919-access_log
    pos_file /var/log/td-agent/919-access_log.pos
    tag 919-dev.apache.${hostname}
  </config>
</source>

<match 919-dev.apache.*>
  @type kinesis_firehose
  delivery_stream_name 919-logs
  region ap-northeast-1
  random_partition_key true
</match>

ちなみに、一番最初に読み込まれるconfigはこんな感じになっています。

$ vim /etc/td-agent/td-agent.conf
@include conf.d/*.conf

<match fluent.**>
  @type file
  path /var/log/td-agent/fluent.log
</match>

config に誤りが無いかを確認してtd-agentを再起動します。

$ td-agent --dry-run -c /etc/td-agent/td-agent.conf
2018-11-09 16:40:15 +0900 [info]: parsing config file is succeeded path="/etc/td-agent/td-agent.conf"
2018-11-09 16:40:15 +0900 [info]: starting fluentd-1.2.0 as dry run mode ruby="2.1.10"

$ /etc/init.d/td-agent restart
td-agentng td-agent:                                       [  OK  ]

kibana

これで設定は完了になります!
あとはAWSのElasticsearchにKibanaが用意されてるので、Kibanaで見たい条件などを入れれば可視化出来ます。
ちょっと見せられる部分が少ないのですが、イメージとしてこんな感じに入ってくると思ってもらえれば!

f:id:aimstogeek:20181109164739p:plain


そして今のままのアクセスログだとtime_formatがElasticsearchに無いので追加する必要があります。
具体的には下記のElasticsearchのデフォルトで用意されてるフォーマットに合わせるかこちらでフォーマットを作って時間を認識してもらう必要があります。
format | Elasticsearch Reference [6.5] | Elastic

最後に

リアルタイム性は無いですが、運用するコストがほとんどないのでとても楽にログの可視化が出来ます。
ただ、可視化することがゴールではなく、可視化して分析して次に繋げるが最終的な目的になります。
これからのエンジニアは分析能力も問われてくるってことですね!





\\一緒に『明日のはたらくを創る』仲間を募集中です!! //
919.jp