fluentdでSSL通信とS3に置く設定


運用はじまって動いてるのでまあ大丈夫そうということで可能な範囲でタイトルどおりの備忘録を失礼します。

###構成

[S3]←syslog←[clients]→accesslog→[log-server]→[elasticsearch]
　　　　　　　　　　　　　　　　　↑←[external-log-server]←accesslog←[external-clients]

ざっくりいうとこんなかんじ。

###SSL関連の設定

```conf:td-agent-ssl-send（送るほう）
  <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>
```

```conf:td-agent-ssl-recv（受けるほう）
<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に置く設定

```conf: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ロールついてないとアクセスキーとか指定必須な模様です）

```conf:s3buketのポリシー抜粋
			"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](https://github.com/tagomoris/fluent-plugin-secure-forward)
[fluent-plugin-secure-forwardと戯れた話 | GREE Engineers' Blog](http://labs.gree.jp/blog/2015/12/15044/)
[fluentd-plugin-secure-forward のソースを読んでみる(Input プラグイン編) - ひつまぶし食べたい](http://www.hitsumabushi.org/blog/2014/12/17/2345.html)
[fluent-plugin-secure-forwardを試してみた - MakeitSmart!](http://makeitsmartjp.com/2013/02/fluent-plugin-secure-forward.html)
[fluentd 復習（2）〜 fluentd-plugin-secure-forward を利用したセキュアなログデータ転送〜 - ようへいの日々精進XP](http://inokara.hateblo.jp/entry/2015/03/10/095827)
[Amazon S3 Output Plugin | Fluentd](http://docs.fluentd.org/articles/out_s3)
[導入手順 - Fluentdにおけるログ運用 - Qiita](http://qiita.com/kenzan100/items/9891a24263de77af6f31)
[fluentd - fluent-plugin-s3 の hex_random プレースホルダー - Qiita](http://qiita.com/sonots/items/e3486765b5217c2a34ab)

###そのた
過程で出たエラーの記録。
[fluentd - flunetdでさいきん遭遇したエラーの記録 - Qiita](http://qiita.com/smallpalace/items/8a5dbb675c43e7448e5f)

chef的な苦労の記録。
[配列のなかに入れ子な複数のハッシュのdata_bagsのjsonをchefで扱うレシピ - Qiita](http://qiita.com/smallpalace/private/66e80df6de693779c224)