Amazon Kinesis Firehose + Elasticsearch + fluentd でログ収集を試してみる
AWS Summit でのアナウンス通り、本日から Amazon Kinesis Firehose が東京リージョンで利用可能となりました。
さっそく Firehose を使いながら、Elasticsearch を組み合わせたログ収集構成を試してみたいと思います。
前提
Firehose ストリームの作成
まずは Amazon Kinesis のページから、[Firehose コンソールに移動] ボタンをクリック。
続けて [Create Delivery Stream] ボタンをクリック。
[Delivery stream name] に好きな名前を入力、[Choose source] は Direct PUT or other sources
を選択します。
Firehose では Lambda でストリームに流れレコードを加工したりできます。今回は Lambda を使わないので Disabled
を選択します。
[Destination] は Amazon Elasticsearch Service
を選択します。すると、ES のドメインやインデックスに関する設定が出てきますので、各項目入力していきます。
なお、[Index rotation] の設定に応じて、インデックス名のサフィックスが自動的に付与されます。
例えば [Index rotation] に Every day
を選択すると、実際に作成されるインデックス名は インデックス名-YYYY-MM-DD
という形式となります。
[S3 Backup] で All records
を選択することで、全てのログが S3 にバックアップされます。
続けて転送先となる S3 バケット名、プレフィックスを指定していきます。
S3 に転送される際、{プレフィックス名}YYYY/MM/DD/HH
という形式でフォルダが自動的に作成されます。そのため、プレフィックス名でフォルダを切りたい場合は末尾にスラッシュ (/
) を入れておくと良いです。
次に転送時のバッファリングの設定を行います。通常はデフォルトのままで問題ないですが、必要に応じてチューニングしましょう。
最後に IAM ロールを作成または選択して完了です。
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 コンソールからもグラフで確認できます。
S3 に転送されるファイルについて
Firehose から S3 への転送量削減のため、転送時に gzip 等に圧縮させる事が可能ですが、このファイルを S3 からダウンロードすると中身が展開された状態で落ちてきます。ダウンロードファイル名は *.gz
のままなので、なぜか解凍できないと変なところでハマりました。。