まちいろエンジニアブログ

南池袋のWebサービス開発会社、株式会社まちいろのエンジニアブログです。

Amazon Kinesis Firehose + Elasticsearch + fluentd でログ収集を試してみる

AWS Summit でのアナウンス通り、本日から Amazon Kinesis Firehose が東京リージョンで利用可能となりました。

Amazon Kinesis Firehose is now available in Asia Pacific (Tokyo), EU (Frankfurt), and US East (Ohio) regions

さっそく Firehose を使いながら、Elasticsearch を組み合わせたログ収集構成を試してみたいと思います。

前提

Firehose ストリームの作成

まずは Amazon Kinesis のページから、[Firehose コンソールに移動] ボタンをクリック。

f:id:mkudo-machiiro:20170825173728p:plain

続けて [Create Delivery Stream] ボタンをクリック。

f:id:mkudo-machiiro:20170825173744p:plain

[Delivery stream name] に好きな名前を入力、[Choose source] は Direct PUT or other sources を選択します。

f:id:mkudo-machiiro:20170825173757p:plain

Firehose では Lambda でストリームに流れレコードを加工したりできます。今回は Lambda を使わないので Disabled を選択します。

f:id:mkudo-machiiro:20170825173819p:plain

[Destination] は Amazon Elasticsearch Service を選択します。すると、ES のドメインやインデックスに関する設定が出てきますので、各項目入力していきます。

なお、[Index rotation] の設定に応じて、インデックス名のサフィックスが自動的に付与されます。 例えば [Index rotation] に Every day を選択すると、実際に作成されるインデックス名は インデックス名-YYYY-MM-DD という形式となります。

f:id:mkudo-machiiro:20170825173849p:plain

[S3 Backup] で All records を選択することで、全てのログが S3 にバックアップされます。 続けて転送先となる S3 バケット名、プレフィックスを指定していきます。

S3 に転送される際、{プレフィックス名}YYYY/MM/DD/HH という形式でフォルダが自動的に作成されます。そのため、プレフィックス名でフォルダを切りたい場合は末尾にスラッシュ (/) を入れておくと良いです。

f:id:mkudo-machiiro:20170825174233p:plain

次に転送時のバッファリングの設定を行います。通常はデフォルトのままで問題ないですが、必要に応じてチューニングしましょう。

最後に IAM ロールを作成または選択して完了です。

f:id:mkudo-machiiro:20170825173939p:plain

fluentd で Firehose に転送する

ログの転送に fluentd を使います。まずは td-agent と firehose 用のプラグインをインストールします。

fluent-plugin-kinesis-firehose というプラグインもありますが、現在は非推奨のようなのでご注意ください。

$ curl -L https://toolbelt.treasuredata.com/sh/install-redhat-td-agent2.sh | sh
$ td-agent-gem install fluent-plugin-kinesis
$ chkconfig td-agent on

次に td-agent の設定を行います。

<source>
  @type tail
  path /path/to/path/access.log
  pos_file /tmp/access.log.pos
  format json
  time_format %Y-%m-%dT%H:%M:%S%z
  time_key time
</source>

<match **>
  @type kinesis_firehose

  region ap-northeast-1
  delivery_stream_name firehose_stream_name
  flush_interval 1s
  include_time_key true
</match>

最後に td-agent を起動して完了です。設定に問題がなければ、S3 にファイルが転送され、ES にドキュメントが追加されていきます。

$ service td-agent start

Firehose コンソールからもグラフで確認できます。

f:id:mkudo-machiiro:20170825174628p:plain

S3 に転送されるファイルについて

Firehose から S3 への転送量削減のため、転送時に gzip 等に圧縮させる事が可能ですが、このファイルを S3 からダウンロードすると中身が展開された状態で落ちてきます。ダウンロードファイル名は *.gz のままなので、なぜか解凍できないと変なところでハマりました。。