CNCF(Cloud Native Commputing Foundation)でも ホスティングされているプロジェクト ということもあってログ集約というとfluentdを耳にすることがほとんどになってきた気がします。コンテナで「EFKスタック(Elastic Search + Fluentd + Kibana)を組んでみた」、というような記事もよく見ます。記事の通り進めていくと比較的さくっと集約したログを解析したり可視化することができます。

さて、コンテナのニュースはよく聞きますが、「Not コンテナ」なことのほうがまだまだ多いのが現実です。例えば、Windowsでログ集約をしたい。しかもfluentdを使いたい。というのも普通に要件として上がってくると思います。この記事では、Windowsでfluentdをセットアップするときに注意しておきたい点について紹介します。

td-agentが使えるかどうか

fluentdにはオープンソースとして Githubに公開している 素のfluentdと、Treasure Data社が配布しているtd-agentというものがあります。違いについては こちら で説明されていますが、端的に言いますと、td-agentは より安定した、しかもインストールしやすいfluentdです。これが使える環境であればこれを使うが吉です。
td-agentが使えるプラットフォームは こちら に記載されています。Windowsに関して言えば Windows Server 2012+ (64-bit) 以降でなければ td-agentのインストーラは使えません。それ以外の場合は頑張ってgemをソースからビルドして gem install しましょう。 fluentd windows gem みたいなキーワードで検索すれば丁寧な記事がいくつか見つかります。

S3へのログ集約のポイント

SS-2018-03-30-15.47.47
集約先はケース・バイ・ケースですが、S3へ集約する方も多いのではないかと思います。ここでハマりポイントがあります。

プラグインはビルトインじゃない

fluentdでS3にログを送る場合、まず必要になるのは fluent-plugin-s3 です。これは本家がメンテナンスしているプラグインで、 td-agentであればデフォルトで入っています。しかし、素のfluentdの場合これは別途 gem install する必要があります。

SSL証明書がWindowsに入っていない

いざこのプラグインを使おうと思ったときにおそらく以下のようなエラーに出くわすことになります。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (Seahorse::Client::NetworkingError)

ググってみるとこの問題に直面している方はちょくちょくいる気がします。AWSの 公式ドキュメント にも記載されていますが、有効な証明書がWindowsに最初からあるわけではないため、何かしら証明書を渡す必要が出てくるのです。そしてこういうときのためにAWSのruby SDKにはバンドルされている証明書を使えるように Aws.use_bundled_cert! というメソッドが用意されています。「これをfluent-plugin-s3が使っていてくれていたら。。。」と、なかばあきらめていたのですがリポジトリのPR見ていたら こんなの がありました。

Add use_bundled_cert parameter to use ruby-sdk-ruby bundled cert

ドキュメントされてないだけでオプションはちゃんとある!ということでこのオプションを使うことで無事S3にログを格納することができるようになります。ついでにドキュメントも 更新していただきました

SS-2018-03-30-15.32.41

設定例は下のようになります

<match pattern>
  @type s3

  aws_key_id YOUR_AWS_KEY_ID
  aws_sec_key YOUR_AWS_SECRET_KEY
  s3_bucket YOUR_S3_BUCKET_NAME
  s3_region ap-northeast-1
  use_bundled_cert true    # ←ここです

  path logs/${tag}/%Y/%m/%d/
  s3_object_key_format %{path}%{time_slice}_%{index}.%{file_extension}

  # if you want to use ${tag} or %Y/%m/%d/ like syntax in path / s3_object_key_format,
  # need to specify tag for ${tag} and time for %Y/%m/%d in <buffer> argument.
  <buffer tag,time>
    @type file
    path /var/log/fluent/s3
    timekey 3600 # 1 hour partition
    timekey_wait 10m
    timekey_use_utc true # use utc
  </buffer>
  <format>
    @type json
  </format>
</match>

© 2018. SuperSoftware Co., Ltd. All Rights Reserved.