BigQueryのデータセットの権限設定を別のデータセットにコピーする

背景

  • BigQueryの権限設定、Terraformなどを使ってIaCとして管理することが多い
    • しかし、様々な事情で手動で管理しなければいけないケースもたまにある
  • 個別のデータセットに対する権限付与の場合、Web Consoleからぽちぽちとやればよい
    • 「データセットAに対する権限と同じやつをお願いね!」となった場合、結構めんどい
    • 既存の権限が数十個のGoogleグループに付与などされているとぽちぽちするのは疲れる

やり方: bqコマンドとjqを組み合わせる

既存のデータセットに対する権限設定はbqコマンドでjson形式でひっこ抜けます。

jsonをjqコマンドで加工してあげて完成。

% jq -s add \
    <(bq show --format=prettyjson my-project:dataset_a | jq '{access: .access}') \
    <(bq show --format=prettyjson my-project:dataset_b | jq 'del(.access)') \
    > result.json
% bq update --source result.json my-project:dataset_b

その他の議論ポイント

データセットAとデータセットBに共通の閲覧権限を持たせたいという場合、Google Group側でメールグループを管理し、それに対しデータセットの権限付与をする、という形式もありかもしれない。具体的には

  • dwh-viewer-groups@my-project.com
    • my-group-a@my-project.com
    • my-group-b@my-project.com
    • my-group-c@my-project.com

という階層関係のメールグループを作り、BigQueryのデータセットの権限はdwh-viewer-groups@my-project.comだけ付与。権限の追加や削除はGoogle Groupのみで変更する、という形。所属している組織のGoogle Groupの運用体制によってはこちらを採用する場合があってもよさそう。