Connettiti utilizzando i connettori di lingua Cloud SQL

I connettori Cloud SQL sono librerie che forniscono crittografia e autorizzazione basata su Identity and Access Management (IAM) quando ti connetti a un'istanza Cloud SQL. Non possono fornire un percorso di rete a un'istanza Cloud SQL se non è già presente.

Altri modi per connettersi a un'istanza Cloud SQL includono l'utilizzo di un client di database o del proxy di autenticazione Cloud SQL. Per ulteriori informazioni sulla connessione a un'istanza Cloud SQL, consulta la pagina Informazioni sulle opzioni di connessione.

Questa pagina illustra i seguenti connettori Cloud SQL:

  • Il connettore Java Cloud SQL
  • Connettore Python Cloud SQL (Apri in Colab)
  • Connettore Cloud SQL Go
  • Connettore Node.js Cloud SQL

Vantaggi

L'utilizzo di un connettore Cloud SQL offre i seguenti vantaggi:

  • Autorizzazione IAM:utilizza le autorizzazioni IAM per controllare chi o cosa può connettersi alle tue istanze Cloud SQL.
  • Comodità:rimuove la necessità di gestire i certificati SSL, configurare le regole del firewall o attivare le reti autorizzate.

Prima di iniziare

  • Abilita l'API Cloud SQL Admin.

    Enable the API

  • Crea un'istanza Cloud SQL, inclusa la configurazione dell'utente predefinito.

    Per ulteriori informazioni sulla creazione di istanze, consulta Creare istanze.

    Per ulteriori informazioni sulla configurazione dell'utente predefinito, vedi Impostare la password per l'account utente predefinito.

  • Configura i ruoli e le autorizzazioni necessari per connetterti a un'istanza Cloud SQL.

Configurazione

Java

Il connettore Java Cloud SQL è una libreria che fornisce autorizzazione e crittografia basate su IAM quando ti connetti a un'istanza Cloud SQL. Non può fornire un percorso di rete a un'istanza Cloud SQL se non è già presente.

Installa

Per istruzioni su come creare e utilizzare i driver per JDBC e R2DBC con il connettore Java Cloud SQL, consulta i seguenti link:

Per esempi di utilizzo di questa libreria nel contesto di un'applicazione, consulta queste applicazioni di esempio.

Autentica

Questa libreria utilizza le credenziali predefinite dell'applicazione per autenticare la connessione al server Cloud SQL.

Per attivare le credenziali localmente, utilizza il seguente comando gcloud:

    gcloud auth application-default login
    

Connettiti a IntelliJ

Per collegare IntelliJ all'istanza Cloud SQL, devi aggiungere la libreria come file JAR con le dipendenze nella sezione File aggiuntivi della pagina delle impostazioni del driver. Ad esempio, per questo scopo puoi trovare i file JAR precompilati nella pagina Uscite del connettore Java per Cloud SQL.

Python

Il connettore Python Cloud SQL è una libreria che può essere utilizzata insieme a un driver del database per consentire agli utenti con autorizzazioni sufficienti di connettersi a un database Cloud SQL senza dover inserire manualmente gli IP nella lista consentita o gestire i certificati SSL.

Per esempi interattivi sull'utilizzo del connettore Python Cloud SQL, apri il notebook del connettore Python Cloud SQL.

Il driver supportato da SQL Server è pytds.

Installa

Per installare la versione più recente del connettore Python Cloud SQL, utilizza il comando pip install e specifica il driver pytds per il tuo database:

    pip install "cloud-sql-python-connector[pytds]"
    

Autentica

Questa libreria utilizza le credenziali predefinite dell'applicazione per autenticare la connessione al server Cloud SQL.

Per attivare le credenziali localmente, utilizza il seguente comando gcloud:

    gcloud auth application-default login
    

Vai

Il connettore Cloud SQL Go è un connettore Cloud SQL progettato per l'utilizzo con il linguaggio Go. Per una maggiore sicurezza, questo connettore utilizza una crittografia TLS 1.3 robusta e autenticata manualmente tra il connettore client e il proxy lato server, indipendentemente dal protocollo del database.

Installa

Puoi installare questo repository con go get:

    go get cloud.google.com/go/cloudsqlconn
    

Node.js

Il connettore Node.js è una libreria progettata per l'utilizzo con il runtime Node.js che consente di connettersi in modo sicuro all'istanza Cloud SQL.

Installa

Puoi installare la libreria con npm install:

    npm install @google-cloud/cloud-sql-connector
    

Utilizza

Java

Per visualizzare questo snippet nel contesto di un'applicazione web, consulta il file README su GitHub.


import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;

public class ConnectorConnectionPoolFactory extends ConnectionPoolFactory {

  // Note: Saving credentials in environment variables is convenient, but not
  // secure - consider a more secure solution such as
  // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  // keep secrets safe.
  private static final String INSTANCE_CONNECTION_NAME =
      System.getenv("INSTANCE_CONNECTION_NAME");
  private static final String DB_USER = System.getenv("DB_USER");
  private static final String DB_PASS = System.getenv("DB_PASS");
  private static final String DB_NAME = System.getenv("DB_NAME");

  public static DataSource createConnectionPool() {
    // The configuration object specifies behaviors for the connection pool.
    HikariConfig config = new HikariConfig();

    // The following is equivalent to setting the config options below:
    // jdbc:sqlserver://;user=<DB_USER>;password=<DB_PASS>;databaseName=<DB_NAME>;
    // socketFactoryClass=com.google.cloud.sql.sqlserver.SocketFactory;
    // socketFactoryConstructorArg=<INSTANCE_CONNECTION_NAME>

    // See the link below for more info on building a JDBC URL for the Cloud SQL JDBC Socket Factory
    // https://github.com/GoogleCloudPlatform/cloud-sql-jdbc-socket-factory#creating-the-jdbc-url

    // Configure which instance and what database user to connect with.
    config
        .setDataSourceClassName("com.microsoft.sqlserver.jdbc.SQLServerDataSource");
    config.setUsername(DB_USER); // e.g. "root", "sqlserver"
    config.setPassword(DB_PASS); // e.g. "my-password"
    config.addDataSourceProperty("databaseName", DB_NAME);

    config.addDataSourceProperty("socketFactoryClass",
        "com.google.cloud.sql.sqlserver.SocketFactory");
    config.addDataSourceProperty("socketFactoryConstructorArg", INSTANCE_CONNECTION_NAME);

    // The Java Connector provides SSL encryption, so it should be disabled
    // at the driver level.
    config.addDataSourceProperty("encrypt", "false");

    // ... Specify additional connection properties here.
    // ...

    // Initialize the connection pool using the configuration object.
    return new HikariDataSource(config);
  }
}

Python

Per istruzioni dettagliate sull'utilizzo della libreria, consulta Come utilizzare questo connettore. Visualizza il codice di test di connessione di esempio su GitHub.

import os

from google.cloud.sql.connector import Connector, IPTypes
import pytds

import sqlalchemy


def connect_with_connector() -> sqlalchemy.engine.base.Engine:
    """
    Initializes a connection pool for a Cloud SQL instance of SQL Server.

    Uses the Cloud SQL Python Connector package.
    """
    # Note: Saving credentials in environment variables is convenient, but not
    # secure - consider a more secure solution such as
    # Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
    # keep secrets safe.

    instance_connection_name = os.environ[
        "INSTANCE_CONNECTION_NAME"
    ]  # e.g. 'project:region:instance'
    db_user = os.environ.get("DB_USER", "")  # e.g. 'my-db-user'
    db_pass = os.environ["DB_PASS"]  # e.g. 'my-db-password'
    db_name = os.environ["DB_NAME"]  # e.g. 'my-database'

    ip_type = IPTypes.PRIVATE if os.environ.get("PRIVATE_IP") else IPTypes.PUBLIC

    connector = Connector(ip_type)

    connect_args = {}
    # If your SQL Server instance requires SSL, you need to download the CA
    # certificate for your instance and include cafile={path to downloaded
    # certificate} and validate_host=False. This is a workaround for a known issue.
    if os.environ.get("DB_ROOT_CERT"):  # e.g. '/path/to/my/server-ca.pem'
        connect_args = {
            "cafile": os.environ["DB_ROOT_CERT"],
            "validate_host": False,
        }

    def getconn() -> pytds.Connection:
        conn = connector.connect(
            instance_connection_name,
            "pytds",
            user=db_user,
            password=db_pass,
            db=db_name,
            **connect_args
        )
        return conn

    pool = sqlalchemy.create_engine(
        "mssql+pytds://",
        creator=getconn,
        # ...
    )
    return pool

Vai

Per istruzioni dettagliate sull'utilizzo della libreria, consulta Utilizzo. Visualizza il codice di test di connessione di esempio su GitHub.

package cloudsql

import (
	"context"
	"database/sql"
	"fmt"
	"log"
	"net"
	"os"

	"cloud.google.com/go/cloudsqlconn"
	mssql "github.com/denisenkom/go-mssqldb"
)

type csqlDialer struct {
	dialer     *cloudsqlconn.Dialer
	connName   string
	usePrivate bool
}

// DialContext adheres to the mssql.Dialer interface.
func (c *csqlDialer) DialContext(ctx context.Context, network, addr string) (net.Conn, error) {
	var opts []cloudsqlconn.DialOption
	if c.usePrivate {
		opts = append(opts, cloudsqlconn.WithPrivateIP())
	}
	return c.dialer.Dial(ctx, c.connName, opts...)
}

func connectWithConnector() (*sql.DB, error) {
	mustGetenv := func(k string) string {
		v := os.Getenv(k)
		if v == "" {
			log.Fatalf("Fatal Error in connect_connector.go: %s environment variable not set.\n", k)
		}
		return v
	}
	// Note: Saving credentials in environment variables is convenient, but not
	// secure - consider a more secure solution such as
	// Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
	// keep secrets safe.
	var (
		dbUser                 = mustGetenv("DB_USER")                  // e.g. 'my-db-user'
		dbPwd                  = mustGetenv("DB_PASS")                  // e.g. 'my-db-password'
		dbName                 = mustGetenv("DB_NAME")                  // e.g. 'my-database'
		instanceConnectionName = mustGetenv("INSTANCE_CONNECTION_NAME") // e.g. 'project:region:instance'
		usePrivate             = os.Getenv("PRIVATE_IP")
	)

	dbURI := fmt.Sprintf("user id=%s;password=%s;database=%s;", dbUser, dbPwd, dbName)
	c, err := mssql.NewConnector(dbURI)
	if err != nil {
		return nil, fmt.Errorf("mssql.NewConnector: %w", err)
	}
	dialer, err := cloudsqlconn.NewDialer(context.Background())
	if err != nil {
		return nil, fmt.Errorf("cloudsqlconn.NewDailer: %w", err)
	}
	c.Dialer = &csqlDialer{
		dialer:     dialer,
		connName:   instanceConnectionName,
		usePrivate: usePrivate != "",
	}

	dbPool := sql.OpenDB(c)
	if err != nil {
		return nil, fmt.Errorf("sql.Open: %w", err)
	}
	return dbPool, nil
}

Node.js

Per istruzioni dettagliate sull'utilizzo della libreria, consulta Utilizzo.

const {Connection} = require('tedious');
const {Connector} = require('@google-cloud/cloud-sql-connector');

// In case the PRIVATE_IP environment variable is defined then we set
// the ipType=PRIVATE for the new connector instance, otherwise defaults
// to public ip type.
const getIpType = () =>
  process.env.PRIVATE_IP === '1' || process.env.PRIVATE_IP === 'true'
    ? 'PRIVATE'
    : 'PUBLIC';

// connectWithConnector initializes a TCP connection
// to a Cloud SQL instance of SQL Server.
const connectWithConnector = async config => {
  // Note: Saving credentials in environment variables is convenient, but not
  // secure - consider a more secure solution such as
  // Cloud Secret Manager (https://cloud.google.com/secret-manager) to help
  // keep secrets safe.
  const connector = new Connector();
  const clientOpts = await connector.getTediousOptions({
    instanceConnectionName: process.env.INSTANCE_CONNECTION_NAME,
    ipType: getIpType(),
  });
  const dbConfig = {
    // Please note that the `server` property here is not used and is only
    // defined due to a bug in the tedious driver
    // (ref: https://github.com/tediousjs/tedious/issues/1541)
    // With that in mind, do not try to change this value since it will have no
    // impact in how the connector works, this sample will be updated to remove
    // this property declaration as soon as the tedious driver bug is fixed
    server: '0.0.0.0', // e.g. '127.0.0.1'
    authentication: {
      type: 'default',
      options: {
        userName: process.env.DB_USER, // e.g. 'my-db-user'
        password: process.env.DB_PASS, // e.g. 'my-db-password'
      },
    },
    options: {
      ...clientOpts,
      // Please note that the `port` property here is not used and is only
      // defined due to a bug in the tedious driver
      // (ref: https://github.com/tediousjs/tedious/issues/1541)
      // With that in mind, do not try to change this value since it will have
      // no impact in how the connector works, this sample will be updated to
      // remove this property declaration as soon as the tedious driver bug is
      // fixed
      port: 9999,
      database: process.env.DB_NAME, // e.g. 'my-database'
      useColumnNames: true,
    },
    // ... Specify additional properties here.
    ...config,
  };

  // Establish a connection to the database.
  return new Connection(dbConfig);
};

Applica

Utilizzando l'applicazione dei connettori, puoi imporre l'utilizzo solo del proxy di autenticazione Cloud SQL o dei connettori dei linguaggi Cloud SQL per connetterti alle istanze Cloud SQL. Con l'applicazione del connettore, Cloud SQL rifiuta le connessioni dirette al database.

Se utilizzi un'istanza abilitata per Private Service Connect, è presente una limitazione. Se per l'istanza è attiva l'applicazione dei connettori, non puoi creare repliche di lettura per l'istanza. Analogamente, se l'istanza ha repliche di lettura, non puoi attivare l'applicazione dei connettori per l'istanza.

gcloud

Per applicare l'utilizzo solo del proxy di autenticazione Cloud SQL o dei connettori dei linguaggi di Cloud SQL per connettersi a un'istanza, utilizza il comando gcloud sql instances patch:

gcloud sql instances patch INSTANCE_NAME \
--connector-enforcement=REQUIRED

Sostituisci INSTANCE_NAME con il nome dell'istanza Cloud SQL.

REST

Prima di utilizzare i dati della richiesta, apporta le seguenti sostituzioni:

  • PROJECT_ID: l'ID o il numero di progetto del progetto Google Cloud che contiene l'istanza
  • INSTANCE_NAME: il nome dell'istanza Cloud SQL

Metodo HTTP e URL:

PATCH https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME

Corpo JSON della richiesta:

{
  "kind": "sql#instance",
  "name": INSTANCE_NAME,
  "project": PROJECT_ID,
  "settings": {
  "connectorEnforcement": "REQUIRED",
  "kind": "sql#settings"
  }
}

Per inviare la richiesta, espandi una di queste opzioni:

Dovresti ricevere una risposta JSON simile alla seguente:

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_NAME",
  "status": "PENDING",
  "user": "user@example.com",
  "insertTime": "2020-01-16T02:32:12.281Z",
  "operationType": "UPDATE",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_NAME",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Risoluzione dei problemi

Versioni dei driver

Assicurati di utilizzare la versione più recente di Cloud SQL Connectors e del driver del database per evitare incompatibilità. Alcune versioni precedenti degli aggiornamenti dei driver non sono supportate.

Percorsi di connessione

I connettori Cloud SQL forniscono l'autorizzazione per le connessioni, ma non forniscono nuovi percorsi per la connettività. Ad esempio, per collegarti a un'istanza Cloud SQL utilizzando un indirizzo IP privato, la tua applicazione deve già disporre dell'accesso a VPC.

Debug dei problemi di connessione

Per ulteriore assistenza in caso di problemi di connessione, consulta le pagine Risoluzione dei problemi e Debug dei problemi di connessione.

Passaggi successivi