タイトル通りですが、「RailsでユーザーのアクセスログをFluent::Loggerで埋め込んでFluentd経由でBigQueryに送ってRe:dashで参照できる環境を作った際に詰まったところのメモ」です。
手順メモ
Rails側
Fluent::Loggerを使っている部分のコードはこんな感じで、application_controller.rbでフィルタを使って呼んでます。
(実際はもう少しいろいろな情報をのせてますが、簡略化のため省略しています)
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)があるので,ありがたく使わせてもらいました。
設定ファイルの該当箇所はこんな感じです。
<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 が発表されてるのでそっちをやったほうが良かったのかなー感もちょっとあります。
またそのうちやれたらいいな。