📝

GCPのLog SinkとBigQueryを連携するterraformを書く

2023/10/04に公開

意外とあっさりできたけどサンプルとかがなかったので忘備録を兼ねて書いておこうと思う

やりたいこと

アクセスログのうち、一定の条件を満たす一部のログをBigQueryに転送する。
サーバの実行環境に転送処理を置くと転送処理が事故ったりしたときに他に影響が及ぶ可能性があったり、あるいは他のトラブルが転送処理に影響する可能性があるので独立しておきたい

よって方法としては

  • 標準ログ出力をCloud Loggingで拾う(普段のログの扱いと同じ)
  • 上記の条件を満たしたものをログルーター・ログシンクを用いてBigQueryに直接転送する

という手段を取った

前提条件

  • 実行環境 : Cloud Run
  • ログ形式 : 適切な構造化ログ

設定

terraform

以下のように各種設定を行う

terraform
# ログ集積用データセット
resourece "google_bigquery_dataset" "log_dataset" {
  dateset_id = "log_dataset"
  description = "ログ集積用データセット"
}

# ログ転送シンク設定
resourece "google_logging_project_sink" "log_to_bigquery" {
  name = "log-to-bigquery-sink"
  destination = "bigquery.googleapis.com/${google_bigquery_dataset.log_dataset.id}"
  filter = "ここに適宜フィルターを書く"
  unique_writer_identity = true
  bigquery_options {
    use_partitioned_table = true
  }
}

# ログのBigQueryへの書き込み権限
resourece "google_bigquery_dataset_iam_member" "add_write_role" {
  dataset_id = google_bigquery_dataset.log_dataset.dataset_id
  role = "roles/bigquery.dataEditor"
  member = google_logging_project_sink.log_to_bigquery.writer_identity
}

ざっくり解説すると各コメント等のとおりなのだが、

  • データセット設定
    • 書き込み用のデータセット。既存のものでも良いがログを集積するなら新規に作ったほうがいいと思う
  • ログシンク設定
    • フィルターは次の項に書くが、要はCloud Loggingで検索時に書くものをそのまま書けばいい
    • 対象テーブルの指定方法は少し特殊(bigquery.googleapis.com/から始める必要がある
    • unique_writer_identity は書き込み用のサービスアカウントを専用のものを使うかという設定。必須ではない(詳しくはドキュメント
    • bigquery_options はBigQueryに対する設定で、現在は use_partitioned_table しかない。このオプションはテーブルの日付パーティションを有効にするかどうか。有効にすると勝手にパーティション分割テーブルにしてくれる
  • 書き込み権限設定
    • 必須。これがないと書き込み権限エラーが起きる。私は最初やらかした

全てうまくいくとテーブルは対象のログが入ってくるだけで勝手に作られる。あとはよしなに分析して使いましょう

cloud loggingのフィルター

おまけ。とはいえ詳しくは公式ドキュメント等を読んでねとなるが使ったのは以下の感じ

  • resourece.type="cloud_run_revision"
    • Cloud Runでのログ
  • resourece.labels.service_name="service name"
    • labelを設定しておくことで簡単にフィルターを掛けられる
  • jsonPayload.message="filter key word"
    • フィルターにかけるときのテキスト。この他、jsonPayload下の要素は構造化ログをきちんと作れば様々なフィルターとして機能する
    • ログ出力は基本

Cloud loggingのログエクスプローラーに入力するとそのままお試しできるのでそこで試すのもよし。何ならリソース関係はコンソールをポチポチやってたら勝手にクエリが入るのでそれを使うのも十分あり

参考資料

Discussion