hero_picture

td-agentにてAWSのRDS(postgres)のログをTDに送信

AWSのRDSはLinuxサーバではない為、こちらからいろいろな設定ができません。

その為、どのようにPostgresのログを送信すればよいか、いろいろ試行錯誤したのでその備忘録です。

前提として、RDSに接続できるLinuxインスタンスにtd-agentが入っている状態が必要です。

fluent-plugin-rds-pgsql-log

https://github.com/shinsaka/fluent-plugin-rds-pgsql-log

RDSのpostgresのログを取得するには上記のプラグインを利用します。

このプラグインはAWS RDSのログを取得し、td-agentのsourceとして利用できるようにするプラグインです。

ただ導入にあたり、依存関係に「AWS SDK」があるのですが、パッケージで導入したtd-agentでは

fluentd-gem fluent-plugin-rds-pgsql-log にて導入ができませんので、以下のように導入します。

まず、td-agentに入っているrubyからaws-sdkをインストール

1/usr/lib64/fluent/ruby/bin/gem install aws-sdk
2

fluent-plugin-rds-pgsql-logのプラグインを直接プラグインディレクトリにほおりこむ

1wget https://raw.githubusercontent.com/shinsaka/fluent-plugin-rds-pgsql-log/master/lib/fluent/plugin/in_rds_pgsql_log.rb -P /etc/td-agent/plugin
2

これでpostgresのログをTDに送信できました。

1<match td.postgres.log>
2type tdlog
3apikey *****************************
4auto_create_table
5database postgres
6table log
7buffer_type file
8buffer_path /var/log/td-agent/buffer/td
9flush_interval 180s
10</match>
11<source>
12  type rds_pgsql_log
13  region ap-northeast-1
14  db_instance_identifier prod-auth
15  access_key_id ******************
16  secret_access_key *********************************
17  refresh_interval  30
18  tag td.postgres.log
19  pos_file /var/log/td-agent/pgsql-prod-auth-log-pos.dat
20</source>
21

こんな感じのデータが送信されます

1{"message_level"=>"LOG", "time"=>"1436510427", "ident"=>"postgres", "host"=>"10.0.0.21(22112)", "database"=>"[unknown]", "user"=>"[unknown]", "pid"=>"6080", "log_file_name"=>"error/postgresql.log.2015-07-10-00", "message"=>"  connection received: host=10.0.0.21 port=53253"}
2

host部分がSQL発行元IPになる

管理の上ではhost部分はRDSの名前になっているのが望ましいので、host部分を強制的に変更します。

データをリフォームする為に「fluent-plugin-record-reformer」というプラグインを利用しました。

https://github.com/sonots/fluent-plugin-record-reformer

1wget https://raw.githubusercontent.com/sonots/fluent-plugin-record-reformer/master/lib/fluent/plugin/out_record_reformer.rb -P /etc/td-agent/plugin
2

最終的なtd-agent.confは以下のようになりました。

1<match td.postgres.log>
2type record_reformer
3renew_record false
4enable_ruby false
5tag reformed.td.postgres.log
6# 強制的に文言を変更する
7host rds-postgres01
8ident postgres
9</match>
10<match reformed.td.postgres.log>
11  type tdlog
12  apikey *****************************
13  auto_create_table
14  database postgres
15  table log
16  buffer_type file
17  buffer_path /var/log/td-agent/buffer/td
18flush_interval 180s
19</match>
20<source>
21  type rds_pgsql_log
22  region ap-northeast-1
23  db_instance_identifier prod-auth
24  access_key_id ******************
25  secret_access_key *********************************
26  refresh_interval  30
27  tag td.postgres.log
28  pos_file /var/log/td-agent/pgsql-prod-auth-log-pos.dat
29</source>