運用はじまって動いてるのでまあ大丈夫そうということで可能な範囲でタイトルどおりの備忘録を失礼します。
構成
[S3]←syslog←[clients]→accesslog→[log-server]→[elasticsearch]
↑←[external-log-server]←accesslog←[external-clients]
ざっくりいうとこんなかんじ。
SSL関連の設定
<store>
type forest
subtype secure_forward
<template>
self_hostname log-hoge-mng
shared_key hogehoge
secure yes
ca_cert_path /etc/td-agent/hogehoge.cacrt
# enable_strict_verification yes
buffer_path /opt/hogehoge/fluent_buf_ssl/__TAG__
buffer_queue_limit 512
buffer_chunk_limit 10m
buffer_type file
<server>
host log-ext1.mng.hogehoge.net # or IP
# port 24284
username user1
password xxxxxxxxxxxxxx
</server>
<server>
host log-ext2.mng.hogehoge.net # or IP
# port 24284
username user1
password xxxxxxxxxxxxxx
</server>
</template>
</store>
<source>
type secure_forward
shared_key hogehoge
self_hostname log2hoge-mng
# cert_auto_generate yes
secure yes
ca_cert_path /etc/td-agent/hogehoge.cacrt
cert_path /etc/td-agent/hogehoge.crt
private_key_path /etc/td-agent/hogehoge.key
private_key_passphrase
authentication yes # Deny clients without valid username/password
<user>
username user1
password xxxxxxxxxxxxxx
</user>
<user>
username user2
password yyyyyyyyyyyyyy
</user>
</source>
・clientタグでnetwork制限はSecurityGroupで送信元を絞るので使ってないです。
・証明書はつなぎにいくほうはcacertでうけるほうはservercertとkeyがいります(自己CA局でもうごく。クライアント認証はためしてない)。
・Route53で名前解決はしてるけどヘルスチェックはしてないです。ELBはセッションが切れるので使わなかったです。
・ユーザ認証の情報はdata_bagsに暗号化していれてchefで取り出して配ってます。
S3に置く設定
<store>
type forest
subtype s3
<template>
s3_bucket hogehoge-mng-xx-xxxx-x-log
s3_region us-xxxx-x
check_apikey_on_start false
path mng/log2/%Y/%m/%d/direct/${hostname}/
buffer_type file
buffer_path /opt/log/tmp/buffer/s3/${tag}
buffer_chunk_limit 10g
retry_wait 30s
flush_at_shutdown true
format json
time_slice_format %Y%m%d-%H.log
s3_object_key_format %{path}${tag_parts[0]}_${tag_parts[1]}_%{time_slice}_%{index}
store_as gzip_command
</template>
</store>
・送るほうであて先がS3なのでbuffer_chunk_limit 10gとかになってる。
・%{index}
をつけないと名前がかぶって権限エラーで置けないとかなる。
・${tag_parts[?]}
の数はsourceのtagの数とあわせないと。
・先頭をハッシュにしないと遅い的なアレはまあ大丈夫だろうという話に。
・IAMロールよりVPCendpointのほうがユーザ制御いらなければ楽でいいかも。
(※おとどけ元インスタンスにIAMロールついてないとアクセスキーとか指定必須な模様です)
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetBucketLocation",
"s3:PutObject"
],
コツというか苦労話
・複数アカウント対応、SSLとユーザ認証対応と同時にversionアップ対応ともりだくさんで。
・S3のバケット権限が足らなかったエラー(たしかIAMロールにバケットに対するGetObjectが足らなかった)
・s3_object_key_formatにindexが足らなかったエラー
・td-agent1だとmatchタグのなかでincludeできなかった(送信先を複数回かくのヤダからincludeしたい)
・secure_forwardはELBを超えられないので直にいくしかない(たぶんSSLだから常時接続で接続確立時にかかる負荷を抑えたいからそうなってるものと思われるがELB側でタイムアウトして再度つなぎにいこうとしない動きでブチブチ切れたようになる)
・外部に送る側はバッファまわりの設定が必須(すてられちゃわないように)
・サーバ側でクライアント側のconfとプロセス制御したい気がして調べたけど納得いくやつがなくて
chefのレシピとデータ格納場所などがどんどん複雑なことに。
・time_slice_format が上記だと1時間おきにファイルが生成される。ログを即S3側で確認するという要望とファイル数を抑えるという要望を同時にかなえることは不可能。flush_interval 1sとすると即出力されるがファイルが1秒おきに別ファイルになりS3側のオブジェクト数が激増するのでS3に上げる場合にflush_intervalは検証時に使うだけにしたほうがいい。
参考サイト
tagomoris/fluent-plugin-secure-forward
fluent-plugin-secure-forwardと戯れた話 | GREE Engineers' Blog
fluentd-plugin-secure-forward のソースを読んでみる(Input プラグイン編) - ひつまぶし食べたい
fluent-plugin-secure-forwardを試してみた - MakeitSmart!
fluentd 復習(2)〜 fluentd-plugin-secure-forward を利用したセキュアなログデータ転送〜 - ようへいの日々精進XP
Amazon S3 Output Plugin | Fluentd
導入手順 - Fluentdにおけるログ運用 - Qiita
fluentd - fluent-plugin-s3 の hex_random プレースホルダー - Qiita
そのた
過程で出たエラーの記録。
fluentd - flunetdでさいきん遭遇したエラーの記録 - Qiita
chef的な苦労の記録。
配列のなかに入れ子な複数のハッシュのdata_bagsのjsonをchefで扱うレシピ - Qiita