FluentdでS3にログを収集してみる

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、坂巻です。

今回は、ログ収集に関するエントリです。

AWSでログ収集といえば、CloudWatch Logsが挙げられますが、
今回はオープンソースのログ収集管理ツールFluentdを使用してみたいと思います。

最終的には他サービスを使用して、収集したログの可視化や分析してみたいと思いますが、
本エントリではS3にログが出力されるまでをゴールとします。

目次

  • 構成
  • 構築
    • AWS環境
    • Fluentdインストール
    • Fluentd設定
  • ログ確認
  • さいごに

構成

以下のシンプルな構成です。  

aws

構築

AWS

AWS環境の構築はCloudFormationのテンプレートを用意したので割愛します。

上記テンプレートを利用してAWS環境を構築する際は、
スタックのパラメータに以下を設定してください。

  • KeyPairName…EC2インスタンスにログインするキーペアを指定します。
  • S3BucketName…作成するバケット名を指定します。
  • SecurityGroupCidrIp…EC2にSSHでアクセスするCIDRを指定します。

なお、CloudFormationの利用方法がわからない方は、こちらのページを確認ください。

CloudFormation入門-AWSの構築を自動化しよう-

Fluentdインストール

インストールはワンライナーで行えます。
起動したEC2で以下のコマンドを実行します。

curl -L https://toolbelt.treasuredata.com/sh/install-amazon1-td-agent3.sh | sh

Installing Fluentd Using rpm Package

Fluentd設定

入力、出力の設定は/etc/td-agent/td-agent.confに記述していきます。

fluentdが何を受け取るか入力元の指定は<source>ディレクティブで行います。
今回はsyslogを監視したいため、以下のように設定しました。

<source>
  @type tail
  path /var/log/messages
  tag td.messages.access
  pos_file /var/log/td-agent/messages.pos
  format syslog
</source>
  • type…入力プラグインを指定します。ここではtailを指定しています。
  • path…入力対象のファイルを指定します。
  • tag…ログにつけるタグを指定します。
  • pos_file…最後に読み込んだファイルの位置をこのファイルに記録します。
  • format…パーサプラグインを指定します。ここではsyslogを指定しています。

Configuration File Syntax

Input Plugin Overview

<souce>ディレクティブの情報に対する出力処理は<match>ディレクティブで行います。
今回はS3へ出力したいので、以下のように設定しました。

<match td.messages.access>
  @type s3
  s3_bucket fluentd-test-20180421
  s3_region ap-northeast-1
  time_slice_format %Y%m%d%H%M
</match>

<souce>ディレクティブ内のtagで指定と一致させます。

  • type…出力プラグインを指定します。ここではs3を指定しています。
  • s3_bucket…S3のバケット名を指定します。
  • s3_region…S3のバケットのリージョン名を指定します。
  • time_slice_format…出力ファイルに追加される時間のフォーマット形式を指定します。ファイルに書き出すタイミングの指定と考えてもよさそうです。

なお、今回はEC2にIAMロールを付与しているので、アクセスキーは使用しません。

Amazon S3 Output Plugin

収集ログに対する権限エラーにならないように、
/etc/init.d/td-agentファイルの下記箇所をtd-agentからrootに変更します。

TD_AGENT_DEFAULT=/etc/sysconfig/td-agent
TD_AGENT_USER=root
TD_AGENT_GROUP=root
TD_AGENT_RUBY=/opt/td-agent/embedded/bin/ruby

設定を終えたらプロセスを再起動します。

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

ログがS3に出力されない等、想定した動作と異なる場合は、
/var/log/td-agent/td-agent.logを確認しましょう。

ログ確認

<match>ディレクティブで指定した、バケットにログが出力されていることが確認できました。

S3

ログの中身も確認してみます。

2018-04-22T04:08:56+00:00	td.messages.access	{"host":"ip-10-0-1-49","ident":"dhclient","pid":"2158","message":"XMT: Solicit on eth0, interval 125070ms."}

さいごに

次回は他のサービスを使い、収集したログを可視化や分析してみたいと思います。