結論
fluent-plugin-bigquery を GCE 以外で使う場合、認証情報が必要だが、
- p12キーファイルはディスコンなので、JSON key の利用を推奨する
- JSON key 形式なら、fluentd の設定ファイルに秘密鍵を埋め込めて便利
設定サンプル
<match dummy>
type bigquery
auth_method json_key
json_key {
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"client_email": "xxx@developer.gserviceaccount.com"
}
</match>
解説
先日、fluent-plugin-bigquery に以下の Pull Request を出してマージしてもらった。
Support JSON key file and application default credentials authentication #50
この変更は fluent-plugin-bigquery の v2.1.12 に含まれていて、既に使える状態。
なぜ JSON key を利用することを推奨するのか
これは単純に Google が推奨しているから。現在、Developer Console で service account を作成すると以下の様な文言がでる。JSON が推奨、P12 形式は後方互換性のために残されていると。

JSON key にすると何が便利になるのか
P12 形式が非推奨とはいえ、しばらくは使える現状で、JSON key に切り替えるメリットはあるのかというと、あると思っている。
それは、JSON 形式にすると、秘密鍵の情報を fluentd の設定ファイル中に埋め込めるようになることである。
<match dummy>
type bigquery
auth_method json_key
json_key {
"private_key": "-----BEGIN PRIVATE KEY-----\n...",
"client_email": "xxx@developer.gserviceaccount.com"
}
</match>
この方式のメリットとしては、以下の2点があげられる。
- 秘密鍵ファイルの配置(どこのパスに配置するか、権限はどうするかなどに)悩まなくてすむ。
- 文字列として埋め込めるので、Ansible などの Provisioning ツールと相性が良い。以下のように変数にしておくことで、本番とステージングの切り替えが簡単にできたりする。実行時に変数の値を指定すれば、秘密鍵の内容をリポジトリにコミットしておく必要もなくなる。
<match dummy>
type bigquery
auth_method json_key
json_key {
"private_key": "{{ bq_private_key }}",
"client_email": "{{ bq_client_email }}"
}
</match>