fluent-plugin-s3と大体互換なfluent-plugin-gcsの紹介


全国のGCSのファンの皆さんこんにちは。今日は皆さんお待ちかねのFluentプラグインを紹介したいと思います。

私はAWS・GCP等のクラウドサービスの中でも、一二を争うくらいにオブジェクトストレージが好きです。オブジェクトストレージはクラウド上でシステムを構築する上で要となる、とても重要なコンポーネントだと思っているからです。

S3には fluent-plugin-s3 というFluent公式でサポートされている便利なプラグインがあり、AWSでFluentを使用しているのであれば使ったことがある人も多いと思います。只、GCSには現状だといくつかプラグインが存在しているのですが、GCPの進化が早いため複数のアカウント認証にちゃんと対応出来ていなかったり、fluent-plugin-s3ほど機能が充実しているわけでは無かったりと、デファクトとなるプラグインがまだない状態だと思います。(私が見つけられなかっただけならごめんなさい )

今回、仕事でGCPをガッツリと使う機会が出来たので、基本的な機能はfluent-plugin-s3互換で、且つGCSの機能も出来るだけ取り入れたFluentプラグインを作ったので紹介します。

fluent-plugin-gcs

<match pattern>
  @type gcs

  project YOUR_PROJECT
  keyfile YOUR_KEYFILE_PATH
  bucket YOUR_GCS_BUCKET_NAME
  object_key_format %{path}%{time_slice}_%{index}.%{file_extension}
  path logs/
  buffer_path /var/log/fluent/gcs

  time_slice_format %Y%m%d-%H
  time_slice_wait 10m
  utc
</match>

基本的な機能に関しては、ほとんどS3プラグインと互換性があります。各種設定に関してはREADME.mdを参照してくださいませ。

  • bucket
  • store_as
  • path
  • object_key_format
  • format
  • auto_create_bucket
  • overwrite
  • acl

認証

project
GCSのプロジェクトIDです。これらは以下の順番に検索されます。

  • 設定で指定したproject
  • 環境変数 STORAGE_PROJECT, GOOGLE_CLOUD_PROJECT, GCLOUD_PROJECT
  • GCE credentials

keyfile
GCSをプログラムから使う上での認証方式は幾つかあるのですが、下記3つに対応しています。p12キーによる認証は非推奨となっているのでサポートしていません。

  • JSON key 形式
  • Cloud SDK
    • gcloud auth loginを実行した際に~/.gcloudの中に生成される認証ファイルを読み込みます
  • GCE credentials
    • GCE上で権限があれば、鍵の設定が要らない奴でapplication_defaultなどと呼ばれています

各種認証情報は、以下の順番に検索されます。

  • 設定で指定したkeyfile (ファイルパス)
  • 環境変数(ファイルパス) GOOGLE_CLOUD_KEYFILE, GCLOUD_KEYFILE
  • 環境変数(JSON) GOOGLE_CLOUD_KEYFILE_JSON, GCLOUD_KEYFILE_JSON
  • Cloud SDKの認証ファイル
  • GCE credentials

GCEやGKE(Docker image)上で動かす場合には、特に何も設定しない形で問題ないと思います。

固有機能

GCSの固有機能に関しても幾つか対応しています。

transcoding
GCSにはgzip圧縮ファイルのトランスコーディングという機能があります。具体的には、gzip圧縮されたファイルを、Content-Encoding: gzipでアップロードすることで有効となり、ファイルをダウンロードする際にGCS上でファイルが解凍されてダウンロード出来るようになります。また、詳細は公式を見てもらうと良いと思うのですが、設定でstore_asをgzip、transcodingをtrueにすることでこの機能が有効になります。

encryption_key, encryption_key_sha256
GCSにデータを保存する際にGCSサーバー上で暗号化処理が行われているのですが、そのkeyをこちらで指定することが出来ます。注意する点としては、暗号化キーをユーザー指定でオブジェクトを保存した場合、ダウンロードする際にも同じキーが必要になります。こちらも設定から指定することで、ログのアップロード時に有効になります。

ObjectMetadata
オブジェクトに対してメタデータを付与することが出来ます。これらのデータはコンソール上か又は、レスポンスヘッダーのx-goog-meta-で返却されます。

<match *>
  @type gcs

  <object_metadata>
    key KEY_DATA_1
    value VALUE_DATA_1
  </object_metadata>

  <object_metadata>
    key KEY_DATA_2
    value VALUE_DATA_2
  </object_metadata>
</match>

fluent-plugin-forestでタグ情報を埋めるなどするともしかしたら何かユースケースがあるかもしれません。

TODO

残念ながら、内部で使用しているRubyのgoogle-api-clientの関係上、今はファイル単位でのストレージクラスの設定が出来ません。バケットのストレージクラスが有効になるので、もし変更したい場合には事前にバケットを作成しておいたほうが良いと思います。

おわり

ということで簡単にですが、GCSのFluentプラグインについて紹介させてもらいました。ユースケースとしては単にログの保存や、1分単位でGCSにログを転送して、1時間単位でBigQueryにロードするなど色々な所で使っていく予定です。最初はStackdriverを使用することも考えたのですが、データ量の制限や汎用性、有料化などがあるので今回はFluentで実現することにしました。しばらくは本番環境でガンガン使っていく予定なので、是非使ってみてフィードバックなど貰えると嬉しいです