AWSを使うと非常に簡単にアクセスログの可視化が出来ます!感動しました!
今更感はありますが、ログを可視化してグラフ化する手順を書きたいと思います。
おはこんばんちは、SREのmatsBです。
構成イメージ
Amazon Elasticsearch Serviceの設定
アクセスの設定
アクセス制御方法を選んでいきます。
「VPCアクセス」でもいいのですが、Amazon Kinesisを使う時にVPCを意識しながら使わなきゃいけなくなります。
弊社の場合は「パブリックアクセス」の方が都合が良いので、そちらを選択しています。
自分の接続元IPを選んで追加します。
確認
最後に確認をして問題なければ完了です。
Amazon Kinesisの設定
Name and source
stream nameはEC2がFluentdを設定する時の「delivery_stream_name」で使います。
Process records
ここはデフォルトのまま「Next」でいきました。
Select destination
飛ばす先を「Amazon Elasticsearch Service」にして、上記で作ったElasticsearchのドメイン名を入れます。
Index名は分かりやすい文字列を入れました。
上記画像の下の部分ですが、バックアップとして飛ばすS3を設定していきます。
今回は「Failed records only」を選択してますが「All records」を選べば、Fluentdで飛んできたログ全てが保存されます。
別の方法でログを見たい時や解析したい時に活用できます!
あと、Apacheのログフォーマットや、それを飛ばすFluentdの設定をちゃんとやらないとElasticsearchに飛んでも解析してくれません。
ちゃんと出来てるかの不安があれば、全ログを取って都度確認したほうがいいと思います。
Configure settings
「Buffer size」は「1」、「Buffer interval」は「60」に設定しました。
最小値にしてるのはできるだけリアルタイムに近づけるためです。
逆にいうと、Kinesisを使ったログの可視化はリアルタイム性は捨てなきゃいけないです。
IAM roleの設定も必要なので、ここで設定します。
ロールの設定
IAM roleのポリシーはもう用意されてるので、それを流用して設定します。
Configure settings
設定するとこんな感じでIAM roleが入ります。
Review
確認画面で問題なければ作成完了です。
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
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で見たい条件などを入れれば可視化出来ます。
ちょっと見せられる部分が少ないのですが、イメージとしてこんな感じに入ってくると思ってもらえれば!
そして今のままのアクセスログだとtime_formatがElasticsearchに無いので追加する必要があります。
具体的には下記のElasticsearchのデフォルトで用意されてるフォーマットに合わせるかこちらでフォーマットを作って時間を認識してもらう必要があります。
format | Elasticsearch Reference [6.5] | Elastic
最後に
リアルタイム性は無いですが、運用するコストがほとんどないのでとても楽にログの可視化が出来ます。
ただ、可視化することがゴールではなく、可視化して分析して次に繋げるが最終的な目的になります。
これからのエンジニアは分析能力も問われてくるってことですね!
\\一緒に『明日のはたらくを創る』仲間を募集中です!! //
919.jp