背景
BigQueryのスケジュールクエリを個人の認証情報で実行している場合、退職などで認証情報が無効になると、クエリの実行が停止することになります。
そのため認証情報の見直しとサービスアカウントへの切り替えを検討していましたが、スケジュールクエリの設定画面では変更が反映されず、データ転送側での変更もうまくいかなかったため、調査メモを備忘録として残しておきます。
ポイント
スケジュールクエリの認証情報をサービスアカウントに切り替える際のポイントは以下の通りです。
- スケジュールクエリの設定画面ではサービスアカウントに変更できない。
- DDLで宛先テーブルを指定していない場合、データ転送側から変更できる。
- DDLで宛先テーブルを指定している場合、データ転送側の変更ではエラーが発生するため、BQコマンドを使用する必要がある。
スケジュールクエリの設定画面からは変更できない
この画像のようにスケジュールクエリの設定画面にはサービスアカウントを選択するUIがありますが、ここで選択しても反映されません。つまり、機能していません。
Cloudコンソール上で認証情報をサービスアカウントに変更することは仕様上不可能のようです。
スケジュールされたクエリで使用される認証情報をサービス アカウントに変更する操作は、Google Cloud コンソールではサポートされていません。
データ転送側から設定できそう?
スケジュールクエリは「データ転送」の一部であるため、データ転送側からサービスアカウントへの変更が可能かもしれません。
データ転送の設定項目
設定項目ではサービスアカウントを指定できますが、スケジュールクエリの設定画面と異なりデータセット名が必須項目です。
私の場合DDLで CREATE OR REPLACE TABLE
を使用していたので同じデータセットを指定しましたが、以下のエラーが発生しスケジュールクエリが無効になりました。(設定を削除し新たに設定し直す必要がありました)
エラーメッセージ
Dataset specified in the query ('') is not consistent with Destination dataset DATASET_ID
どうやらデータ転送から設定すると「クエリ結果の宛先テーブルを設定する」が強制的に有効になるようです。
そしてこの設定は無効にすることができず、DDL文を含んだスケジュールクエリの場合には壊れてしまいます。
DDLがなければ更新可能
CREATE TABLEを含まない(宛先テーブルの指定のない)SQLではサービスアカウントへの切り替えが可能でした。
解決策:bq コマンドで変更
とういわけでCloudコンソール側だけではどうにもならなかったので、Cloud Shellを用いてbqコマンドで変更します。
スケジュールクエリの一覧を確認
以下のコマンドで設定されているスケジュールクエリの一覧が確認できます。
※LOCATIONは任意のロケーションを指定してください。
bq ls --transfer_config --transfer_location=LOCATION --filter='dataSourceIds:scheduled_query'
認証情報をアップデート
bq update
で任意のサービスアカウントと転送IDと指定します。
bq update \
--transfer_config \
--update_credentials \
--service_account_name=hogehoge@fugafuga.iam.gserviceaccount.com projects/XXXXX/locations/asia-northeast1/transferConfigs/YYYYY \
転送構成の確認
無事サービスアカウントに切り替わっていました。めでたしめでたし。