はじめに

Windows の WebサーバーをAWSに移行したタイミングで、これまでログサーバーに集約していた各サーバーのアクセスログ等も、Amazon S3 を保管先に変更しようということになった。従来、バッチスクリプトなどを駆使して、ログサイクルや、アップロードを行っていたが、いまどきっぽく Fluentd でサクッと出来ないかな、と思って検証した。

ゴール

ひとまず、Windows Server から fluentd で S3 にアップロードできるところまで。フォーマットや、バッファ、チャンクの検討は、とりあえず忘れる。

環境

  • Windows Server 2016 DataCenter(EC2)
  • fluentd v0.14(td-agent 3.0.1)

Windows fluentd 環境を導入

公式サイトから td-agent-3.0.1-0-x64-beta2.msi をダウンロードし、インストーラを起動。何も考えず「次へ」を連打しておけば入ります。

  • td-agent とは
    • fluentd を稼働させるために必要な Ruby インタープリターを含んだ安定版パッケージ、だそうです。

td-agent.conf の作成

C:¥opt¥td-agent¥conf¥td-agent.conf

<source>
  @type forward
</source>

<match test.**>
  @type stdout
</match>

[スタート] – [Td-agent] – [Td-agent Command Prompt] を開いて、以下のコマンドを実行する。

fluentd -c conf\td-agent.conf

別の Td-agent Command Promptを開いて、以下のコマンドを実行する。

C:\opt\td-agent>echo {“message”:”hello”} | fluent-cat test.event

先のコンソールに

test.event: {“message”:”hello”}

のようなメッセージが出ていればOK。

Windows サービスへ登録

Td-agent Command Prompt で以下のコマンドを実行する。

fluentd –reg-winsvc i
fluentd –reg-winsvc-fluentdopt ‘-c C:/opt/td-agent/conf/td-agent.conf -o C:/opt/td-agent/td-agent.log’

S3プラグインのインストール

使用するプラグインをインストールするため、Td-agent Command Prompt から以下のコマンドを実行する。

fluent-gem install fluent-plugin-s3 -v 1.0.0.rc2 –no-document
fluent-gem install fluent-plugin-forest

td-agent.conf に以下を追加

<source>
  @type tail
  path C:/Apache24/logs/access.log
  pos_file C:/Apache24/logs/access.log.pos
  tag s3.apache.access
  format none
</source>
<match s3.**>
  @type s3
  aws_key_id *******          # IAM アクセスキー
  aws_sec_key ********        # IAM シークレットキー
  s3_bucket fluentd-demo-xxx  # xxx は任意の数字
  s3_region ap-northeast-1
  s3_object_key_format %{path}%{time_slice}/%{index}.%{file_extension}
  path logs/
  time_slice_format %Y/%m/%d
    <buffer time>
      @type file
      path C:/Apache24/logs/fluent/s3
      timekey 360
    </buffer>
</match>

SSL証明書の配置

このままだと、いつまでたっても S3 へアップロードされなかった。おかしいな、、と思って、td-agent.log を確認したとろこ、S3 の API call 時に以下のようなエラーがでていました。

unexpected error error_class=RuntimeError error=”can’t call S3 API. Please check your aws_key_id / aws_sec_key or s3_region configuration. error = #

fluentdのプラグインでcertificate verify failedエラーが発生した話」などを参考にすると、どうやらSSL証明書の問題のようです。Td-agent Command Prompt で以下のコマンドを実行し、表示されたパスに証明書ファイルが存在するか確認する。

C:\opt\td-agent>ruby -ropenssl -e ‘puts OpenSSL::X509::DEFAULT_CERT_FILE’
/opt/td-agent/embedded/ssl/cert.pem

私の場合、ssl フォルダには存在しなかったが、c:/opt/td-agent/embedded/ssl/certs/cacert.pem があったので、コレをコピーして、cert.pem ファイルとして該当のパスに保存することで、エラーは解消されました。もし、certs ディレクトリにも無い場合は、cURLが提供しているルートCA証明書をダウンロードして試してみてください。

Windows サービスの起動

[サービス] – [Fluentd Windows Service] を起動する。対象となるログに追記されるようなアクションを実行。しばらくした後、AWSコンソールから S3 バケットを確認して、ファイルが存在していれば、とりあえずS3へのアップロードは正常に動作している。

今回の td-agent.conf の設定では、10分毎に S3 へアップロードする設定になっています。ひとまず確認が出来たので、不要であればサービスを停止しておきましょう。時間のあるときに、td-agent.conf の各パラメータについて確認していきたいと思います。