Se connecter à Cloud SQL

En tant qu'administrateur BigQuery, vous pouvez créer une connexion permettant d'accéder aux données Cloud SQL. Cette connexion permet aux analystes de données d'interroger des données dans Cloud SQL. Pour vous connecter à Cloud SQL, procédez comme suit :

  1. Créer une connexion Cloud SQL
  2. Accordez l'accès à l'agent du service de connexion BigQuery.

Avant de commencer

  1. Sélectionnez le projet contenant la base de données Cloud SQL.

    Accéder au sélecteur de projet

  2. Activez l'API BigQuery Connection.

    Activer l'API

  3. Assurez-vous que l'instance Cloud SQL dispose d'une connexion IP publique ou d'une connexion privée :
    • Pour sécuriser vos instances Cloud SQL, vous pouvez ajouter une connectivité IP publique sans adresse autorisée. L'instance devient ainsi inaccessible depuis l'Internet public, mais accessible aux requêtes depuis BigQuery.

    • Pour permettre à BigQuery d'accéder aux données Cloud SQL via une connexion privée, configurez la connectivité IP privée pour une instance Cloud SQL nouvelle ou existante, puis sélectionnez la case à cocher Chemin d'accès privé pour les services Google Cloud. Ce service utilise un chemin d'accès direct interne au lieu de l'adresse IP privée dans le cloud privé virtuel.

  4. Pour obtenir les autorisations nécessaires pour créer une connexion Cloud SQL, demandez à votre administrateur de vous accorder le rôle IAM Administrateur de connexion BigQuery (roles/bigquery.connectionAdmin) sur le projet. Pour en savoir plus sur l'attribution de rôles, consultez la section Gérer les accès.

    Vous pouvez également obtenir les autorisations requises via des rôles personnalisés ou d'autres rôles prédéfinis.

Créer des connexions Cloud SQL

Il est recommandé d'utiliser des connexions pour gérer les identifiants de base de données lorsque vous vous connectez à Cloud SQL. Les connexions sont chiffrées et stockées de manière sécurisée dans le service de connexion BigQuery. Si les identifiants utilisateur sont valides pour d'autres données de la source, vous pouvez réutiliser la connexion. Par exemple, vous pouvez utiliser une connexion pour interroger plusieurs bases de données résidant dans la même instance Cloud SQL.

Sélectionnez l'une des options suivantes pour créer une connexion Cloud SQL :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

  2. Dans le volet Explorateur, cliquez sur  Ajouter des données.

  3. Dans la boîte de dialogue Ajouter des données, cliquez sur Connexions aux sources de données externes :

  4. Dans la boîte de dialogue Source de données externes, saisissez les informations suivantes :

    • Dans le champ Type de connexion, sélectionnez le type de source, par exemple MySQL ou Postgres.
    • Dans le champ Connection ID (ID de connexion), saisissez un identifiant pour la ressource de connexion. Les lettres, les chiffres et les traits de soulignement sont autorisés. Exemple : bq_sql_connection.
    • Pour Emplacement des données, sélectionnez un emplacement (ou une région) BigQuery compatible avec votre région de source de données externe.
    • Facultatif : Dans le champ Nom descriptif, saisissez un nom clair pour identifier la connexion, tel que My connection resource. Le nom descriptif peut être n'importe quelle valeur permettant d'identifier la ressource de connexion si vous devez la modifier par la suite.
    • Facultatif : Dans le champ Description, saisissez une description pour la ressource de connexion.
    • Facultatif : Chiffrement : Si vous souhaitez utiliser une clé de chiffrement gérée par le client (CMEK) pour chiffrer vos identifiants, sélectionnez Clé de chiffrement gérée par le client (CMEK), puis sélectionnez une clé gérée par le client. Sinon, vos identifiants sont protégés par la clé de chiffrement par défaut gérée par Google.
    • Si vous avez choisi Cloud SQL MySQL ou Postgres comme type de connexion, saisissez dans le champ Nom de la connexion Cloud SQL lenom complet de l'instance Cloud SQL, généralement au format project-id:location-id:instance-id. Vous pouvez trouver l'ID d'instance sur la page des détails de l'instance Cloud SQL que vous souhaitez interroger.
    • Dans le champ Nom de la base de données, saisissez le nom de la base de données.
    • Comme Nom d'utilisateur de base de données, saisissez le nom d'utilisateur de la base de données.
    • Dans le champ Mot de passe de la base de données, saisissez le mot de passe d'accès à la base de données.

      • Facultatif : Pour afficher le mot de passe, cliquez sur Afficher le mot de passe.
      .
  5. Cliquez sur Créer une connexion.

  6. Cliquez sur Accéder à la connexion.

  7. Dans le volet Informations de connexion, copiez l'ID du compte de service à utiliser à l'étape suivante.

bq

Saisissez la commande bq mk, puis indiquez l'option de connexion --connection. Les paramètres suivants sont également requis :

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

Les options suivantes sont facultatives :

  • --display_name : nom descriptif de la connexion.
  • --description : description de la connexion.

Le connection_id est un paramètre facultatif qui peut être ajouté en tant que dernier argument de la commande utilisée pour le stockage en interne. Si aucun ID de connexion n'est fourni, un ID unique est généré automatiquement. Le connection_id peut contenir des lettres, des chiffres et des traits de soulignement.

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

Remplacez les éléments suivants :

  • TYPE : type de la source de données externe.
  • PROPERTIES : les paramètres de la connexion créée au format JSON. Exemple : --properties='{"param":"param_value"}'. Pour créer une ressource de connexion, vous devez fournir les paramètres instanceID, database et type.
  • CREDENTIALS : les paramètres username et password.
  • PROJECT_ID : ID de votre projet.
  • LOCATION : région où se trouve votre instance Cloud SQL.
  • CONNECTION_ID : identifiant de la connexion.

Par exemple, la commande suivante crée une ressource de connexion nommée "my_new_connection" (nom descriptif : "My new connection") dans un projet ayant l'ID federation-test.

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

Au sein de l'API BigQuery Connection, vous pouvez appeler CreateConnection dans ConnectionService pour instancier une connexion. Pour en savoir plus, consultez la page sur les bibliothèques clientes.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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

Accorder l'accès au compte de service

Un compte de service est créé automatiquement lorsque vous créez la première connexion à Cloud SQL au sein du projet. Le nom du compte de service est Agent du service de connexion BigQuery. Pour obtenir l'ID du compte de service, affichez vos informations de connexion. L'ID du compte de service est au format suivant :

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

Pour vous connecter à Cloud SQL, vous devez accorder à la nouvelle connexion un accès en lecture seule à Cloud SQL afin que BigQuery puisse accéder aux fichiers pour le compte des utilisateurs. Le compte de service doit disposer des autorisations suivantes :

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

Vous pouvez accorder au compte de service associé à la connexion le rôle IAM de client Cloud SQL (roles/cloudsql.client), qui dispose de ces autorisations. Vous pouvez omettre cette étape si le compte de service dispose déjà des autorisations requises.

Console

  1. Accédez à la page IAM et administration.

    Accéder à IAM et administration

  2. Cliquez sur Accorder l'accès.

    La boîte de dialogue Ajouter des comptes principaux s'ouvre.

  3. Dans le champ Nouveaux comptes principaux, saisissez le nom du compte de service Agent du service de connexion BigQuery ou l'ID du compte de service récupéré depuis les informations de connexion.

  4. Dans le champ Sélectionner un rôle, sélectionnez Cloud SQL, puis Client Cloud SQL.

  5. Cliquez sur Enregistrer.

gcloud

Exécutez la commande gcloud projects add-iam-policy-binding :

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

Indiquez les valeurs suivantes :

  • PROJECT_ID : ID de votre projet Google Cloud.
  • SERVICE_ACCOUNT_ID : ID du compte de service issu des informations de connexion.

Partager des connexions avec les utilisateurs

Vous pouvez attribuer les rôles suivants pour permettre aux utilisateurs d'interroger des données et de gérer les connexions :

  • roles/bigquery.connectionUser permet aux utilisateurs de se connecter à des sources de données externes et d'y exécuter des requêtes.

  • roles/bigquery.connectionAdmin permet aux utilisateurs de gérer les connexions.

Pour en savoir plus sur les rôles et les autorisations IAM dans BigQuery, consultez la page Rôles prédéfinis et autorisations.

Sélectionnez l'une des options suivantes :

Console

  1. Accédez à la page BigQuery.

    Accéder à BigQuery

    Les connexions sont répertoriées dans votre projet, dans un groupe appelé Connexions externes.

  2. Dans le volet Explorateur, cliquez sur votre nom de projet > Connexions externes > connexion.

  3. Dans le volet Détails, cliquez sur Partager pour partager une connexion. Ensuite, procédez comme suit :

    1. Dans la boîte de dialogue Autorisations de connexion, partagez la connexion avec d'autres comptes principaux en ajoutant ou en modifiant des comptes principaux.

    2. Cliquez sur Enregistrer.

bq

Vous ne pouvez pas partager de connexion avec l'outil de ligne de commande bq. Pour partager une connexion, utilisez la console Google Cloud ou la méthode de l'API BigQuery Connections permettant le partage de connexion.

API

Utilisez la méthode projects.locations.connections.setIAM dans la section de référence de l'API REST BigQuery Connections et fournissez une instance de la ressource policy.

Java

Avant d'essayer cet exemple, suivez les instructions de configuration pour Java du guide de démarrage rapide de BigQuery : Utiliser les bibliothèques clientes. Pour en savoir plus, consultez la documentation de référence de l'API BigQuery pour Java.

Pour vous authentifier auprès de BigQuery, configurez le service Identifiants par défaut de l'application. Pour en savoir plus, consultez la page Configurer l'authentification pour les bibliothèques clientes.

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

Étapes suivantes