s3プラグインとaws elasticsearch serviceプラグインを、1つのfluent.conf内で使用した場合にエラーが発生し、Fluentdコンテナが起動しないという事案が発生した。
前提
今回、FluentdはDocker containerとしてECSクラスター上で動かしています。
環境情報
・fluentd v1.1.0
・fluentd-s3-plugin v1.1.1
(2018/03/15時点での最近バージョン)
・fluent-plugin-aws-elasticsearch-service v1.0.0
(2018/03/15時点での最近バージョン)
エラー内容
/usr/lib/ruby/2.3.0/rubygems/specification.rb:2287:in `raise_if_conflicts': Unable to activate aws-sdk-s3-1.8.2, because aws-sdk-core-2.11.14 conflicts with aws-sdk-core (~> 3) (Gem::ConflictError)
原因
どうやら2つのプラグインが、aws-adk-coreの異なるバージョン(v2,v3)を使用していることで、conflictを起こしてしまったらしい。
fluentd-s3-plugin → v3を使用
fluent-plugin-aws-elasticsearch-service → v2を使用
解決策
fluentd-s3-pluginのバージョンをv1.1.1からv1.0.0に変更
まとめ
fluentd-s3-plugin v1.0.0は、aws-sdk-core v2を使用しているため、上記の対応でconflictは解消しました。
今回調べて分かったことを以下に示します。
- fluent-plugin-s3 v1.1.1は、aws-sdk-core (~> 3)が要件
- aws-sdk-coreの2つのバージョンが同居していること自体は問題ない
- aws-sdk-coreの2つのバージョンが同居している状態で、S3プラグインか、Elasticsearchプラグインのどちらか一方を使用することは問題ない
- 上記の2つのプラグインの、インストールする順番を変えても問題は解決しない(同じエラーメッセージが吐かれる)
Fluentdを使用し、s3とaws elasticsearch serviceにログを転送することは、AWSを使用した場合のログ管理構成として、よくあるパターンであると思います。皆さんもお気をつけてください。