Cloud SQL に接続する

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

  1. Cloud SQL 接続を作成する
  2. BigQuery Connection Service エージェントへのアクセス権を付与する

始める前に

  1. Cloud SQL データベースを含むプロジェクトを選択します。

    プロジェクト セレクタに移動

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

    API を有効にする

  3. Cloud SQL インスタンスにパブリック IP 接続またはプライベート接続が設定されていることを確認します。
    • Cloud SQL インスタンスを保護するために、承認済みアドレスを使用せずにパブリック IP 接続を追加できます。これにより、公共のインターネットからインスタンスにアクセスできなくなりますが、BigQuery からはクエリを実行できます。

    • プライベート接続を介して BigQuery から Cloud SQL データにアクセスするには、新規または既存の Cloud SQL インスタンスのプライベート IP 接続を構成し、Google Cloud サービスのプライベート パスのチェックボックスをオンにします。このサービスは、Virtual Private Cloud 内のプライベート IP アドレスの代わりに、内部直接パスを使用します。

  4. Cloud SQL 接続の作成に必要な権限を取得するには、そのプロジェクトで BigQuery Connection 管理者roles/bigquery.connectionAdmin)IAM ロールの付与を管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理に関する記事をご覧ください。

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

Cloud SQL 接続を作成する

ベスト プラクティスとして、Cloud SQL への接続時には、接続を使用してデータベース認証情報を処理します。接続は暗号化され、BigQuery Connection のサービスに安全に保存されます。ユーザー認証情報がソース内の他のデータに対して有効であれば、接続を再利用できます。たとえば、1 つの接続を使用して、同じ Cloud SQL インスタンスに存在する複数のデータベースにクエリを実行できる場合があります。

次のいずれかのオプションを選択して、Cloud SQL 接続を作成します。

コンソール

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

    [BigQuery] に移動

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

  3. [データを追加] ダイアログで、[外部データソースへの接続] をクリックします。

  4. [外部データソース] ペインで、次の情報を入力します。

    • [接続タイプ] で、ソースのタイプ(MySQL、Postgres など)を選択します。
    • [接続 ID] に、接続リソースの識別子を入力します。文字、数字、アンダースコアを使用できます。例: bq_sql_connection
    • [データのロケーション] で、外部データソースのリージョンと互換性のある BigQuery ロケーション(またはリージョン)を選択します。
    • 省略可: [わかりやすい名前] に、わかりやすい接続名を入力します(例: My connection resource)。後で修正が必要になった場合、わかりやすい名前だと接続リソースを簡単に識別できます。
    • 省略可: [説明] に、この接続リソースの説明を入力します。
    • 省略可: 暗号化顧客管理の暗号鍵(CMEK)を使用して認証情報を暗号化するには、[顧客管理の暗号鍵(CMEK)] を選択し、顧客管理の暗号鍵を選択します。それ以外の場合、認証情報は Google が管理するデフォルトの暗号鍵によって保護されます。
    • 接続タイプに Cloud SQL の MySQL または Postgres を選択した場合、[Cloud SQL 接続名] には完全な Cloud SQL インスタンスの名前を入力します(通常は project-id:location-id:instance-id の形式)。インスタンス ID は、クエリを実行する Cloud SQL インスタンスの詳細ページで見つけることができます。
    • [データベース名] に、データベースの名前を入力します。
    • [データベース ユーザー名] に、データベースのユーザー名を入力します。
    • [データベース パスワード] に、データベースのパスワードを入力します。

      • 省略可: パスワードを表示するには、[パスワードを表示] をクリックします。
  5. [接続を作成] をクリックします。

  6. [接続へ移動] をクリックします。

  7. [接続情報] ペインで、次の手順で使用するサービス アカウント ID をコピーします。

bq

bq mk コマンドを入力して、接続フラグ --connection を指定します。次のフラグも必要です。

  • --connection_type
  • --properties
  • --connection_credential
  • --project_id
  • --location

次のフラグは省略可能です。

  • --display_name 接続のわかりやすい名前。
  • --description 接続の説明。

connection_id は、コマンドの最後の引数として追加できるオプションのパラメータで、内部的な保存に使用されます。接続 ID を指定しない場合は、一意の ID が自動的に生成されます。connection_id には文字、数字、アンダースコアを使用できます。

    bq mk --connection --display_name='friendly name' --connection_type=TYPE \
      --properties=PROPERTIES --connection_credential=CREDENTIALS \
      --project_id=PROJECT_ID --location=LOCATION \
      CONNECTION_ID

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

  • TYPE: 外部データソースのタイプ。
  • PROPERTIES: JSON 形式で作成された接続のパラメータ。例: --properties='{"param":"param_value"}'。接続リソースを作成するには、instanceIDdatabasetype パラメータを指定する必要があります。
  • CREDENTIALS: パラメータ usernamepassword です。
  • PROJECT_ID: プロジェクト ID。
  • LOCATION: Cloud SQL インスタンスが配置されているリージョンです。
  • CONNECTION_ID: 接続 ID。

たとえば、次のコマンドを実行すると、ID federation-test の付いたプロジェクトに my_new_connection(わかりやすい名前: 「My new connection」)という名前の接続リソースが新規に作成されます。

bq mk --connection --display_name='friendly name' --connection_type='CLOUD_SQL' \
  --properties='{"instanceId":"federation-test:us-central1:mytestsql","database":"mydatabase","type":"MYSQL"}' \
  --connection_credential='{"username":"myusername", "password":"mypassword"}' \
  --project_id=federation-test --location=us my_connection_id

API

BigQuery Connection API では、ConnectionService 内で CreateConnection を呼び出して接続をインスタンス化できます。詳しくは、クライアント ライブラリのページをご覧ください。

Java

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

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

import com.google.cloud.bigquery.connection.v1.CloudSqlCredential;
import com.google.cloud.bigquery.connection.v1.CloudSqlProperties;
import com.google.cloud.bigquery.connection.v1.Connection;
import com.google.cloud.bigquery.connection.v1.CreateConnectionRequest;
import com.google.cloud.bigquery.connection.v1.LocationName;
import com.google.cloud.bigqueryconnection.v1.ConnectionServiceClient;
import java.io.IOException;

// Sample to create a connection with cloud MySql database
public class CreateConnection {

  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";
    String database = "MY_DATABASE";
    String instance = "MY_INSTANCE";
    String instanceLocation = "MY_INSTANCE_LOCATION";
    String username = "MY_USERNAME";
    String password = "MY_PASSWORD";
    String instanceId = String.format("%s:%s:%s", projectId, instanceLocation, instance);
    CloudSqlCredential cloudSqlCredential =
        CloudSqlCredential.newBuilder().setUsername(username).setPassword(password).build();
    CloudSqlProperties cloudSqlProperties =
        CloudSqlProperties.newBuilder()
            .setType(CloudSqlProperties.DatabaseType.MYSQL)
            .setDatabase(database)
            .setInstanceId(instanceId)
            .setCredential(cloudSqlCredential)
            .build();
    Connection connection = Connection.newBuilder().setCloudSql(cloudSqlProperties).build();
    createConnection(projectId, location, connectionId, connection);
  }

  static void createConnection(
      String projectId, String location, String connectionId, Connection connection)
      throws IOException {
    try (ConnectionServiceClient client = ConnectionServiceClient.create()) {
      LocationName parent = LocationName.of(projectId, location);
      CreateConnectionRequest request =
          CreateConnectionRequest.newBuilder()
              .setParent(parent.toString())
              .setConnection(connection)
              .setConnectionId(connectionId)
              .build();
      Connection response = client.createConnection(request);
      System.out.println("Connection created successfully :" + response.getName());
    }
  }
}

サービス アカウントへのアクセスを許可する

プロジェクト内で Cloud SQL への最初の接続を作成すると、サービス アカウントが自動的に作成されます。サービス アカウントの名前は BigQuery Connection Service エージェントです。サービス アカウント ID を取得するには、接続の詳細を表示します。サービス アカウント ID は以下の形式です。

service-PROJECT_NUMBER@gcp-sa-bigqueryconnection.iam.gserviceaccount.com

Cloud SQL に接続するには、新しい接続に Cloud SQL への読み取り専用アクセス権を付与し、BigQuery がユーザーに代わってファイルにアクセスできるようにする必要があります。このサービス アカウントには次の権限が必要です。

  • cloudsql.instances.connect
  • cloudsql.instances.get

接続に関連付けられているサービス アカウントに、これらの権限が割り当てられている Cloud SQL クライアント IAM ロールroles/cloudsql.client)を付与できます。サービス アカウントに必要な権限がすでにある場合は、この手順を省略できます。

コンソール

  1. [IAM と管理] ページに移動します。

    [IAM と管理] に移動

  2. [アクセス権を付与] をクリックします。

    [プリンシパルを追加] ダイアログが開きます。

  3. 新しいプリンシパル フィールドに、サービス アカウントの名前( BigQuery Connection Service エージェント、または接続情報から取得したサービス アカウント ID)を入力します。

  4. [ロールを選択] フィールドで [Cloud SQL] を選択し、[Cloud SQL クライアント] を選択します。

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

gcloud

gcloud projects add-iam-policy-binding コマンドを実行します。

gcloud projects add-iam-policy-binding PROJECT_ID --member=serviceAccount:SERVICE_ACCOUNT_ID --role=roles/cloudsql.client

次の値を指定します。

  • PROJECT_ID: Google Cloud プロジェクト ID。
  • SERVICE_ACCOUNT_ID: 接続情報から取得したサービス アカウント ID。

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

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

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

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

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

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

コンソール

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

    [BigQuery] に移動

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

  2. [エクスプローラ] ペインで、[プロジェクト名] > [外部接続] > [接続] の順にクリックします。

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

    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");
    }
  }
}

次のステップ