fluentdに送信したログをBigQueryに出力

2020年1月22日

fluentdに送信したログをBigQueryに出力してみました。

fluent-plugin-bigquery」というFluentdのプラグインを利用します。
出力する方法は2パターンあり

  • ストリーミングインサート
  • データロード

BigQueryのデータロードはテーブルやプロジェクトあたりの上限があり向いていないため、 別途ストリーミング料金がかかりますがストリーミングインサートの方法を選択します。

BigQueryストリーミングインサート
https://cloud.google.com/bigquery/streaming-data-into-bigquery#usecases

前提

利用したバージョンは2019年11月時点の最新バージョンで試しています。

  • td-agent (1.7.0)
  • fluent-plugin-bigquery (2.2.0)
  • fluent-plugin-forest (0.3.3)

サービスアカウントの作成

FluentdがBigQueryにログを出力できるようにするためサービスアカウントを作成します。
作成したアカウントにBigQueryデータ編集者の権限を付与してあげます。
ここではキータイプは「JSON」で作成したものを利用します。

BigQueryのテーブル作成

fluent-plugin-bigqueryでは自動でテーブルを作成する機能もあるようですが、
今回は事前にテーブルを作成することとします。

Fluentdの設定でも利用するスキーマ情報が記載されたJSONファイルを作成します。

[
  {
    "name": "time",
    "type": "TIMESTAMP"
  },
  {
    "name": "body",
    "type": "STRING"
  }
]

テーブルは以下のbqコマンドで作成

bq mk --table test.log log.json

td-agent.confの設定

サービスアカウントのキーファイル、スキーマJSONを配置し、
td-agent.confの設定をします。

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match test.log>
  @type bigquery_insert
  auth_method json_key
  json_key /etc/td-agent/json_key/xxxxxxxxxx.json
  email xxxxxxxxxxxxx@xxxxxxxxxxxxxxxxxxxxxxxx.iam.gserviceaccount.com

  project gcp_project
  dataset test
  table log
  schema_path /etc/td-agent/schema/test/log.json

  <buffer>
    @type memory
    chunk_limit_size 1m
    total_limit_size 1g
    flush_thread_count 1
    flush_mode interval
    flush_interval 5s
    retry_max_times 5
  </buffer>

  <inject>
    time_key time
    time_type unixtime
    time_format %Y-%m-%d %H:%M:%S
    timezone Asia/Tokyo
  </inject>

</match>
サービスアカウントのキーファイルとスキーマJSONは権限の問題で一般ユーザーのホームディレクトリに配置し、td-agent.confにそのパスを設定してもうまくいきませんでした。
詳しく調べていませんが /etc/td-agent/以下にrootユーザーの権限で作成すれば正しく動作しました。

変更後はtd-agent再起動

systemctl restart td-agent

動作確認

fluent-catコマンドでFluentdにログを送信

echo '{"time":"2019-11-08 11:35:00","body":"1"}' | /opt/td-agent/embedded/bin/fluent-cat test.log

BigQueryの対象テーブルにレコードができました