kei0425tan’s blog

技術的なことを主に

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

お疲れ様でした。