Conectar usando os conectores de linguagem do AlloyDB

Os conectores de linguagem do AlloyDB são bibliotecas que fornecem um processo simplificado para estabelecer conexões seguras com seu cluster usando o seguinte:

  • Conexões mTLS automatizadas
  • Suporte à autorização baseada no Identity and Access Management (IAM)
  • Autenticação automática do IAM

Os conectores de linguagem do AlloyDB não podem fornecer um caminho de rede para um cluster do AlloyDB se um caminho de rede ainda não estiver presente.

Para mais informações sobre os conectores de linguagem do AlloyDB, consulte Visão geral dos conectores de linguagem do AlloyDB.

Nesta página, você vai conhecer os seguintes conectores de linguagem do AlloyDB:

  • O conector Java do AlloyDB
  • O conector AlloyDB Go
  • Conector Python do AlloyDB

Antes de começar

  1. Ative a API AlloyDB Admin.

    Ativar a API

  2. Crie uma instância do AlloyDB e configure o usuário padrão.

    Para mais informações sobre como criar uma instância, consulte Criar uma instância principal.

    Para mais informações sobre os papéis do usuário, consulte Papéis predefinidos do IAM do AlloyDB.

  3. Configure os seguintes papéis e permissões necessários para se conectar a uma instância do AlloyDB:

    • roles/alloydb.client
    • roles/serviceusage.serviceUsageConsumer

      Para mais informações sobre quais papéis e permissões são necessários, consulte Gerenciar a autenticação do IAM.

Instalar os conectores de linguagem do AlloyDB

Java

O conector Java do AlloyDB é uma biblioteca que fornece autorização e criptografia com base em IAM ao se conectar a uma instância do AlloyDB.

Instalação

Para o Maven, é possível instalar o conector Java do AlloyDB adicionando o seguinte ao pom.xml do projeto:

<!-- Add the connector with the latest version -->
<dependency>
  <groupId>com.google.cloud</groupId>
  <artifactId>alloydb-jdbc-connector</artifactId>
  <version>0.4.0</version>
</dependency>

<!-- Add the driver with the latest version -->
<dependency>
  <groupId>org.postgresql</groupId>
  <artifactId>postgresql</artifactId>
  <version>46.6.0<</version>
</dependency>

<!-- Add HikariCP with the latest version -->
<dependency>
  <groupId>com.zaxxer</groupId>
  <artifactId>HikariCP</artifactId>
  <version>5.1.0</version>
</dependency>

Para o Gradle, é possível instalar o conector Java do AlloyDB incluindo o seguinte no gradle.build do projeto:

// Add connector with the latest version
implementation group: 'com.google.cloud.alloydb', name: 'alloydb-jdbc-connector', version: '0.4.0'

// Add driver with the latest version
implementation group: 'org.postgresql', name: 'postgresql', version: '46.6.0'

// Add HikariCP with the latest version
implementation group: 'com.zaxxer', name: 'HikariCP', version: '5.1.0'

Python (pg8000)

O conector do AlloyDB para Python é uma biblioteca que pode ser usada com um driver de banco de dados para permitir que usuários com permissões suficientes se conectem a um banco de dados do AlloyDB sem precisar incluir IPs manualmente.

Instalação

É possível instalar a biblioteca AlloyDB Python Connector com pip install.

Se você estiver usando o pg8000, execute o seguinte comando:

pip install "google-cloud-alloydb-connector[pg8000]" sqlalchemy

Python (asyncpg)

O conector do AlloyDB para Python é uma biblioteca que pode ser usada com um driver de banco de dados para permitir que usuários com permissões suficientes se conectem a um banco de dados do AlloyDB sem precisar incluir IPs manualmente.

Instalação

É possível instalar a biblioteca AlloyDB Python Connector com pip install.

Se você estiver usando o asyncpg, execute o seguinte comando:

Para asyncpg, use:

pip install "google-cloud-alloydb-connector[asyncpg]" "sqlalchemy[asyncio]"

Para mais informações sobre o uso de drivers assíncronos, consulte Uso de drivers assíncronos.

Go (pgx)

O conector do AlloyDB para Go é projetado para uso com a linguagem Go.

Instalação

É possível instalar o AlloyDB Go Connector com go get.

Se você estiver usando o pgx, execute o seguinte comando:

go get github.com/jackc/pgx/v5
go get cloud.google.com/go/alloydbconn

Go (database/sql)

O conector do AlloyDB para Go é projetado para uso com a linguagem Go.

Instalação

É possível instalar o AlloyDB Go Connector com go get.

Se você estiver usando o database/sql, execute o seguinte comando:

go get cloud.google.com/go/alloydbconn

Configurar os conectores de idioma do AlloyDB

Java

Para usar o conector Java do AlloyDB para se conectar ao cluster do AlloyDB, siga as etapas abaixo.

Para usar esse snippet no contexto de um aplicativo da Web, consulte o README no GitHub.


import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

public class AlloyDbJdbcConnectorDataSourceFactory {

  public static final String ALLOYDB_DB = System.getenv("ALLOYDB_DB");
  public static final String ALLOYDB_USER = System.getenv("ALLOYDB_USER");
  public static final String ALLOYDB_PASS = System.getenv("ALLOYDB_PASS");
  public static final String ALLOYDB_INSTANCE_NAME = System.getenv("ALLOYDB_INSTANCE_NAME");

  static HikariDataSource createDataSource() {
    HikariConfig config = new HikariConfig();

    config.setJdbcUrl(String.format("jdbc:postgresql:///%s", ALLOYDB_DB));
    config.setUsername(ALLOYDB_USER); // e.g., "postgres"
    config.setPassword(ALLOYDB_PASS); // e.g., "secret-password"
    config.addDataSourceProperty("socketFactory", "com.google.cloud.alloydb.SocketFactory");
    // e.g., "projects/my-project/locations/us-central1/clusters/my-cluster/instances/my-instance"
    config.addDataSourceProperty("alloydbInstanceName", ALLOYDB_INSTANCE_NAME);

    return new HikariDataSource(config);
  }
}

Usar IP público

Se você estiver usando o IP público para se conectar ao cluster do AlloyDB, inclua o seguinte:

config.addDataSourceProperty("alloydbIpType", "PUBLIC");

Usar o Private Service Connect

Se você estiver usando o Private Service Connect para se conectar à instância do AlloyDB, inclua o seguinte:

config.addDataSourceProperty("alloydbIpType", "PSC");

Autenticação automática do IAM

Por padrão, os conectores de linguagem do AlloyDB usam a autenticação integrada. É possível usar a autenticação automática do IAM com o conector Java do AlloyDB. Para ativar, inclua o seguinte:

config.addDataSourceProperty("alloydbEnableIAMAuth", "true");

Python (pg8000)

Para usar o conector em Python do AlloyDB e se conectar ao cluster do AlloyDB, configure o conector usando as etapas a seguir, se você estiver usando pg8000.

Para usar esse snippet no contexto de um aplicativo da Web, consulte o README no GitHub.

import pg8000
import sqlalchemy

from google.cloud.alloydb.connector import Connector


def create_sqlalchemy_engine(
    inst_uri: str,
    user: str,
    password: str,
    db: str,
    refresh_strategy: str = "background",
) -> tuple[sqlalchemy.engine.Engine, Connector]:
    """Creates a connection pool for an AlloyDB instance and returns the pool
    and the connector. Callers are responsible for closing the pool and the
    connector.

    A sample invocation looks like:

        engine, connector = create_sqlalchemy_engine(
            inst_uri,
            user,
            password,
            db,
        )
        with engine.connect() as conn:
            time = conn.execute(sqlalchemy.text("SELECT NOW()")).fetchone()
            conn.commit()
            curr_time = time[0]
            # do something with query result
            connector.close()

    Args:
        instance_uri (str):
            The instance URI specifies the instance relative to the project,
            region, and cluster. For example:
            "projects/my-project/locations/us-central1/clusters/my-cluster/instances/my-instance"
        user (str):
            The database user name, e.g., postgres
        password (str):
            The database user's password, e.g., secret-password
        db (str):
            The name of the database, e.g., mydb
        refresh_strategy (Optional[str]):
            Refresh strategy for the AlloyDB Connector. Can be one of "lazy"
            or "background". For serverless environments use "lazy" to avoid
            errors resulting from CPU being throttled.
    """
    connector = Connector(refresh_strategy=refresh_strategy)

    def getconn() -> pg8000.dbapi.Connection:
        conn: pg8000.dbapi.Connection = connector.connect(
            inst_uri,
            "pg8000",
            user=user,
            password=password,
            db=db,
        )
        return conn

    # create SQLAlchemy connection pool
    engine = sqlalchemy.create_engine(
        "postgresql+pg8000://",
        creator=getconn,
    )
    engine.dialect.description_encoding = None
    return engine, connector

Usar IP público

Se você estiver usando o IP público para se conectar ao cluster do AlloyDB, substitua a função de conexão da seguinte maneira:

  def getconn() -> pg8000.dbapi.Connection:
      conn: pg8000.dbapi.Connection = connector.connect(
          inst_uri,
          "pg8000",
          user=user,
          password=password,
          db=db,
          # use ip_type to specify public IP
          ip_type=IPTypes.PUBLIC,
      )
      return conn

Usar o Private Service Connect

Se você estiver usando o Private Service Connect para se conectar à instância do AlloyDB, inclua o seguinte:

  def getconn() -> pg8000.dbapi.Connection:
      conn: pg8000.dbapi.Connection = connector.connect(
          inst_uri,
          "pg8000",
          user=user,
          password=password,
          db=db,
          # use ip_type to specify PSC
          ip_type=IPTypes.PSC,
        )
      return conn

Autenticação automática do IAM

Por padrão, os conectores de linguagem do AlloyDB usam a autenticação integrada. É possível usar a autenticação automática do IAM com o conector Python do AlloyDB. Para ativar, substitua a função de conexão por este código:

  def getconn() -> pg8000.dbapi.Connection:
      conn: pg8000.dbapi.Connection = connector.connect(
          inst_uri,
          "pg8000",
          user=user,
          password=password,
          db=db,
          # use enable_iam_auth to enable IAM authentication
          enable_iam_auth=True,
      )
      return conn

Python (asyncpg)

Para usar o conector em Python do AlloyDB e se conectar ao cluster do AlloyDB, configure o conector usando as etapas a seguir, se você estiver usando async.

Para usar esse snippet no contexto de um aplicativo da Web, consulte o README no GitHub.

import asyncpg
import sqlalchemy
import sqlalchemy.ext.asyncio

from google.cloud.alloydb.connector import AsyncConnector


async def create_sqlalchemy_engine(
    inst_uri: str,
    user: str,
    password: str,
    db: str,
    refresh_strategy: str = "background",
) -> tuple[sqlalchemy.ext.asyncio.engine.AsyncEngine, AsyncConnector]:
    """Creates a connection pool for an AlloyDB instance and returns the pool
    and the connector. Callers are responsible for closing the pool and the
    connector.

    A sample invocation looks like:

        engine, connector = await create_sqlalchemy_engine(
            inst_uri,
            user,
            password,
            db,
        )
        async with engine.connect() as conn:
            time = await conn.execute(sqlalchemy.text("SELECT NOW()")).fetchone()
            curr_time = time[0]
            # do something with query result
            await connector.close()

    Args:
        instance_uri (str):
            The instance URI specifies the instance relative to the project,
            region, and cluster. For example:
            "projects/my-project/locations/us-central1/clusters/my-cluster/instances/my-instance"
        user (str):
            The database user name, e.g., postgres
        password (str):
            The database user's password, e.g., secret-password
        db (str):
            The name of the database, e.g., mydb
        refresh_strategy (Optional[str]):
            Refresh strategy for the AlloyDB Connector. Can be one of "lazy"
            or "background". For serverless environments use "lazy" to avoid
            errors resulting from CPU being throttled.
    """
    connector = AsyncConnector(refresh_strategy=refresh_strategy)

    async def getconn() -> asyncpg.Connection:
        conn: asyncpg.Connection = await connector.connect(
            inst_uri,
            "asyncpg",
            user=user,
            password=password,
            db=db,
        )
        return conn

    # create SQLAlchemy connection pool
    engine = sqlalchemy.ext.asyncio.create_async_engine(
        "postgresql+asyncpg://",
        async_creator=getconn,
        execution_options={"isolation_level": "AUTOCOMMIT"},
    )
    return engine, connector

Usar IP público

Se você estiver usando o IP público para se conectar ao cluster do AlloyDB, substitua a função de conexão por esta:

  async def getconn() -> asyncpg.Connection:
    conn: asyncpg.Connection = await connector.connect(
        inst_uri,
        "asyncpg",
        user=user,
        password=password,
        db=db,
        # use ip_type to specify public IP
        ip_type=IPTypes.PUBLIC,
    )
    return conn

Usar o Private Service Connect

Se você estiver usando o Private Service Connect para se conectar à instância do AlloyDB, inclua o seguinte:

    async def getconn() -> asyncpg.Connection:
      conn: asyncpg.Connection = await connector.connect(
          inst_uri,
          "asyncpg",
          user=user,
          password=password,
          db=db,
          # use ip_type to specify PSC
          ip_type=IPTypes.PSC,
      )
      return conn

Autenticação automática do IAM

Por padrão, os conectores de linguagem do AlloyDB usam a autenticação integrada. É possível usar a autenticação automática do IAM com o conector Python do AlloyDB. Para ativar, substitua a função de conexão por este código:

  async def getconn() -> asyncpg.Connection:
    conn: asyncpg.Connection = await connector.connect(
        inst_uri,
        "asyncpg",
        user=user,
        password=password,
        db=db,
        # use enable_iam_auth to enable IAM authentication
        enable_iam_auth=True,
    )
    return conn

Go (pgx)

Para usar o conector AlloyDB Go para se conectar ao cluster do AlloyDB, configure o conector usando as etapas a seguir, se você estiver usando pgx.

Para usar esse snippet no contexto de um aplicativo da Web, consulte o README no GitHub.

import (
	"context"
	"fmt"
	"net"

	"cloud.google.com/go/alloydbconn"
	"github.com/jackc/pgx/v5/pgxpool"
)

// connectPgx establishes a connection to your database using pgxpool and the
// AlloyDB Go Connector (aka alloydbconn.Dialer)
//
// The function takes an instance URI, a username, a password, and a database
// name. Usage looks like this:
//
//	pool, cleanup, err := connectPgx(
//	  context.Background(),
//	  "projects/myproject/locations/us-central1/clusters/mycluster/instances/myinstance",
//	  "postgres",
//	  "secretpassword",
//	  "mydb",
//	)
//
// In addition to a *pgxpool.Pool type, the function returns a cleanup function
// that should be called when you're done with the database connection.
func connectPgx(
	ctx context.Context, instURI, user, pass, dbname string,
	opts ...alloydbconn.Option,
) (*pgxpool.Pool, func() error, error) {
	// First initialize the dialer. alloydbconn.NewDialer accepts additional
	// options to configure credentials, timeouts, etc.
	//
	// For details, see:
	// https://pkg.go.dev/cloud.google.com/go/alloydbconn#Option
	d, err := alloydbconn.NewDialer(ctx, opts...)
	if err != nil {
		noop := func() error { return nil }
		return nil, noop, fmt.Errorf("failed to init Dialer: %v", err)
	}
	// The cleanup function will stop the dialer's background refresh
	// goroutines. Call it when you're done with your database connection to
	// avoid a goroutine leak.
	cleanup := func() error { return d.Close() }

	dsn := fmt.Sprintf(
		// sslmode is disabled, because the Dialer will handle the SSL
		// connection instead.
		"user=%s password=%s dbname=%s sslmode=disable",
		user, pass, dbname,
	)

	// Prefer pgxpool for applications.
	// For more information, see:
	// https://github.com/jackc/pgx/wiki/Getting-started-with-pgx#using-a-connection-pool
	config, err := pgxpool.ParseConfig(dsn)
	if err != nil {
		return nil, cleanup, fmt.Errorf("failed to parse pgx config: %v", err)
	}

	// Tell pgx to use alloydbconn.Dialer to connect to the instance.
	config.ConnConfig.DialFunc = func(ctx context.Context, _ string, _ string) (net.Conn, error) {
		return d.Dial(ctx, instURI)
	}

	// Establish the connection.
	pool, connErr := pgxpool.NewWithConfig(ctx, config)
	if connErr != nil {
		return nil, cleanup, fmt.Errorf("failed to connect: %s", connErr)
	}

	return pool, cleanup, nil
}

Usar IP público

Se você estiver usando o IP público para se conectar ao cluster do AlloyDB, substitua a função d.Dial por este código:

d.Dial(ctx, instURI, alloydbconn.WithPublicIP())

Usar o Private Service Connect

Se você estiver usando o Private Service Connect para se conectar à instância do AlloyDB, inclua o seguinte:

  d.Dial(ctx, instURI, alloydbconn.WithPSC())

Autenticação automática do IAM

Por padrão, os conectores de linguagem do AlloyDB usam a autenticação integrada. É possível usar a autenticação automática do IAM com o conector AlloyDB Go. Para ativar, substitua a função alloydbconn.NewDialer por este código:

d, err := alloydbconn.NewDialer(ctx, alloydbconn.WithIAMAuthN())

Go (database/sql)

Para usar o conector do AlloyDB Go para se conectar ao cluster do AlloyDB, configure o conector usando as etapas a seguir, se você estiver usando database/sql.

Para usar esse snippet no contexto de um aplicativo da Web, consulte o README no GitHub.

import (
	"database/sql"
	"fmt"

	"cloud.google.com/go/alloydbconn/driver/pgxv5"
)

// connectDatabaseSQL establishes a connection to your database using the Go
// standard library's database/sql package and using the AlloyDB Go Connector
// (aka alloydbconn.Dialer)
//
// The function takes an instance URI, a username, a password, and a database
// name. Usage looks like this:
//
//	db, cleanup, err := connectDatabaseSQL(
//	  "projects/myproject/locations/us-central1/clusters/mycluster/instances/myinstance",
//	  "postgres",
//	  "secretpassword",
//	  "mydb",
//	)
//
// In addition to a *db.SQL type, the function returns a cleanup function that
// should be called when you're done with the database connection.
func connectDatabaseSQL(
	instURI, user, pass, dbname string,
) (*sql.DB, func() error, error) {
	// First, register the AlloyDB driver. Note, the driver's name is arbitrary
	// and must only match what you use below in sql.Open. Also,
	// pgxv5.RegisterDriver accepts options to configure credentials, timeouts,
	// etc.
	//
	// For details, see:
	// https://pkg.go.dev/cloud.google.com/go/alloydbconn#Option
	//
	// The cleanup function will stop the dialer's background refresh
	// goroutines. Call it when you're done with your database connection to
	// avoid a goroutine leak.
	cleanup, err := pgxv5.RegisterDriver("alloydb")
	if err != nil {
		return nil, cleanup, err
	}

	db, err := sql.Open(
		"alloydb",
		fmt.Sprintf(
			// sslmode is disabled, because the Dialer will handle the SSL
			// connection instead.
			"host=%s user=%s password=%s dbname=%s sslmode=disable",
			instURI, user, pass, dbname,
		),
	)
	return db, cleanup, err
}

Usar IP público

Se você estiver usando o IP público para se conectar ao cluster do AlloyDB, substitua a função RegisterDriver por este código:

cleanup, err := pgxv5.RegisterDriver(
  "alloydb",
  alloydbconn.WithDefaultDialOptions(alloydbconn.WithPublicIP())
)

Usar o Private Service Connect

Se você estiver usando o Private Service Connect para se conectar à instância do AlloyDB, inclua o seguinte:

  cleanup, err := pgxv5.RegisterDriver(
    "alloydb",
    alloydbconn.WithDefaultDialOptions(alloydbconn.WithPSC())
)

Autenticação automática do IAM

Por padrão, os conectores de linguagem do AlloyDB usam a autenticação integrada. É possível usar a autenticação automática do IAM com o conector AlloyDB Go. Para ativar, substitua a função RegisterDriver por este código:

cleanup, err := pgxv4.RegisterDriver(
  "alloydb",
  alloydbconn.WithIAMAuthN()
)