🎅

BigQueryの未実行クエリは復活できる

2021/12/14に公開

そう、Cloud Audit Logs ならね。
本記事は、BigQuery Advent Calendar 2021 の 14日目の記事です。
https://qiita.com/advent-calendar/2021/bigquery

皆様がBigQueryを日々活用されるなかで、こんなことでお困りではありませんか?

BigQueryの書き途中のクエリが消えた!ページ更新した・されてしまった!

そんなときでも、Cloud Audit Logsで監査ログ生成をしていれば安心です。本記事では、Cloud Audit Logsの概要と、実際に実行前のクエリを復活させる方法を紹介します。

Cloud Audit Logsとは?

要はGoogleCloudサービスの監査ログを生成してくれるサービスです。
https://cloud.google.com/logging/docs/audit?hl=ja

もちろんBigQueryの監査ログも生成できます。またBigQueryの監査ログは自動的にCloud Loggingへと転送されるので、コンソール画面から実行ログをすぐ確認できます。
https://cloud.google.com/bigquery/docs/reference/auditlogs?hl=ja#ids

さらにSDKを用いて gcloud logging sinks createすれば、BigQueryの任意のデータセット配下に、日付別シャーディングテーブルもしくはパーティション分割テーブルの形式でニアリアルタイムに転送することも可能です。
https://cloud.google.com/logging/docs/export/bigquery?hl=ja

どうやって復活させるのか?

要は、監査ログが生成されているので、あとはCloud LoggingかBigQueryテーブルを見にいくだけです。

皆さんがクエリを書かれている最中に、常にBigQueryがdryrunしてチェックしてくれますよね。実はこのときも監査ログが生成されていて、すぐにCloud Loggingに転送されています。

クエリを失った本人にCloud Loggingの閲覧権限があるときは、あとはログエクスプローラにてBigQueryのリソースタイプを指定して、下記のフィールドを見にいけば確認できます。

protoPayload.serviceData.jobInsertRequest.resource.jobConfiguration.query.destinationTable.query

↓のようにdryrunの情報が保存されています。あとはコピペすれば復活です。

またクエリを失った本人にCloud Loggingの閲覧権限がないときは、上述のsinkを設定していれば、BigQueryテーブルから復活できます。下記がsinkを設定したデータセットに対して実行するクエリの一例です。メールアドレスや失ったクエリの一部などをWHERE文に指定すると、より見つけやすいです。

select   
  timestamp
  , protopayload_auditlog.authenticationInfo.principalEmail
  , protopayload_auditlog.servicedata_v1_bigquery.jobInsertRequest.resource.jobConfiguration.query.query	
from 
  `myproject.sink_dataset.audit_20211214` 
where
    protopayload_auditlog.authenticationInfo.principalEmail like '%my-email@gmail.com%'
order by
  timestamp desc
limit 
  10

もしも読者の方がデータの民主化をされているのであれば、このクエリを論理テーブル保存しておくと、社内のBigQueryユーザーからとても重宝されると思います。
※監査ログテーブルは閲覧制限した方が良いので、行レベルのセキュリティや、authorized viewを用いることをお勧めします。

という訳で、BigQueryの未実行クエリは復活できます。
この記事を読まれた皆さんの安心感が増せば幸いです。今年もお疲れ様でした。

Discussion