はじめに
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 の各パラメータについて確認していきたいと思います。