BigQuery 他人の作った temporary table の中身を見たい
通常は見れない
roles/bigquery.admin があってもダメ
アプリケーションから当時実行したクエリの結果がなんかおかしいんじゃないか、というのを調査したい
temporary table はクエリ実行から 24h 残る
(クエリ自体を再実行はしたくない & 再実行の結果はおかしくなくて当時の結果を見たい、という場合)
元のユーザの権限で temporary table をコピーしてもらう
temporary table も実体は普通のテーブルなので、名前がわかればコピーもクエリもできる
名前を調べる
1. コンソール
https://gyazo.com/d5375844c314e3486028f726159f3539
Access Denied: Dataset PROJECT_ID:....: User does not have permission to access results of another user's job のエラーでは、データセット名までしかわからない
上のテーブル名とくっつける
pokutuna-playground:_dbbc4dd92f3794e9df428dad72abd7b0b631c58d.anonfa37f37a273c1b3333e4d0271da08e4ce769ac0e
https://gyazo.com/02b09f7c6700ad8fdbf5cdd803a708cc
この一時テーブルのリンク先は、access denied だけど、エラーページや URL からテーブル名は分かるので、データセット名とくっけるとクエリできる
2. Logging
jobCompleted なログに情報がある
resource.type="bigquery_resource" AND protoPayload.methodName="jobservice.jobcompleted" などで検索
protoPayload.serviceData.jobCompletedEvent.job.jobConfiguration.query.destinationTable に一通り入っている
https://gyazo.com/16f2a8de77c19f3637982afa1e3a49e2
temporary table が本人にしか参照できないのはどうしようもないので、該当ユーザで一時テーブルをコピーする
アプリケーションなら実行サービスアカウント
Workload Identity のついた k8s クラスタからなら
$ kubectl run -it --rm --image=gcr.io/cloud-builders/gcloud --restart=Never --serviceaccount=app gcloud-debug --command -- /bin/bash
--serviceaccount= はk8s 上の service account 名
$ bq query --use_legacy_sql=false --destination_table='{みんなの見える宛先テーブル}' 'SELECT * FROM {一時テーブル}'
必要なら --time_partitioning_field なども
bq コマンドからなら
頻繁に調査が必要になるなら、宛先テーブルを予め設定しておいて有効期限を設定して消えるようにしておく