Conectar a Cloud SQL

Como administrador de BigQuery, puedes crear una conexión para acceder a los datos de Cloud SQL. Esta conexión permite que los analistas de datos consulten datos en Cloud SQL. Para conectarte a Cloud SQL, debes seguir estos pasos:

  1. Crear una conexión de Cloud SQL
  2. Otorga acceso al agente de servicio de conexión de BigQuery.

Antes de comenzar

  1. Selecciona el proyecto que contiene la base de datos de Cloud SQL.

    Ir al selector de proyectos

  2. Habilita la API de conexión de BigQuery.

    Habilitar la API

  3. Asegúrate de que la instancia de Cloud SQL tenga una conexión de IP pública o una conexión privada:
    • Para proteger las instancias de Cloud SQL, puedes agregar conectividad de IP pública sin una dirección autorizada. Esto hace que la instancia sea inaccesible desde la Internet pública, pero accesible para las consultas de BigQuery.

    • Para permitir que BigQuery acceda a los datos de Cloud SQL a través de una conexión privada, configura la conectividad de IP privada en una instancia de Cloud SQL nueva o existente y, luego, selecciona la casilla de verificación Ruta privada para los servicios de Google Cloud Este servicio usa una ruta de acceso directa interna en lugar de la dirección IP privada dentro de la nube privada virtual.

  4. Para obtener los permisos que necesitas para crear una conexión de Cloud SQL, pídele a tu administrador que te otorgue el rol de IAM administrador de conexión de BigQuery (roles/bigquery.connectionAdmin) en el proyecto. Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso.

    También puedes obtener los permisos necesarios mediante roles personalizados o cualquier otro rol predefinido.

Crea conexiones de Cloud SQL

Como práctica recomendada, usa conexiones para controlar las credenciales de la base de datos cuando te conectes a Cloud SQL. Las conexiones se encriptan y almacenan de forma segura en el servicio de conexión de BigQuery. Si las credenciales del usuario son válidas para otros datos en el origen, puedes volver a usar la conexión. Por ejemplo, es posible que puedas usar una conexión para consultar varias bases de datos que residan en la misma instancia de Cloud SQL.

Selecciona una de las opciones siguientes para crear una conexión de Cloud SQL:

Consola

  1. Ve a la página de BigQuery.

    Ir a BigQuery

  2. En el panel Explorador, haz clic en Agregar datos.

  3. En el diálogo Agregar datos, haz clic en Conexiones a fuentes de datos externas:

  4. En el diálogo Fuente de datos externa, ingresa la siguiente información:

    • En Tipo de conexión, selecciona el tipo de fuente, por ejemplo, MySQL o Postgres.
    • En ID de conexión, ingresa un identificador para el recurso de conexión. Se permiten letras, números y guiones bajos. Por ejemplo, bq_sql_connection
    • En Ubicación de los datos, selecciona una ubicación (o región) de BigQuery que sea compatible con la región de la fuente de datos externa.
    • En Nombre descriptivo, ingresa un nombre fácil de usar para la conexión, como My connection resource (opcional). El nombre descriptivo puede ser cualquier valor que te ayude a identificar el recurso de conexión si necesitas modificarlo más adelante.
    • En Descripción, ingresa una descripción para este recurso de conexión (opcional).
    • Opcional: Encriptación Si deseas usar una clave de encriptación administrada por el cliente (CMEK) para encriptar tus credenciales, selecciona Clave de encriptación administrada por el cliente (CMEK) y, luego, selecciona una clave administrada por el cliente. De lo contrario, tus credenciales están protegidas con la clave de encriptación predeterminada administrada por Google.
    • Si eliges MySQL o Postgres de Cloud SQL para el tipo de conexión, haz lo siguiente:nombre de la conexión de Cloud SQL, ingresa el nombre completo de la instancia de Cloud SQL, por lo general, en el formatoproject-id:location-id:instance-id. Puedes encontrar el ID de la instancia en la página de detalles de la instancia de Cloud SQL que deseas consultar.
    • En Nombre de la base de datos (Database name), ingresa el nombre de la base de datos.
    • En Nombre de usuario de la base de datos, ingresa el nombre de usuario para la base de datos.
    • En Contraseña de la base de datos, ingresa la contraseña para la base de datos.

      • Opcional: Para ver la contraseña, haz clic en Mostrar contraseña.
  5. Haga clic en Crear conexión.

  6. Haz clic en Ir a la conexión.

  7. En el panel Información de conexión, copia el ID de la cuenta de servicio para usarlo en un paso siguiente.

bq

Ingresa el comando bq mk y proporciona la marca de conexión --connection. También se requieren las siguientes marcas:

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

Las siguientes marcas son opcionales:

  • --display_name El nombre descriptivo de la conexión.
  • --description Es una descripción de la conexión.

El connection_id es un parámetro opcional que se puede agregar como el último argumento del comando que se usa para el almacenamiento de forma interna. Si no se proporciona un ID de conexión, se genera un ID único de forma automática. El connection_id pueden contener letras, números y guiones bajos.

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

Reemplaza lo siguiente:

  • TYPE: Es el tipo de la fuente de datos externa.
  • PROPERTIES: Son los parámetros para la conexión creada en formato JSON. Por ejemplo: --properties='{"param":"param_value"}'. Para crear un recurso de conexión, debes proporcionar los parámetros instanceID, database y type.
  • CREDENTIALS: Son los parámetros username y password.
  • PROJECT_ID: Es el ID de tu proyecto.
  • LOCATION: Es la región en la que se encuentra tu instancia de Cloud SQL.
  • CONNECTION_ID: Es el identificador de conexión.

Por ejemplo, con el siguiente comando, se crea un recurso de conexión nuevo llamado my_new_connection (nombre descriptivo: “Mi conexión nueva”) en un proyecto con el 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

Dentro de la API de conexión de BigQuery, puedes invocar CreateConnection dentro de ConnectionService para crear una instancia de conexión. Consulta la página de la biblioteca cliente para obtener más detalles.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

Otorga acceso a la cuenta de servicio

Una cuenta de servicio se crea automáticamente cuando creas la primera conexión a Cloud SQL dentro del proyecto. El nombre de la cuenta de servicio es Agente de servicio de conexión de BigQuery. Para obtener el ID de la cuenta de servicio, consulta los detalles de la conexión. El ID de la cuenta de servicio tiene el siguiente formato:

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

Para conectarte a Cloud SQL, debes otorgar a la nueva conexión acceso de solo lectura a Cloud SQL para que BigQuery pueda acceder a los archivos en nombre de los usuarios. La cuenta de servicio debe tener los siguientes permisos:

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

Puedes otorgar a la cuenta de servicio asociada con la conexión el rol de IAM de cliente de Cloud SQL (roles/cloudsql.client), que tiene estos permisos asignados. Puedes omitir este paso si la cuenta de servicio ya tiene los permisos necesarios.

Consola

  1. Ir a la página IAM y administración

    Ir a IAM y administración

  2. Haz clic en Otorgar acceso.

    Se abre el cuadro de diálogo Agregar principales.

  3. En el campo Principales nuevas, ingresa el nombre de la cuenta de servicio Agente de servicio de conexión de BigQuery o el ID de la cuenta de servicio tomado de la información de conexión.

  4. En el campo Selecciona un rol, elige Cloud SQL y, luego, selecciona Cliente de Cloud SQL.

  5. Haz clic en Guardar.

gcloud

Usa el comando de gcloud projects add-iam-policy-binding:

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

Ingresa los siguientes valores:

  • PROJECT_ID es el ID del proyecto de Google Cloud.
  • SERVICE_ACCOUNT_ID: El ID de la cuenta de servicio que se toma de la información de conexión.

Comparte conexiones con usuarios

Puedes otorgar los siguientes roles para permitir que los usuarios consulten datos y administren conexiones:

  • roles/bigquery.connectionUser: Permite que los usuarios usen conexiones para conectarse con fuentes de datos externas y ejecutar consultas en ellas.

  • roles/bigquery.connectionAdmin: Permite que los usuarios administren conexiones.

Para obtener más información sobre los roles y los permisos de IAM en BigQuery, consulta Roles y permisos predefinidos.

Selecciona una de las opciones siguientes:

Console

  1. Ve a la página de BigQuery.

    Ir a BigQuery

    Las conexiones se enumeran en tu proyecto, en un grupo llamado Conexiones externas.

  2. En el panel Explorador, haz clic en el nombre de tu proyecto > Conexiones externas > conexión.

  3. En el panel Detalles, haz clic en Compartir para compartir una conexión. A continuación, sigue estos pasos:

    1. En el cuadro de diálogo Permisos de conexión, agrega o edita las principales para compartir la conexión con otros principales.

    2. Haz clic en Guardar.

bq

No puedes compartir una conexión con la herramienta de línea de comandos de bq. Para compartir una conexión, usa la consola de Google Cloud o el método de la API de conexiones de BigQuery.

API

Consulta el método projects.locations.connections.setIAM en la sección de referencia de la API de REST de las conexiones de BigQuery y proporciona una instancia del recurso policy.

Java

Antes de probar este ejemplo, sigue las instrucciones de configuración para Java incluidas en la guía de inicio rápido de BigQuery sobre cómo usar bibliotecas cliente. Para obtener más información, consulta la documentación de referencia de la API de BigQuery para Java.

Para autenticarte en BigQuery, configura las credenciales predeterminadas de la aplicación. Si deseas obtener más información, consulta Configura la autenticación para bibliotecas cliente.

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

¿Qué sigue?