dockerでfluentdを動かしてS3互換のidcfクラウドオブジェクトストレージにログを保存する
なかなか情報が見つからず、かなり苦労してしまいましたがうまくいったので記録しておきます。
idcfクラウドが月500円のため、現在利用しています。
www.idcf.jp
(しかも今なら3000円分の利用権が付いていて半年無料!)
準備
- dockerが動くこと
- docker-composeが動くこと
idcfクラウドの設定
現状では、東日本リージョンにしかオブジェクトストレージがありません。
コンピューティング(仮想マシン)がひとつもないと作成できなかった気がします。
コンソールにログインして、オブジェクトストレージを選択します。
その後、APIユーザを作成します。
「APIユーザ追加」をクリックして、ユーザ名を入力するだけです。
AWSと違って簡単ですね。
作成すると、「API Key」と「Secret Key」が表示されます。
ここで閉じてしまっても、またすぐに参照できるので安心してください。
必要なファイルの作成
以下のフォルダを作成します。
% mkdir fluentd-s3-idcf % mkdir fluentd-s3-idcf/plugins
以下のファイルを作成します。
- fluentd-s3-idcf/fluent.cnf
- fluentd-s3-idcf/Dockerfile
- docker-compose.yml
fluentd-s3-idcf/fluent.cnf
<source> @type forward @id forward_input port 24224 </source> <match **.**> type copy <store> type s3 aws_key_id "#{ENV['AWS_ACCESS_KEY_ID']}" aws_sec_key "#{ENV['AWS_SECRET_ACCESS_KEY']}" s3_bucket "#{ENV['FLUENTD_S3_BUCKET']}" # s3_region "#{ENV['FLUENTD_S3_REGION']}" s3_endpoint "#{ENV['FLUENTD_S3_ENDPOINT']}" signature_version s3 path logs/ buffer_path /var/tmp/s3 time_slice_format %Y%m%d-%H time_slice_wait 10m flush_interval 10s utc </store> <store> type stdout </store> </match>
aws s3用の設定は結構みつかるのですが、idcfクラウドの場合は、s3_endpointを指定しなければなりません。
さらに、signature_version s3を指定しないと以下のエラーが発生してアクセスできません。
2017-05-16 08:50:21 +0000 [error]: unexpected error error_class=RuntimeError error=#<RuntimeError: can't call S3 API. Please check your aws_key_id / aws_sec_key or s3_region configuration. error = #<Aws::S3::Errors::InvalidRequest: The authorization mechanism you have provided (AWS4-HMAC-SHA256) is not supported.>>
fluentd-s3-idcf/Dockerfile
FROM fluent/fluentd:onbuild RUN gem install fluent-plugin-s3
fluent/fluentd:onbuild
とタグを指定しないと、ONBUILDを利用していないimageになります。
これを指定することにより、fluentd.confとpluginsが自動的にADDされます。
pluginsは作成していないとエラーになるため、空で作成しておきます。
docker-compose.yml
fluentd: build: fluentd-s3-idcf environment: - AWS_ACCESS_KEY_ID=「APIユーザ作成時のAPI Key」 - AWS_SECRET_ACCESS_KEY=「APIユーザ作成時のSecret Key」 - FLUENTD_S3_BUCKET=「バケット名」 - FLUENTD_S3_ENDPOINT=https://ds.jp-east.idcfcloud.com container_name: fluentd ports: - "24224:24224"
バケット名は事前に作成してなくてもかまいません。
実行
ここまでくれば、あとは実行するだけです。
% docker-compose up -d
お疲れ様でした。