PostgreSQL に接続する

BigQuery 管理者は、接続を作成して PostgreSQL データにアクセスできます。この接続により、データ アナリストは PostgreSQL のデータにクエリを実行できるようになります。

サポートされている PostgreSQL の環境とバージョン

BigQuery 連携は、次の PostgreSQL デプロイ環境をサポートしています。

  • Cloud VPN または Cloud Interconnect を介して Google Cloudに接続されたオンプレミスの PostgreSQL インスタンス
  • Compute Engine 上のセルフマネージド PostgreSQL インスタンス
  • パブリック IP アドレスまたはネットワーク アタッチメントを介してアクセス可能な、クラウドでホストされている PostgreSQL インスタンス

BigQuery 連携は、次の PostgreSQL バージョンをサポートしています。

  • PostgreSQL 16(推奨)
  • PostgreSQL 15

始める前に

必要な API を有効にし、PostgreSQL データベースを構成して、このドキュメントの各タスクを実行するために必要な権限をユーザーに付与する Identity and Access Management ロールを付与します。

  1. BigQuery Connection API を有効にします。

    API の有効化

  2. ネットワーク アタッチメントを使用してプライベート ネットワーク経由でトラフィックをルーティングする場合は、Compute Engine API も有効にします。

    Compute Engine API を有効にする

  3. PostgreSQL データベースで、クエリを実行するテーブルまたはスキーマに対する SELECT 権限を持つ専用のデータベース ユーザーを作成します。

    CREATE USER USER_NAME WITH PASSWORD 'PASSWORD';
    GRANT USAGE ON SCHEMA SCHEMA_NAME TO USER_NAME;
    GRANT SELECT ON ALL TABLES IN SCHEMA SCHEMA_NAME TO USER_NAME;

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

    • USER_NAME: データベース ユーザーのユーザー名。
    • PASSWORD: データベース ユーザーのパスワード。
    • SCHEMA_NAME: クエリ対象のテーブルのスキーマ。
  4. 次のいずれかの方法で、PostgreSQL データベース インスタンスへのネットワーク接続を構成します。

    • プライベート ネットワーク経由でトラフィックをルーティングする場合は、BigQuery 接続と同じリージョンにネットワーク アタッチメントを作成します。DNS ピアリングはサポートされていません。VPC ネットワーク内で解決可能な IP アドレスまたはホスト名を使用して接続します。
    • パブリック インターネット経由で接続する場合は、すべての Google IP アドレス範囲を PostgreSQL データベースのファイアウォール ルールに追加します。

必要なロール

PostgreSQL への接続に必要な権限を取得するには、管理者に次の IAM ロールを付与するよう依頼してください。

  • 接続を作成する: プロジェクトに対する BigQuery 接続管理者(roles/bigquery.connectionAdmin)
  • ネットワーク アタッチメントを構成する: プロジェクトに対する Compute 管理者(roles/compute.admin)

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

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

BigQuery を PostgreSQL に接続する

BigQuery を PostgreSQL に接続するには、Google Cloud コンソールまたは bq コマンドライン ツールを使用します。

コンソール

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

    [BigQuery] に移動

  2. [エクスプローラ] ペインで、 [データを追加] をクリックします。

    [データを追加] ページが開きます。

  3. [フィルタ条件] ペインの [データソースのタイプ] セクションで、[データベース] を選択します。

    または、[データソースを検索] フィールドに「postgresql」と入力します。

  4. [特徴量データソース] セクションで、[PostgreSQL] をクリックします。

  5. [外部データへのアクセス] セクションで、[PostgreSQL への連携クエリ] という説明が記載された [BigQuery フェデレーション] ソリューション カードをクリックします(Cloud SQL または AlloyDB for PostgreSQL のカードではありません)。

    [外部データソース] ペインが開きます。

  6. [外部データソース] ペインで、次の構成を行います。

    • [接続 ID] フィールドに、一意の接続 ID(postgres_prod_conn など)を入力します。
    • [ロケーション タイプ] セクションで [リージョン] を選択し、BigQuery データセットが存在するリージョンを選択します。この接続を使用するクエリは、このリージョンから実行する必要があります。
    • (省略可)[わかりやすい名前] フィールドに、接続のわかりやすい名前を入力します。
    • (省略可)[説明] フィールドに、この接続リソースの説明を入力します。
    • [暗号化] セクションで、[Google-managed encryption key] を選択するか、[Cloud KMS 鍵] を選択して顧客管理の暗号鍵(CMEK)を使用します。
    • [ホスト:ポート] フィールドに、PostgreSQL データベース サーバーのホストとポートを HOST:PORT 形式で入力します(例: 10.10.2.2:5432)。
    • [ユーザー名] フィールドに、前提条件で作成したデータベース ユーザーを入力します。
    • [パスワード] フィールドに、データベース ユーザーのパスワードを入力します。
    • [データベース] フィールドに、PostgreSQL データベース名を入力します。
    • (省略可)[ネットワーク アタッチメント] フィールドで、プライベート接続を使用している場合は、ネットワーク アタッチメントのリソースパスを projects/PROJECT_ID/regions/NA_REGION/networkAttachments/ATTACHMENT_NAME 形式で入力します。
    • [TLS モード] リストで、サポートされている TLS モードのいずれかを選択します(例: データを暗号化し、CA とホスト名を検証する(推奨))。
    • [認証局(CA)] リストで、[Public CA(Web PKI)] を選択するか、カスタム CA を選択して PEM 形式の証明書を貼り付けます。
  7. [接続を作成] をクリックします。

bq

bq mkコマンド に --connection フラグを指定します。

bq mk --connection \
  --location=LOCATION \
  --project_id=PROJECT_ID \
  --connector_configuration '{
    "connector_id": "postgresql",
    "endpoint": {
      "host_port": "HOST_PORT"
    },
    "asset": {
      "database": "DATABASE"
    },
    "authentication": {
      "username_password": {
        "username": "USERNAME",
        "password": {
          "plaintext": "PASSWORD"
        }
      }
    },
    "tls": {
      "mode": "TLS_MODE"
    },
    "network": {
      "private_service_connect": {
        "network_attachment": "projects/PROJECT_ID/regions/NA_REGION/networkAttachments/ATTACHMENT_NAME"
      }
    }
  }' \
  CONNECTION_ID

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

  • LOCATION: PostgreSQL と一緒にクエリするデータセットに一致する BigQuery リージョン(例: us-central1)。この接続を使用するクエリは、このリージョンから実行する必要があります。
  • PROJECT_ID: 実際の Google Cloud プロジェクト ID。
  • HOST_PORT: PostgreSQL データベース サーバーのホストとポート。HOST:PORT 形式(例: 10.10.2.2:5432)。
  • DATABASE: PostgreSQL データベース名。
  • USERNAME: PostgreSQL データベース ユーザー。
  • PASSWORD: データベース ユーザーのパスワード。
  • TLS_MODE: TLS 暗号化モード(ENCRYPT_VERIFY_CA_AND_HOST、ENCRYPT_VERIFY_CA、ENCRYPT_VERIFY_NONE、DISABLE)。ENCRYPT_VERIFY_CA_AND_HOST または ENCRYPT_VERIFY_CA でカスタム CA 証明書を使用する場合は、"tls" の下に "private_pki": { "trusted_certificates_pem": "CERT_CONTENT" } オブジェクトを含めます。
  • NA_REGION: ネットワーク アタッチメントが配置されているリージョン。
  • ATTACHMENT_NAME: ネットワーク アタッチメントの名前。パブリック IP 経由で接続する場合は、"network" オブジェクトを省略します。
  • CONNECTION_ID: この接続の固有識別子。
  • (省略可)--kms_key_name=KMS_KEY_NAME: 顧客管理の暗号鍵(CMEK)。省略した場合、認証情報はデフォルトの Google-owned and Google-managed encryption keyによって保護されます。

Transport Layer Security(TLS)の構成

PostgreSQL コネクタは、BigQuery と PostgreSQL データベース間の転送中のクエリ トラフィックを暗号化するために、Transport Layer Security(TLS)をサポートしています。

BigQuery を PostgreSQL に接続する場合は、次のいずれかの TLS モードを選択します。

  • データを暗号化し、認証局(CA)とホスト名を検証する(ENCRYPT_VERIFY_CA_AND_HOST モード)。TLS を使用して完全なサーバー検証を実行します。転送中のすべてのデータを暗号化し、データベース サーバーの証明書が信頼できる CA によって署名されていることを確認します。また、接続先のホスト名が証明書の共通名(CN)またはサブジェクト代替名(SAN)と一致していることを確認します。パブリック IP 経由の接続では必須です。

  • データを暗号化し、CA のみを検証する(ENCRYPT_VERIFY_CA モード)。転送中のすべてのデータを暗号化し、サーバーの証明書が信頼できる CA によって署名されていることを確認しますが、サーバーのホスト名は確認しません。このモードは、サーバー証明書が信頼できる CA によって署名されているものの、証明書の CN または SAN と一致しない IP アドレスまたはホスト名を使用して接続する場合に使用します。

  • 暗号化のみ(ENCRYPT_VERIFY_NONE モード)。BigQuery とサーバー間で転送されるすべてのデータを暗号化します。証明書やホスト名の検証は行いません。プライベート VPC 内でのみ推奨されます。

  • 暗号化または検証なし(DISABLE モード)。データを暗号化せず、証明書やホスト名の検証も行いません。保護された VPC ネットワーク内のプライベート ネットワーク アタッチメントを介して接続する場合にのみ許可されます。

PEM 形式の信頼できるサーバー証明書

ENCRYPT_VERIFY_CA_AND_HOST モードまたは ENCRYPT_VERIFY_CA モードを使用する場合は、次の操作を行います。

  • データベース サーバーの証明書がパブリック CA(Mozilla Root CA Program に含まれる Let's Encrypt、DigiCert、Google Trust Services など)によって署名されている場合は、証明書を指定する必要はありません。パブリック CA のルート証明書は、デフォルトで信頼されています。
  • 組織内の内部またはプライベート CA によって署名された証明書、または自己署名証明書を使用する場合は、接続の設定時に [信頼できる PEM 証明書] フィールドに、Privacy-Enhanced Mail(PEM)形式の完全な証明書チェーンを指定する必要があります。

ユーザーと接続を共有する

次のロールを付与することで、ユーザーがデータをクエリして接続を管理できます。

  • roles/bigquery.connectionUser: ユーザーが接続を使用して外部データソースに接続し、クエリを実行できるようにします。

  • roles/bigquery.connectionAdmin: ユーザーが接続を管理できるようにします。

BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。

次のオプションのいずれかを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

    接続は、プロジェクトで [接続] というグループに一覧表示されます。

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    ハイライト表示された [エクスプローラ] ペインのボタン。

    左側のペインが表示されていない場合は、 [左ペインを開く] をクリックしてペインを開きます。

  3. プロジェクトをクリックし、[接続] をクリックして、接続を選択します。

  4. [詳細] ペインで、[共有] をクリックして接続を共有します。次に、以下の操作を行います。

    1. [接続の権限] ダイアログで、プリンシパルを追加または編集して、他のプリンシパルと接続を共有します。

    2. [保存] をクリックします。

bq

bq コマンドライン ツールを使用して接続を共有することはできません。接続を共有するには、 Google Cloud コンソールまたは BigQuery Connections API の接続を共有するためのメソッドを使用します。

API

BigQuery Connections REST API リファレンス セクションの projects.locations.connections.setIAM メソッドを使用して、policy リソースのインスタンスを指定します。

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

import com.google.api.resourcenames.ResourceName;
import com.google.cloud.bigquery.connection.v1.ConnectionName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import com.google.iam.v1.Binding;
import com.google.iam.v1.Policy;
import com.google.iam.v1.SetIamPolicyRequest;
import java.io.IOException;

// Sample to share connections
public class ShareConnection {

  public static void main(String[] args) throws IOException {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "MY_PROJECT_ID";
    String location = "MY_LOCATION";
    String connectionId = "MY_CONNECTION_ID";
    shareConnection(projectId, location, connectionId);
  }

  static void shareConnection(String projectId, String location, String connectionId)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      ResourceName resource = ConnectionName.of(projectId, location, connectionId);
      Binding binding =
          Binding.newBuilder()
              .addMembers("group:example-analyst-group@google.com")
              .setRole("roles/bigquery.connectionUser")
              .build();
      Policy policy = Policy.newBuilder().addBindings(binding).build();
      SetIamPolicyRequest request =
          SetIamPolicyRequest.newBuilder()
              .setResource(resource.toString())
              .setPolicy(policy)
              .build();
      client.setIamPolicy(request);
      System.out.println("Connection shared successfully");
    }
  }
}

料金

連携クエリと接続には、次の料金が適用されます。

次のステップ