しがないインフラエンジニアLOG

インフラエンジニアとしての諸々

AmazonLinux2でFluentdとKinesisFirehoseを使ってS3に保存する方法(Fluentd→Kinesis編)

今回したこと

AmazonLinux2で出力されるログを、
KinesisFirehoseを経由してS3に保存しました。

f:id:ishimotty:20181024170327j:plain

なぜやろうとおもったか

今まで別途ログ収集サーバーを立てていたのですが、
以下の問題点がありS3にログをためる方向に移行しました。

CloudWatchLogsを使うことも考えたのですが、
ただ現状fluentdからElasticSeachにもデータを突っ込んでいるので断念しました。
*現時点ではCloudWatchLogsからElasticSearchはAWSのElasticSearchServiceへの転送しか対応していないので。

ちなみに直接FluentdからS3に上げる方法もあるのですが、 APIのコール回数が多くなるのでKinesisFilehoseで一旦集約しています。

現状の問題点

  • ログの管理が必要。
  • ログの消失リスク
  • ログ管理サーバーのスペック/ボトルネック

前提 / 準備

  • OS:AmazonLinux2
  • AWS:(Kinesis→S3編)の設定が完了していること(作成予定)

引用:(Kinesis→S3編)

0. 送信元IAM Role

送信元のEC2に付与しているIAM Roleに以下のポリシーが権限を付与します。

AmazonKinesisFirehoseFullAccess

1. fluentdインストール

以下のコマンドを実行してfluentdをインストールします。

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

引用:fluentd公式

2. fluentd起動設定

■ 起動ユーザーの変更
# vi /lib/systemd/system/td-agent.service
(変更前)
User=td-agent
Group=td-agent
(変更後)
User=root
Group=root

■ 設定の読み込み
# systemctl daemon-reload
# systemctl restart td-agent

■ fluentdの自動起設定
# systemctl enable td-agent.service
# systemctl list-unit-files -t service | grep td-agent

3. Kinesisプラグインのインストール

以下のコマンドを実行して、Kinesisプラグインをインストールします。

# td-agent-gem install fluent-plugin-kinesis

4. Kinesis用fluentd設定

以下の設定をfluentdに記載します。
*今回は試しに/tmp/test.logを使用します。
インターバルなどは各システムごとに最適化する必要あありますが、
とりあえず今回はAWSチームが参考に書いている値を記載。

■ テスト用のログファイル作成
# touch /tmp/test.log

■ kinesis用設定
# vi /etc/td-agent/td-agent.conf
<source>
  @type tail
  path /tmp/test.log
  pos_file /tmp/test_log.pos
  format none
  tag log.kinesis
</source>

<match log.kinesis>
  @type kinesis_firehose
  region ap-northeast-1
  delivery_stream_name test
  
  flush_interval 1  
  chunk_limit_size 1m
  flush_thread_interval 0.1
  flush_thread_burst_interval 0.01
  flush_thread_count 15
</match>

■ fluentd再起動
# td-agent --dry-run -c /etc/td-agent/td-agent.conf
# systemctl restart td-agent

引用:AWS GitHub

5. 動作確認

以下のコマンドを実行して、対象のログに追記します。
満足したら CTRL + C で中断しましょう。

# while true ;do echo `date` >> /tmp/test.log ;sleep 5;done

対象のS3にログが保存されているはずです。

最後に

とりあえずやりたかったfluentdからKinesisFirehoseを使用して、
S3にログを保存することができました。

Fluentdのログ送信間隔やFirehoseのBuffer conditionsなどのバッファーによるラグがあるので動作確認などが結構手間取るかと思います。

本当のリアルタイムログ収集は難しいですが、そこまでのリアルタイム性を求めないのであればS3の堅牢性を重視して十分な選択肢になるはずです。