FluentdでS3へログの出力設定のTips

2021/08/23に公開

はじめに

Fluentdを利用して、アプリケーションログをS3に保存し、Athenaで検索できるようにした時の対応メモです。
Fluentdの基本的なことには触れていないので、別記事を参照ください。

Fluentdのインストール用ansible

ansibleにて構成管理を行っているので、Ansible Galaxyから以下のroleを利用
https://github.com/ome/ansible-role-fluentd

EC2インスタンスプロファイル

S3へ出力する際の権限設定はIAMキーではなく、インスタンスプロファイルにて以下のポリシーを設定
https://github.com/fluent/fluent-plugin-s3/blob/master/docs/howto.md#iam-policy

s3_object_key_formatの設定

デフォルトのindexから uuid_flushに変更
https://www.greptips.com/posts/1300/

S3へのAPI増加はAmazon GuardDutyのコスト(AWS CloudTrail S3 データイベント分析)にも跳ねるので極力下げる
https://aws.amazon.com/jp/guardduty/pricing/

S3のpathはAthenaパーティション分割を考慮

S3のオブジェクトのパスはAthena利用時にパーティションを利用しやすい形式に設定

tg-agent.conf
  path ${tag[1]}/${tag[2]}/${tag[3]}/dt=%Y-%m-%d-%H/

Athenaパーティション射影にて自動でパーティション化

Athenaのパーティション利用時は、オブジェクト追加時も自動でパーティション管理されるようパーティション射影により設定
https://docs.aws.amazon.com/ja_jp/athena/latest/ug/partition-projection.html

CREATE EXTERNAL TABLE
TBLPROPERTIES (
  'projection.enabled' = 'true',
  'projection.date.type' = 'date',
  'projection.date.format' = 'yyyy-MM-dd-HH',
  'projection.date.range' = 'NOW-1MONTH,NOW',
  'projection.date.interval' = '1',
  'projection.date.interval.unit' = 'HOURS',
  'storage.location.template' = 's3://<S3 Bucket>/<S3 Path>/dt=${date}'
)

Discussion