VPC Service Controls のサービス境界外(別組織)から BigQuery を参照する
データ事業本部のはんざわです。
Google Cloud では VPC Service Controls(VPC SC)を使ってサービス境界を設定し、境界内への API アクセス(Ingress)をユーザーや送信元 IP アドレスに応じて制限したり、境界外へのデータの持ち出し(Egress)を防いだりできます。
BigQuery においても、クエリの実行やテーブル参照などの操作を制限できるほか、データの持ち出し先(エクスポート先)となるプロジェクトを制限することも可能です。
一方で、設定を誤るとワークロードが期待通りに動かなかったり、最悪の場合は Google Cloud 環境からロックアウトされてしまう可能性もあるため、注意が必要です。
本ブログでは、VPC SC で保護されている組織配下のプロジェクトにある BigQuery に対して、別の組織(境界外)の環境からクエリを実行するために必要な設定を検証します。
やりたいこと
今回のブログでやりたいことは以下の構成図のとおりです。
- 組織Aは VPC SC が適用されている。
- 組織AにあるプロジェクトXは VPC SC の境界内に存在する。
- 組織Bは VPC SC が適用されていない。
- 組織BにあるプロジェクトYは VPC SC の境界外に存在する。
- ユーザーHさんは、プロジェクトXとYの両方で BigQuery を操作する権限を持っている。
- ユーザーHさんは、プロジェクトYからプロジェクトXの BigQuery を参照したい。

【結論】VPC SC の設定
今回の構成では、クエリを実行する主体(コンピューティング)が境界外のプロジェクトYにあります。
そのため、プロジェクトXのデータを読み取る際、「境界内からデータを持ち出して、境界外で処理する」 という動きになります。
この挙動を許可するためには、Ingress だけでなく、Egress の設定も必要となります。
具体的な Ingress/Egress ポリシーの設定内容は以下の通りになります。
From:
User: ユーザーHさん
Source: 全てのソース # プロジェクトYを指定すると弾かれるので注意
To:
Resource: 全てのプロジェクト
Service: bigquery.googleapis.com
Method: 全てのメソッド
From:
User: ユーザーHさん
Source: 全てのソース # 境界内の全てのプロジェクト
To:
Resource: プロジェクトY
Service: bigquery.googleapis.com
Method: 全てのメソッド
【おまけ】承認済みビューにおける挙動を確認する
承認済みビューとは、ユーザーに対して元テーブルへの直接的なアクセス権限を与えず、ビュー経由でのみデータを参照させることができる機能です。
詳細は以下のブログを参考にしてください。
この承認済みビューにおいて、「ビューの元となるテーブルが VPC SC の境界内(プロジェクトX)」に存在し、「ビュー自体は境界外(プロジェクトY)」に作成されている場合の挙動を確認してみます。
構成図は以下のとおりです。

- 元テーブルは境界内(プロジェクトX)にある。
- 承認済みビューは境界外(プロジェクトY)にある。
- ユーザーHさんは、境界外のビューに対してのみ参照権限を持っている。
- プロジェクトYのビューは、プロジェクトXのテーブルに対して「承認」されている。
実施結果
結果として、承認済みビューの場合でも通常のテーブルを参照するのと同じ Ingress/Egress ポリシーが必要でした。
具体的には、以下の設定が必要です(前述したのと同じ設定です)。
From:
User: ユーザーHさん
Source: 全てのソース
To:
Resource: 全てのプロジェクト
Service: bigquery.googleapis.com
Method: 全てのメソッド
From:
User: ユーザーHさん
Source: 全てのソース
To:
Resource: プロジェクトY
Service: bigquery.googleapis.com
Method: 全てのメソッド
終わりに
本ブログでは、VPC SC のサービス境界外(別組織)にあるプロジェクトから境界内の BigQuery を参照する際に必要となる Ingress/Egress ポリシーの設定内容について検証しました。
次回以降のブログでは、BigQuery Sharing(旧 Analytics Hub)を使ってデータを共有する際に VPC Service Controls でどのような設定が必要になるのかについても検証してみたいと思います。
参考になれば幸いです。






