Connettiti a Cloud SQL

In qualità di amministratore di BigQuery, puoi creare una connessione per accedere ai dati di Cloud SQL. Questa connessione consente agli analisti di dati di eseguire query sui dati in Cloud SQL. Per connetterti a Cloud SQL, devi seguire questi passaggi:

  1. Crea una connessione Cloud SQL
  2. Concedi l'accesso all'agente di servizio connessione BigQuery.

Prima di iniziare

  1. Seleziona il progetto che contiene il database Cloud SQL.

    Vai al selettore di progetti

  2. Abilita l'API BigQuery Connection.

    Abilita l'API

  3. Assicurati che l'istanza Cloud SQL abbia una connessione IP pubblica o una connessione privata:
    • Per proteggere le istanze Cloud SQL, puoi aggiungere la connettività IP pubblica senza un indirizzo autorizzato. In questo modo, l'istanza non è accessibile dalla rete internet pubblica, ma è accessibile alle query da BigQuery.

    • Per consentire a BigQuery di accedere ai dati di Cloud SQL tramite una connessione privata, configura la connettività IP privata per una nuova o un'istanza Cloud SQL esistente, quindi seleziona la casella di controllo Abilita percorso privato. Questo servizio utilizza un percorso diretto interno anziché l'indirizzo IP privato all'interno di Virtual Private Cloud.

  4. Per ottenere le autorizzazioni necessarie per creare una connessione Cloud SQL, chiedi all'amministratore di concederti il ruolo IAM Amministratore connessione BigQuery (roles/bigquery.connectionAdmin) nel progetto. Per saperne di più sulla concessione dei ruoli, consulta Gestisci l'accesso a progetti, cartelle e organizzazioni.

    Potresti anche riuscire a ottenere le autorizzazioni richieste tramite i ruoli personalizzati o altri ruoli predefiniti.

Crea connessioni Cloud SQL

Come best practice, utilizza le connessioni per gestire le credenziali del database quando ti connetti a Cloud SQL. Le connessioni vengono criptate e archiviate in modo sicuro nel servizio di connessione BigQuery. Se le credenziali utente sono valide per altri dati nell'origine, puoi riutilizzare la connessione. Ad esempio, potresti essere in grado di utilizzare una connessione per eseguire query su più database che risiedono nella stessa istanza Cloud SQL.

Seleziona una delle seguenti opzioni per creare una connessione Cloud SQL:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

  2. Nel riquadro Spazio di esplorazione, fai clic su Aggiungi.

    Si apre la finestra di dialogo Aggiungi dati.

  3. Nel riquadro Filtra per, nella sezione Tipo di origine dati, seleziona Database.

    In alternativa, nel campo Cerca origini dati puoi inserire mysql.

  4. Nella sezione Origini dati in primo piano, fai clic su MySQL.

  5. Fai clic sulla scheda della soluzione CloudSQL (MySQL): federazione BigQuery.

  6. Nella finestra di dialogo Origine dati esterna, inserisci le seguenti informazioni:

    • In Tipo di connessione, seleziona il tipo di origine, ad esempio MySQL o PostgreSQL.
    • In ID connessione, inserisci un identificatore per la risorsa di connessione. Sono consentite lettere, numeri e trattini bassi. Ad esempio, bq_sql_connection.
    • In Località dati, seleziona una località BigQuery (o una regione) compatibile con la regione dell'origine dati esterna.
    • (Facoltativo) In Nome visualizzato, inserisci un nome intuitivo per la connessione, ad esempio My connection resource. Il nome visualizzato può essere qualsiasi valore che ti aiuti a identificare la risorsa di connessione se devi modificarla in un secondo momento.
    • (Facoltativo) In Descrizione, inserisci una descrizione per questa risorsa di connessione.
    • (Facoltativo) Crittografia Se vuoi utilizzare una chiave di crittografia gestita dal cliente (CMEK) per criptare le credenziali, seleziona Chiave di crittografia gestita dal cliente (CMEK) , quindi seleziona una chiave gestita dal cliente. In caso contrario, le credenziali sono protette per impostazione predefinita Google-owned and Google-managed encryption key.
    • Se hai scelto Cloud SQL MySQL o Postgres per il tipo di connessione, in Nome connessione Cloud SQL, inserisci il nome completo dell'istanza Cloud SQL, in genere nel formato project-id:location-id:instance-id. Puoi trovare l'ID istanza nella pagina dei dettagli dell' istanza Cloud SQL su cui vuoi eseguire query.
    • In Nome database, inserisci il nome del database.
    • In Nome utente database, inserisci il nome utente del database.
    • In Password database, inserisci la password del database.

      • (Facoltativo) Per visualizzare la password, fai clic su Mostra password.
  7. Fai clic su Crea connessione.

  8. Fai clic su Vai alla connessione.

  9. Nel riquadro Informazioni sulla connessione, copia l'ID del account di servizio da utilizzare in un passaggio successivo.

bq

Inserisci il comando bq mk e fornisci il flag di connessione: --connection. Sono necessari anche i seguenti flag:

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

I seguenti flag sono facoltativi:

  • --display_name: il nome visualizzato della connessione.
  • --description: una descrizione della connessione.
  • --kms_key_name: una chiave di crittografia gestita dal cliente. Se omesso, le credenziali sono protette per impostazione predefinita Google-owned and Google-managed encryption key.

connection_id è un parametro facoltativo che può essere aggiunto come ultimo argomento del comando utilizzato per l'archiviazione interna. Se non viene fornito un ID connessione, viene generato automaticamente un ID univoco. connection_id può contenere lettere, numeri e trattini bassi.

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

Sostituisci quanto segue:

  • TYPE: il tipo di origine dati esterna.
  • PROPERTIES: i parametri per la connessione creata in formato JSON. Ad esempio: --properties='{"param":"param_value"}'. Per creare una risorsa di connessione, devi fornire i parametri instanceID, database e type.
  • CREDENTIALS: i parametri username e password.
  • PROJECT_ID: il tuo ID progetto.
  • LOCATION: la regione in cui si trova l'istanza Cloud SQL o la regione multipla corrispondente.
  • CONNECTION_ID: l'identificatore della connessione.

Ad esempio, il seguente comando crea una nuova risorsa di connessione denominata my_new_connection (nome visualizzato: "My new connection") in un progetto con 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

Nell'API BigQuery Connection, puoi richiamare CreateConnection all'interno di ConnectionService per creare un'istanza di una connessione. Per maggiori dettagli, consulta la pagina della libreria client.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell' API Java di BigQuery.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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

Concedi l'accesso al service agent

Un service agent viene creato automaticamente quando crei la prima connessione a Cloud SQL all'interno del progetto. Il nome del service agent è Agente di servizio connessione BigQuery. Per ottenere l'ID del service agent, visualizza i dettagli della connessione. L'ID del service agent ha il seguente formato:

service-PROJECT_NUMBER@gcp-sa-bigqueryconnection..

Per connetterti a Cloud SQL, devi concedere alla nuova connessione l'accesso in sola lettura a Cloud SQL in modo che BigQuery possa accedere ai file per conto degli utenti. Il service agent deve disporre delle seguenti autorizzazioni:

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

Puoi concedere al service agent associato alla connessione il ruolo IAM Client Cloud SQL (roles/cloudsql.client), a cui sono assegnate queste autorizzazioni. Puoi saltare i passaggi seguenti se il service agent dispone già delle autorizzazioni richieste.

Console

  1. Vai alla pagina IAM e amministrazione.

    Vai a IAM e amministrazione

  2. Fai clic su Concedi l'accesso.

    Si apre la finestra di dialogo Aggiungi entità.

  3. Nel campo Nuove entità, inserisci il nome del service agent Agente di servizio connessione BigQuery o l'ID del service agent ricavato da le informazioni sulla connessione.

  4. Nel campo Seleziona un ruolo, seleziona Cloud SQL, quindi seleziona Client Cloud SQL.

  5. Fai clic su Salva.

gcloud

Utilizza il gcloud projects add-iam-policy-binding comando:

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

Fornisci i seguenti valori:

Condividi le connessioni con gli utenti

Puoi concedere i seguenti ruoli per consentire agli utenti di eseguire query sui dati e gestire le connessioni:

  • roles/bigquery.connectionUser: consente agli utenti di utilizzare le connessioni per connettersi a origini dati esterne ed eseguire query su di esse.

  • roles/bigquery.connectionAdmin: consente agli utenti di gestire le connessioni.

Per saperne di più sui ruoli e sulle autorizzazioni IAM in BigQuery, consulta Ruoli e autorizzazioni predefiniti.

Seleziona una delle seguenti opzioni:

Console

  1. Vai alla pagina BigQuery.

    Vai a BigQuery

    Le connessioni sono elencate nel progetto, in un gruppo denominato Connessioni.

  2. Nel riquadro a sinistra, fai clic su Spazio di esplorazione:

    Pulsante evidenziato per il riquadro Spazio di esplorazione.

    Se non vedi il riquadro a sinistra, fai clic su Espandi riquadro a sinistra per aprirlo.

  3. Fai clic sul progetto, su Connessioni, quindi seleziona una connessione.

  4. Nel riquadro Dettagli, fai clic su Condividi per condividere una connessione. Quindi:

    1. Nella finestra di dialogo Autorizzazioni connessione, condividi la connessione con altre entità aggiungendo o modificando le entità.

    2. Fai clic su Salva.

bq

Non puoi condividere una connessione con lo strumento a riga di comando bq. Per condividere una connessione, utilizza la Google Cloud console o il metodo dell'API BigQuery Connections per condividere una connessione.

API

Utilizza il projects.locations.connections.setIAM metodo nella sezione di riferimento dell'API REST BigQuery Connections e fornisci un'istanza della risorsa policy.

Java

Prima di provare questo esempio, segui le istruzioni di configurazione Java nella guida rapida di BigQuery per l'utilizzo delle librerie client. Per saperne di più, consulta la documentazione di riferimento dell' API Java di BigQuery.

Per eseguire l'autenticazione in BigQuery, configura le Credenziali predefinite dell'applicazione. Per saperne di più, vedi Configura l'autenticazione per le librerie client.

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

Passaggi successivi