Stackdriver LoggingのBigQuery関連ログをBigQueryへエクスポートする方法


BigQueryのクエリ履歴を保存しておき、後々調査できるようにするために、Stackdriver LoggingのBigQuery関連ログをBigQueryにエクスポートする方法をまとめました。

BigQueryのデータセットを作成

Stackdriver Loggingからエクスポートしたログテーブルを格納するためのデータセットを作成しておきます。

シンクの作成

以下コマンドで、エクスポートするログエントリのフィルタとエクスポート先を設定するシンクを作成します。
下記コマンドではログのresource-typeをbigquery_resourceで絞っています。

gcloud logging sinks create <sink名> bigquery.googleapis.com/projects/<project-id>/datasets/<dataset> --log-filter='resource.type="bigquery_resource"'

シンクの確認

コンソール画面のオペレーションロギング → ログルーターからシンクが作成されたことを確認します。
また、シンクの詳細を表示し、writerIdentifyからサービスアカウントを表示し、コピーしておきます。

以下コマンドでも同様の確認ができます。

gcloud logging sinks list
gcloud logging sinks describe <sink名>

BigQueryのデータセットの権限設定

先ほど作成したデータセットへサービスアカウントが書込みをできるように権限設定を行います。
BigQueryのデータセットの権限設定画面で、先ほどコピーしたサービスアカウントを貼り付け、BigQueryデータ編集者とし、追加を行います。

テーブルにデータが書き込まれていることを確認

テーブルにデータが書き込まれるまで少し時間がかかります。
データが書き込まれたら、例として以下のSQLで、どのアカウントがどのクエリを発行したかを確認できます。

SELECT 
  protopayload_auditlog.authenticationInfo.principalEmail AS email,
  protopayload_auditlog.servicedata_v1_bigquery.jobCompletedEvent.job.jobConfiguration.query AS query
FROM `<project-id>.<dataset>.cloudaudit_googleapis_com_data_access_20201012` LIMIT 1000

参考

BigQuery audit logs overview
ログビューアによるエクスポート
BigQueryでクソクエリを検知する
Stackdriver Loggingのログを失う前にエクスポートしておく方法