RailsでログをFluent::Loggerで埋め込んでBigQueryに送ってRe:dashで参照する手順メモ

タイトル通りですが、「RailsでユーザーのアクセスログをFluent::Loggerで埋め込んでFluentd経由でBigQueryに送ってRe:dashで参照できる環境を作った際に詰まったところのメモ」です。

手順メモ

Rails側

Fluent::Loggerを使っている部分のコードはこんな感じで、application_controller.rbでフィルタを使って呼んでます。 (実際はもう少しいろいろな情報をのせてますが、簡略化のため省略しています)

1
2
3
4
5
6
7
8
9
10
  def fluentpost
    if user_signed_in?
      user_id = current_user.id
    else
      user_id = 0
    end
    user_agent = request.user_agent || "No User Agent"

    Fluent::Logger.post("user.activity.log", {"user_id"=>user_id, "user_agent"=>user_agent})
  end

BigQuery側

Google Cloud Platform(GCP)に登録して,適当なプロジェクト作って,適当なデータセットを作って,BigQueryデータオーナーの権限を持ったサービスアカウントを作っておきます。 検索すればいっぱい記事引っかかると思うので省略で。。

Fluentd側

FluentdからBigQueryに入れるためのgem(fluent-plugin-bigquery)があるので,ありがたく使わせてもらいました。

設定ファイルの該当箇所はこんな感じです。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<match user.activity.log>
  type copy
  <store>
    @type bigquery
    method insert

    auth_method json_key
    json_key /etc/td-agent/your_key_name.json
    project your_project_name
    dataset your_dataset_name

    auto_create_table true
    table %Y_%m

    time_format %s
    time_field timestamp

    field_integer timestamp,user_id
    field_string  user_agent,log_name
    replace_record_key true
  </store>
</match>

json_key /etc/td-agent/your_key_name.jsonはBigQuery データオーナーの権限を持ったサービスアカウントの鍵をサーバー上に置いて,そのパスを指定しています。 (fluentd, bigquery で検索かけると******.p12という拡張子の鍵で認証しているコードがよく引っかかりますが,2017年1月現在の推奨は******.jsonでの認証とのことです)

replace_record_key true は,Fluent::Loggerを使うと自動で(?)付与されてしまう@log_name, @timestampというタグから@を削除する機能を使う設定です。参考:fluent-plugin-bigquery - test/plugin/test_out_bigquery.rb#L772 (BigQueryは英数字とアンダースコアしか使えないので,この設定しないとエラーが出るので注意です)

READMEのこの項目の説明にはsee examplesって書いてあるけど使ってる例がないっぽい?のでちょっと注意です。

Re:dash

Re:dash上でProjectIDと認証用のjsonファイルを入れる際に、Fluentdの設定で使ったjsonファイルを使いまわすとクエリが投げられないので,「BigQueryデータ閲覧者」と「BigQueryユーザー」の両方の権限を付与したサービスアカウントを新たに作成して,その認証ファイルを使用します。 (「BigQueryデータオーナー」はクエリの作成権限がない。参考:アクセス制御)

感想

Elasticsearch に送ってたログを、BigQueryにも送れるようになったんですが、 「BigQuery不安定だからS3にも送っておくべき」的な記事も見かけてて、 また最近Amazon Athena が発表されてるのでそっちをやったほうが良かったのかなー感もちょっとあります。

またそのうちやれたらいいな。