連携カタログ エンドポイントで VPC Service Controls を使用する

Lakehouse ランタイム カタログでは、連携カタログ エンドポイントの VPC Service Controls 境界ルールにより、BigQuery で外部 Apache Iceberg テーブルをクエリしながら、データの引き出しを防止できます。Google Cloud プロジェクトまたは Cloud Storage バケットがサービス境界内にある場合は、Amazon S3 と Microsoft Azure Data Lake Storage(ADLS)Gen2 の下り(外向き)ルール、または Cloud Storage の上り(内向き)ルールを構成できます。これらのルールは、AWS Glue Data Catalog、Databricks Unity Catalog、Snowflake Horizon Catalog、Workday データレイクに登録されているテーブルのメタデータ同期とクエリを認可します。

プロジェクトがサービス境界内にない場合、連携カタログ エンドポイントは VPC Service Controls の構成なしで機能します。SAP Business Data Cloud(SAP BDC)へのクロスクラウド接続については、SAP BDC の VPC Service Controls 構成をご覧ください。認証情報提供モードで Apache Iceberg REST カタログ エンドポイントを介してアクセスされるバケットを保護するには、認証情報提供で VPC Service Controls を使用するをご覧ください。

始める前に

  1. AWS Glue Data Catalog、Databricks Unity Catalog、Snowflake Horizon Catalog、Workday データレイク の連携カタログ エンドポイントを設定します。
  2. テーブル ファイルの保存場所に応じて、プロジェクトに 1 つ以上のサービス境界を作成します。

  3. 境界外のユーザーまたはサービス アカウントが連携カタログ エンドポイントにクエリを実行する場合は、カタログ エンドポイント プロジェクトの境界にそれらを許可する上り(内向き)ルールを追加します。

必要なロール

サービス境界の構成に必要な権限を取得するには、組織に対する次の IAM ロールを付与するよう管理者に依頼してください。

  • サービス境界と上り(内向き)ポリシーまたは下り(外向き)ポリシーを構成する: Access Context Manager 編集者 (roles/accesscontextmanager.policyEditor)

ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

必要な権限は、カスタムロールや他の事前定義ロールから取得することもできます。

ユースケースと必要な境界ルール

構成する境界ルールは、テーブル ファイルが存在する場所と、クエリ呼び出し元が実行される場所によって異なります。

ユースケース 必要な境界ルール 設定手順
Amazon S3 または ADLS Gen2 のクロスクラウド テーブルをクエリする: 承認されていない外部への下り(外向き)をブロックしながら、保護された BigQuery プロジェクトの連携カタログ エンドポイントを介して s3:// バケットまたは abfss:// コンテナの Apache Iceberg テーブルをクエリします。 カタログ エンドポイント プロジェクトの境界に下り(外向き)ルールを追加して、カタログ エンドポイントの blirc-... サービス アカウントとクエリ プリンシパルの両方が、承認済みの外部バケットまたはコンテナを読み取れるようにします。 カタログ エンドポイントのサービス アカウントを見つけ、外部クラウド ストレージの下り(外向き)ルールを追加します。
保護された Cloud Storage バケット内の外部カタログ テーブルにアクセスする: storage.googleapis.com を制限する境界内の gs:// バケットに保存されている Databricks Unity Catalog テーブルまたは Snowflake Horizon Catalog テーブルをクエリします(連携カタログ エンドポイントと同じプロジェクトと境界内にある場合でも)。 Cloud Storage バケット プロジェクトの境界に上り(内向き)ルールを追加して、リモート カタログの Google Cloud サービス アカウントが storage.googleapis.com にアクセスできるようにします。 サービス境界内の Cloud Storage バケットに上り(内向き)ルールを追加する。
カタログ エンドポイント境界外の呼び出し元からのクエリを許可する: 境界外にあるアナリスト アカウント、BI ツール、ワークロード サービス アカウントから、カタログ エンドポイント プロジェクトで BigQuery ジョブを実行します。 カタログ エンドポイント プロジェクトの境界に、テーブルのロケーションのストレージ ルールに加えて、外部呼び出し元を bigquery.googleapis.com と biglake.googleapis.com に許可する上り(内向き)ルールを追加します。 上り(内向き)ルールのリファレンスを使用して呼び出し元の上り(内向き)を構成し、テーブルの場所のストレージ手順に沿って操作します。

VPC Service Controls が連携カタログ エンドポイントのトラフィックを評価する方法

連携カタログ エンドポイントは、基盤となるストレージから読み取る 2 つの異なるオペレーション(メタデータの同期と BigQuery クエリ)を実行します。VPC Service Controls がこれらのオペレーションを評価する方法は、テーブル ファイルの保存場所によって異なります。

  • 外部クラウド ストレージ(Amazon S3 または Azure Data Lake Storage Gen2): VPC Service Controls は、カタログ エンドポイント プロジェクトのサービス境界からの下り(外向き)を、Google Cloud の呼び出し元 ID とターゲットの外部バケットまたはコンテナに対して評価します。

    オペレーション 評価された ID 評価されたリソース
    メタデータの同期 カタログ エンドポイントの自動プロビジョニングされた Lakehouse サービス アカウント(blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com) テーブルの Apache Iceberg メタデータを保持する外部バケットまたはコンテナ
    クエリ BigQuery ジョブを実行するユーザーまたはサービス アカウント テーブルのメタデータとデータファイルを保持する外部バケットまたはコンテナ

    Amazon S3 または ADLS Gen2 に保存されているテーブルの場合、境界の下り(外向き)ルールに次のすべてを含める必要があります。

    • ID: カタログ エンドポイントのサービス アカウントとクエリ プリンシパルの両方。
    • 外部リソース: テーブルがメタデータとデータファイルに使用するすべてのバケットまたはコンテナ。
    • オペレーション: bigquery.googleapis.com(externalResource.read 権限あり)と biglake.googleapis.com(すべてのメソッド、'*')の両方。
  • Cloud Storage( Google Cloudの Databricks Unity Catalog または Snowflake Horizon Catalog の外部ロケーション): メタデータの同期と BigQuery クエリの両方で、BigQuery と Lakehouse は、カタログ エンドポイントの blirc-... サービス アカウントではなく、リモート カタログから提供されたダウンスコープ認証情報を使用して Cloud Storage から読み取ります。Cloud Storage バケット プロジェクトが storage.googleapis.com を制限するサービス境界内にある場合、storage.googleapis.com はリモート カタログの Google Cloud サービス アカウントを、境界の上り(内向き)を試みる外部 ID として評価します。この評価は、バケットが連携カタログ エンドポイントと同じプロジェクトとサービス境界にある場合でも適用されます。バケット プロジェクトのサービス境界に上り(内向き)ルールを追加して、リモート カタログのGoogle Cloud サービス アカウントが storage.googleapis.com にアクセスできるようにする必要があります。

VPC Service Controls は、BigQuery と Lakehouse(biglake.googleapis.com)によって実行されるストレージ読み取りのみを評価します。Lakehouse がリモート カタログの API エンドポイントに対して行う呼び出し(名前空間やテーブルの一覧表示など)は評価されません。また、ストレージを直接読み取る外部クエリエンジンは管理されません。

外部リソースの形式

下り(外向き)ルールで外部リソースを正確なバケットまたはコンテナ URI として指定します。オブジェクト パスとワイルドカードはサポートされていません。バケット、コンテナ、ストレージ アカウントの名前は小文字にする必要があります。これらの名前に大文字が含まれているルールは、ルールを保存するときに拒否されます。Azure Data Lake Storage Gen2(abfss://)と Azure Blob Storage(azure://)の URI は、VPC Service Controls の下り(外向き)ルールで交換できません。連携カタログ エンドポイントの場合は、abfss:// 形式を指定する必要があります。

次の表に、連携カタログ エンドポイントでサポートされている外部リソース URI 形式を示します。

ストレージ サービス 形式 例
Amazon S3 s3://BUCKET_NAME s3://my-iceberg-warehouse
Azure Data Lake Storage Gen2 abfss://CONTAINER@STORAGE_ACCOUNT.dfs.core.windows.net abfss://unity-catalog-storage@mystorageaccount.dfs.core.windows.net

カタログ エンドポイントのサービス アカウントを確認する

Lakehouse は、カタログ エンドポイントの作成時に、連携カタログ エンドポイントごとに専用のサービス アカウントをプロビジョニングします。Cloud Storage のテーブルの場合は、サービス境界内の Cloud Storage バケットに上り(内向き)ルールを追加するに進みます。テーブルが Amazon S3 または ADLS Gen2 に保存されている場合は、下り(外向き)ルール用にこのサービス アカウントのメールアドレスを取得します。

gcloud biglake iceberg catalogs describe CATALOG_ID \
    --project=PROJECT_ID \
    --format='value(biglake-service-account)'

次のように置き換えます。

  • CATALOG_ID: 連携カタログ エンドポイントの ID。
  • PROJECT_ID: 連携カタログ エンドポイントを含む Google Cloudプロジェクトの ID。

このコマンドは、次の形式のメールアドレスを返します。

blirc-PROJECT_NUMBER-ID@gcp-sa-biglakerestcatalog.iam.gserviceaccount.com

外部クラウド ストレージの下り(外向き)ルールを追加する

連携カタログ エンドポイントを介してアクセスされるテーブルが Amazon S3 または ADLS Gen2 に保存されている場合は、カタログ エンドポイント プロジェクトを保護するサービス境界に下り(外向き)ルールを追加します。

コンソール

  1. Google Cloud コンソールで、[VPC Service Controls] ページに移動します。

    [VPC Service Controls] に移動

  2. 組織とアクセス ポリシーを選択し、カタログ エンドポイント プロジェクトを含むサービス境界の名前をクリックします。

  3. [編集] をクリックし、[下り(外向き)ポリシー] セクションで [下り(外向き)ルールを追加] をクリックします。

  4. [From] セクションの [ID] で、[ID とグループを選択] を選択し、[ID を追加] をクリックして、カタログ エンドポイントのサービス アカウントと、クエリを実行するユーザーまたはサービス アカウントを追加します。

  5. [To] セクションで、次の操作を行います。

    1. [外部リソース] を選択し、[リソースを追加] をクリックして、テーブルで使用する各 s3:// バケットまたは abfss:// コンテナを入力し、[外部リソースを追加] をクリックします。
    2. [オペレーションまたは IAM ロール] で、[API オペレーション] テーブルの次のサービスを構成します。
      • BigQuery API(bigquery.googleapis.com): デフォルトのすべてのメソッド(*)エントリを読み取り専用アクセスに制限するには、bigquery.googleapis.com の操作メニューを開いて [編集] をクリックし、[メソッドを選択] を選択して、externalResource.read 権限を選択し、[選択したメソッドを追加] をクリックします。
      • BigLake API(biglake.googleapis.com): [オペレーションを追加] をクリックし、[BigLake API](biglake.googleapis.com)を選択して、[すべてのメソッド] を選択し、[すべてのメソッドを追加] をクリックします。
  6. [保存] をクリックします。

gcloud CLI

  1. カタログ エンドポイントのサービス アカウント、クエリ プリンシパル、テーブルで使用するすべての外部バケットまたはコンテナを指定する egress.yaml という名前のファイルを作成します。完全なスキーマについては、下り(外向き)ルールのリファレンスをご覧ください。

    - egressFrom:
        identities:
        - serviceAccount:CATALOG_ENDPOINT_SERVICE_ACCOUNT
        - user:QUERY_USER_EMAIL
      egressTo:
        externalResources:
        - s3://S3_BUCKET_NAME
        - abfss://ADLS_CONTAINER@STORAGE_ACCOUNT.dfs.core.windows.net
        operations:
        - serviceName: bigquery.googleapis.com
          methodSelectors:
          - permission: externalResource.read
        - serviceName: biglake.googleapis.com
          methodSelectors:
          - method: '*'
    

    次のように置き換えます。

    • CATALOG_ENDPOINT_SERVICE_ACCOUNT: 前に取得したカタログ エンドポイントのサービス アカウントのメールアドレス。
    • QUERY_USER_EMAIL: 連携カタログ エンドポイントを介してクエリを実行するユーザーまたはサービス アカウントのメールアドレス。サービス アカウントの場合、接頭辞には user: の代わりに serviceAccount: を使用します。または、identities を identityType: ANY_IDENTITY に置き換えて、境界内の任意のプリンシパルを許可します。
    • S3_BUCKET_NAME、ADLS_CONTAINER、STORAGE_ACCOUNT: テーブルのメタデータとデータファイルを保持する外部ストレージのロケーション。ストレージ プロバイダに適用されるエントリのみを含めます。
  2. 組織のアクセス ポリシーの数値 ID を確認します。

    gcloud access-context-manager policies list \
        --organization=ORGANIZATION_ID \
        --format='value(name)'
    

    ORGANIZATION_ID は、組織 ID に置き換えます。

  3. 下り(外向き)ルールをサービス境界に適用します。

    gcloud access-context-manager perimeters update PERIMETER_NAME \
        --policy=POLICY_ID \
        --set-egress-policies=egress.yaml
    

    次のように置き換えます。

    • PERIMETER_NAME: サービス境界の名前。
    • POLICY_ID: アクセス ポリシーの数値 ID。

    ルールを適用する前にテストするには、gcloud access-context-manager perimeters dry-run update を使用してドライラン構成に適用し、検証後に gcloud access-context-manager perimeters dry-run enforce を使用して適用します。

  4. ルールがアクティブであることを確認します。

    gcloud access-context-manager perimeters describe PERIMETER_NAME \
        --policy=POLICY_ID \
        --format='yaml(status.egressPolicies)'
    

サービス境界内の Cloud Storage バケットに上り(内向き)ルールを追加する

リモート カタログ(Databricks Unity Catalog や Snowflake Horizon Catalog など)のテーブルが、storage.googleapis.com を制限する境界で保護された Cloud Storage バケットに保存されている場合は、バケット プロジェクトのサービス境界に上り(内向き)ルールを追加します。BigQuery と Lakehouse は、リモート カタログの Google Cloud サービス アカウント(blirc-... サービス アカウントではない)を使用して Cloud Storage に対する認証を行うため、バケットが連携カタログ エンドポイントと同じプロジェクトと境界内にある場合でも、このルールが必要です。

コンソール

  1. Google Cloud コンソールで、[VPC Service Controls] ページに移動します。

    [VPC Service Controls] に移動

  2. 組織とアクセス ポリシーを選択し、Cloud Storage バケットを含むプロジェクトを保護するサービス境界の名前をクリックします。

  3. [編集] をクリックし、[上り(内向き)ポリシー] セクションで [上り(内向き)ルールを追加] をクリックします。

  4. [From] セクションで、次の操作を行います。

    1. [ID] で、[選択されている ID とグループ] を選択し、[ID を追加] をクリックして、Cloud Storage バケットのリモート カタログによってプロビジョニングされた Google Cloud サービス アカウントを追加します。
    2. [ソース] で [すべてのソース] を選択します(または、[ソースを選択] を選択してアクセスレベルを指定します)。
  5. [To] セクションで、次の操作を行います。

    1. [リソース] で [リソースを選択] を選択します。[プロジェクト] タブで、[プロジェクトを追加] をクリックし、Cloud Storage バケットを含むプロジェクトを選択して、[選択したプロジェクトを追加] をクリックします。
    2. [オペレーションまたは IAM ロール] で、[オペレーションを選択] を選択し、[オペレーションを追加] をクリックして、[Cloud Storage API](storage.googleapis.com)を選択し、[すべてのメソッド] を選択して、[すべてのメソッドを追加] をクリックします。または、[メソッドを選択] を選択して、特定のサポートされているサービス メソッド(google.storage.objects.get、google.storage.objects.list、google.storage.buckets.get など)を選択し、[選択したメソッドを追加] をクリックします。
  6. [保存] をクリックします。

gcloud CLI

  1. リモート カタログのGoogle Cloud サービス アカウントがバケットのプロジェクトの storage.googleapis.com にアクセスできるようにする ingress.yaml という名前のファイルを作成します。完全なスキーマについては、上り(内向き)ルールのリファレンスをご覧ください。

    - ingressFrom:
        identities:
        - serviceAccount:REMOTE_CATALOG_GCS_SERVICE_ACCOUNT
        sources:
        - accessLevel: '*'
      ingressTo:
        operations:
        - serviceName: storage.googleapis.com
          methodSelectors:
          - method: '*'
        resources:
        - projects/BUCKET_PROJECT_NUMBER
    

    次のように置き換えます。

    • REMOTE_CATALOG_GCS_SERVICE_ACCOUNT: Cloud Storage バケットにアクセスするためにリモート カタログによってプロビジョニングされたGoogle Cloud サービス アカウントのメールアドレス(Databricks Unity Catalog の DESCRIBE STORAGE CREDENTIAL や Snowflake Horizon Catalog の DESC EXTERNAL VOLUME など)。
    • BUCKET_PROJECT_NUMBER: Cloud Storage バケットを含むプロジェクトの数値プロジェクト番号。
  2. 組織のアクセス ポリシーの数値 ID を確認します。

    gcloud access-context-manager policies list \
        --organization=ORGANIZATION_ID \
        --format='value(name)'
    

    ORGANIZATION_ID は、組織 ID に置き換えます。

  3. バケット プロジェクトを保護するサービス境界に上り(内向き)ルールを適用します。

    gcloud access-context-manager perimeters update BUCKET_PERIMETER_NAME \
        --policy=POLICY_ID \
        --set-ingress-policies=ingress.yaml
    

    次のように置き換えます。

    • BUCKET_PERIMETER_NAME: バケット プロジェクトを保護するサービス境界の名前。
    • POLICY_ID: アクセス ポリシーの数値 ID。

    ルールを適用する前にテストするには、gcloud access-context-manager perimeters dry-run update を使用してドライラン構成に適用し、検証後に gcloud access-context-manager perimeters dry-run enforce を使用して適用します。

  4. ルールがアクティブであることを確認します。

    gcloud access-context-manager perimeters describe BUCKET_PERIMETER_NAME \
        --policy=POLICY_ID \
        --format='yaml(status.ingressPolicies)'
    

構成を確認する

サービス境界ポリシーの更新が反映されるまでに最大 30 分かかることがあります。ルールが有効になったら、VPC Service Controls の拒否なしでメタデータの同期と BigQuery クエリが完了することを確認します。

  1. 次のスケジュールされたメタデータ同期サイクルが完了するまで待ってから、Cloud Audit Logs のポリシー拒否監査ログをチェックして、VPC Service Controls 違反が発生していないことを確認します。同期は更新スケジュールに従って自動的に実行され、手動でトリガーすることはできません。

    ログ エクスプローラで、保護されたプロジェクト(外部クラウド ストレージのカタログ エンドポイント プロジェクト、または Cloud Storage テーブルの Cloud Storage バケット プロジェクト)を選択します。詳細については、監査ログから VPC Service Controls エラーを取得するをご覧ください。次のクエリを実行します。

    log_id("cloudaudit.googleapis.com/policy")
    protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    

    ルールの伝播後に違反エントリが表示された場合は、ログエントリの egressViolations.targetResource、ingressViolations.targetResource、authenticationInfo.principalEmail フィールドを調べて、ルールのリソースと ID に一致していることを確認します。新しいテーブルの同期に失敗し、VpcServiceControlAuditMetadata エントリが表示されない場合は、リモート カタログの権限と認証情報を確認します。クロスクラウド データアクセスのトラブルシューティングをご覧ください。

  2. 4 つの部分からなる P.C.N.T(Project.Catalog.Namespace.Table)命名規則を使用して、BigQuery のテーブルに対してテストクエリを実行します。

    SELECT COUNT(*)
    FROM `PROJECT_ID.CATALOG_ID.NAMESPACE.TABLE_NAME`;
    

    次のように置き換えます。

    • PROJECT_ID: 連携カタログ エンドポイントを含む Google Cloudプロジェクトの ID。
    • CATALOG_ID: 連携カタログ エンドポイントの ID。
    • NAMESPACE: 連携カタログ エンドポイントの Namespace。
    • TABLE_NAME: 名前空間内のテーブルの名前。

    クエリが VPC Service Controls によってブロックされると、エラー メッセージに vpcServiceControlsUniqueIdentifier 値が含まれます。protoPayload.metadata.vpcServiceControlsUniqueId をその識別子と照合して、ログ エクスプローラでポリシー拒否監査ログをフィルタします。

    log_id("cloudaudit.googleapis.com/policy")
    protoPayload.metadata.@type:"type.googleapis.com/google.cloud.audit.VpcServiceControlAuditMetadata"
    protoPayload.metadata.vpcServiceControlsUniqueId="UNIQUE_IDENTIFIER"
    

    UNIQUE_IDENTIFIER は、エラー メッセージの vpcServiceControlsUniqueIdentifier 値に置き換えます。

次のステップ