■BQタイムアウトは6時間
■マテリアライズドビュー
■マテリアライズドビュー
実体データを保持しリフレッシュ更新で早いため集計等に向く
ベーステーブルは一つ、カウントができない、使用できない関数がある等の制約がある
またマテビューはビューを元に作成できずテーブルからである必要がある
またマテビューはビューを元に作成できずテーブルからである必要がある
ストレージコストは掛かるが、通常ビューで時間掛かる計算を頻繁にする場合は早く安くなる可能性がある
■BQ同時実行数
オンデマンドでは使用可能なスロット数に基づき自動的に同時実行数が決定され超えるとスロットに 空きがでるまでキューに保管される
プロジェクトごとにクエリの最大同時実行数は動的に決まる
同時実行数の最大値は指定できるが、大きくしても実行数が増えることはなく、あくまで自動決定 内の方が優先される
Editionsが割り当てられているプロジェクトでは最大同時実行数を明示的に設定できる
他に、インタラクティブクエリ、バッチクエリ、クエリ順序や上限など
■BigQueryの列レベル・行レベルのセキュリティ
個人情報や機微情報を隠す
BigQuery の行レベルのセキュリティの概要 | Google Cloud
行レベルなら同じテーブルを使うので同じダッシュボード/Appが使える(AuthorizedViewの方が柔軟だが)
データ マスキングの概要 | BigQuery | Google Cloud
列レベルアクセス権以外にもマスクの種類があり、ハッシュだったり先頭4文字や末尾4文字等で共通文字化としてマスク化できる
BigQuery の行レベルのセキュリティの概要 | Google Cloud
行レベルなら同じテーブルを使うので同じダッシュボード/Appが使える(AuthorizedViewの方が柔軟だが)
データ マスキングの概要 | BigQuery | Google Cloud
列レベルアクセス権以外にもマスクの種類があり、ハッシュだったり先頭4文字や末尾4文字等で共通文字化としてマスク化できる
BQ画面>左ナビのポリシータグ
ポリシータグを作成(組織単位で一括一覧表示)
タグは階層化できるので、全ユーザタグ>管理者タグ>社長タグ
スキーマ>Addポリシータグ
タグが付いていればプレビューで見れない
select * except(tag_column)にする必要がある
メタデータは見れる(カラム名、型
ポリシータグ画面>対象ポリシー選択>情報パネルで権限者一覧
fine-grained readerを付与するとselect *ができるようになる
社長タグに社長だけ権限付ける等
※APIを有効にし、ポリシーを有効にする必要がある
■承認済みビュー authorized viewauthorized viewを設定するとそのviewを対象とする権限だけ必要で権限をさかのぼり付与しなくていい(通常のviewは参照元の権限も必要)
この権限移譲は閲覧権限のみで編集権限等は含まない
被参照の元テーブル側に許可するview名を設定する
参照権限は緩くなるが、編集権限は厳しくなる(設定するビューは変更しない前提で承認する形)
参照権限は緩くなるが、編集権限は厳しくなる(設定するビューは変更しない前提で承認する形)
authorized viewを付与すると玄関となったビューはdataEditorではビュー更新ができなくなる
玄関ビューにも、ソーステーブルにもEditor権限が必要
基本の安全策はauthorized view設定を外す>ビュー変更>AV再設定がいい
玄関ビューにも、ソーステーブルにもEditor権限が必要
基本の安全策はauthorized view設定を外す>ビュー変更>AV再設定がいい
対象のAVは管理者を立て一元管理するのが良さそう
(テーブルやビューを作って権限付与してバッチだとdata ownerが必要なのは注意)
■Authorized系にはメリットとデメリット
普通のビューは元データへの権限が必要で見せたくないデータへも権限が必要になる場合がある
2) Authorized viewを設定するデメリット
1) Authorized viewを設定するメリット
一度設定してしまえばソース側への権限付与依頼が不要となりビューの権限管理が省力化できる
ビューにて閲覧対象を絞ることができソース全体は閲覧させないことができる、絞れる普通のビューは元データへの権限が必要で見せたくないデータへも権限が必要になる場合がある
2) Authorized viewを設定するデメリット
一度設定してしまえばソース側での権限付与依頼が不要となり被参照側で許可不許可の判断ができなくなる、誰にデータ閲覧権限を付与しているか把握できず管理が機能しなくなる一面がある
将来に置かれるソース側のデータの閲覧も許可することになり不用意に閲覧が可能となってしまう
terraformでAuthorized view設定が剥がれてしまう危険性
ビューを編集するにあたりAuthorized viewを外す必要がある、あるいはソースにもEditor権限
すぐにビューを変更することができなくなる(ビューを一旦削除することはできる)
設定時は良いかもしれないが、将来的に意図しないデータがDS入った場合も閲覧を許してしまう
↓
データセットは細かく作成してアクセスレベル設定し普通のビューを使う
ソース全体を閲覧させられない場合にAVを使うメリットがでる
情報漏洩リスクはどちらも多段ビューで同じ感じ、だがビュー作成でAV設定が生きているバグがデカい
すぐにビューを変更することができなくなる(ビューを一旦削除することはできる)
Authorized viewはビューを削除して、再度作り直すと生きている場合がある、ダメな場合も多いが
これで漏洩させたくない情報を一時含められる危険性がある
3)authorized datasetを設定するデメリット設定時は良いかもしれないが、将来的に意図しないデータがDS入った場合も閲覧を許してしまう
↓
データセットは細かく作成してアクセスレベル設定し普通のビューを使う
ソース全体を閲覧させられない場合にAVを使うメリットがでる
情報漏洩リスクはどちらも多段ビューで同じ感じ、だがビュー作成でAV設定が生きているバグがデカい
■BQクリーンルーム
データ準備側でパブリックし、使う側でサブスクする (BQ exploreでペインでAddする)
スプシ保存できない、開覧数のレポートが見れる(使用者名は見えない) 実はパブ側でサブスクし公開すれば、閲覧とJobUserだけで使用できるようになる
GAでなく、またオンデマンドしか無理、コピペやデータコネクタは可能で残念
■ロール割り当て者の出力
カスタムロールのProject_Admin、Project_Managerが誰に割り当てられているか
■ロール割り当て者の出力
カスタムロールのProject_Admin、Project_Managerが誰に割り当てられているか
Asset inventoryをBQにダンプしたデータからクエリする
WITH
WITH
projects AS (
SELECT
resource.data AS rsc,
ancestor_path
FROM
prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now
WHERE
asset_type = 'cloudresourcemanager.googleapis.com/Project'
),
projects_info AS (
SELECT
JSON_EXTRACT_SCALAR(rsc, '$.projectId') AS projectid,
JSON_EXTRACT_SCALAR(rsc, '$.lifecycleState') AS lifecycleState,
ancestor_path
FROM
projects
),
projects_efficient AS (
SELECT
*
FROM
projects_info
WHERE
NOT REGEXP_CONTAINS(ancestor_path, "folders/apps-script")
),
projects_num_adm_mgr AS (
SELECT
REPLACE(name, '//cloudresourcemanager.googleapis.com/projects/', '') AS project_num,
REPLACE(b.role, 'organizations/1234567/roles/', '') AS role_value,
STRING_AGG(REPLACE(m, 'user:', ''), ', ') AS member_value
FROM
prj.cloud_asset_inventory.cloud_asset_inventory_org_iam_policy_now,
UNNEST(iam_policy.bindings) AS b,
UNNEST(b.members) AS m
WHERE
asset_type = 'cloudresourcemanager.googleapis.com/Project'
AND (role LIKE '%Project_Admin%' OR role LIKE '%Project_Manager%')
GROUP BY
project_num,
role_value
),
projects_adm_mgr AS (
SELECT
JSON_EXTRACT_SCALAR(resource.data, '$.projectId') AS project,
projects_num_adm_mgr.role_value,
projects_num_adm_mgr.member_value
FROM
projects_num_adm_mgr
LEFT JOIN
prj.cloud_asset_inventory.cloud_asset_inventory_org_resource_now AS res
ON
projects_num_adm_mgr.project_num = REPLACE(res.name, '//cloudresourcemanager.googleapis.com/projects/', '')
)
SELECT
projects_efficient.projectid,
projects_efficient.lifecycleState,
CONCAT(projects_efficient.projectid, ', ', projects_adm_mgr.role_value) AS role_value,
projects_adm_mgr.member_value
FROM
projects_efficient
LEFT OUTER JOIN
projects_adm_mgr
ON
projects_efficient.projectid = projects_adm_mgr.project
ORDER BY
lifecycleState DESC,
projectid;
■IAM(Identity and Access Management)
前回
/// BANGBOO BLOG /// - BigQuery