View a markdown version of this page

Conexión a clústeres de Aurora DSQL con un conector de Go - Amazon Aurora DSQL

Conexión a clústeres de Aurora DSQL con un conector de Go

El conector de Aurora DSQL para Go envuelve pgx con la autenticación IAM automática. El conector se encarga de la generación de tokens, la configuración SSL y la gestión de conexiones para que usted pueda centrarse en la lógica de su aplicación.

Acerca del conector

Aurora DSQL requiere una autenticación basada en IAM con tokens de duración limitada que los controladores de Go PostgreSQL existentes no admiten de forma nativa. El conector de Aurora DSQL para Go añade una capa de autenticación sobre el controlador pgx que gestiona la generación de tokens IAM, lo que le permite conectarse a Aurora DSQL sin cambiar sus flujos de trabajo de pgx existentes.

¿Qué es la autenticación de Aurora DSQL?

En Aurora DSQL, la autenticación implica:

  • Autenticación de IAM: todas las conexiones utilizan la autenticación basada en IAM con tokens de tiempo limitado

  • Generación de tokens: el conector genera tokens de autenticación utilizando credenciales de AWS, y estos tokens tienen una duración configurable.

El conector de Aurora DSQL para Go está diseñado para comprender estos requisitos y generar automáticamente los tokens de autenticación de IAM al establecer las conexiones.

Ventajas del conector de Aurora DSQL para Go

El conector de Aurora DSQL para Go le permite seguir utilizando sus flujos de trabajo de pgx existentes, al tiempo que habilita la autenticación de IAM a través de:

  • Generación automática de tokens: el conector genera automáticamente tokens de IAM para cada conexión.

  • Agrupación de conexiones: soporte integrado para pgxpool con generación automática de tokens por conexión.

  • Configuración flexible: compatibilidad con puntos de conexión completos o ID de clúster con detección automática de región.

  • Compatibilidad con credenciales de AWS: admite perfiles de AWS y proveedores de credenciales personalizados.

Características principales de

Administración automática de tokens

El conector genera automáticamente los tokens de IAM para cada nueva conexión mediante credenciales previamente resueltas.

Grupo de conexiones

Agrupación de conexiones mediante pgxpool con generación automática de tokens por conexión.

Configuración de host flexible

Admite tanto puntos de conexión de clúster completos como ID de clúster con detección automática de región.

Seguridad SSL

SSL siempre está habilitado con el modo de verificación completa y negociación TLS directa.

Requisitos previos

  • Go 1.24 o posterior

  • Credenciales de AWS configuradas

  • Un clúster de Aurora DSQL

El conector usa la cadena de credenciales predeterminada del SDK de AWS para Go v2, que resuelve las credenciales en el siguiente orden:

  1. Variables de entorno (AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY)

  2. Archivo de credenciales compartidas (~/.aws/credentials)

  3. Archivo de configuración compartido (~/.aws/config)

  4. Rol de IAM para Amazon EC2/ECS/Lambda

Instalación

Instale el conector mediante los módulos Go:

go get github.com/awslabs/aurora-dsql-connectors/go/pgx/dsql

Inicio rápido

En el siguiente ejemplo, se muestra cómo crear un grupo de conexiones y ejecutar una consulta:

package main import ( "context" "log" "github.com/awslabs/aurora-dsql-connectors/go/pgx/dsql" ) func main() { ctx := context.Background() // Create a connection pool pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", }) if err != nil { log.Fatal(err) } defer pool.Close() // Execute a query var greeting string err = pool.QueryRow(ctx, "SELECT 'Hello, DSQL!'").Scan(&greeting) if err != nil { log.Fatal(err) } log.Println(greeting) }

Opciones de configuración

El conector es compatible con las siguientes opciones de configuración:

Campo Tipo Predeterminado Descripción
Host cadena (obligatorio) Punto de conexión de clúster o ID de clúster
Región cadena (detectado automáticamente) Región de AWS; obligatorio si el host es un ID de clúster
Usuario cadena "admin" Usuario de base de datos
Database cadena "postgres" Nombre de base de datos
Puerto int 5432 Database port (Puerto de base de datos)
Perfil cadena "" Nombre de perfil de AWS para las credenciales
TokenDurationSecs int 900 (15 minutos) Duración de validez del token en segundos (máximo permitido: 1 semana, valor predeterminado: 15 minutos)
MaxConns int32 0 Conexiones máximas de grupo (0 = pgxpool predeterminado)
MinConns int32 0 Conexiones de grupo mínimas (0 = pgxpool predeterminado)
MaxConnLifetime time.Duration 55 minutos Tiempo máximo de conexión

Formato de la cadena de conexión

El conector admite los formatos de cadena de conexión PostgreSQL y DSQL:

postgres://[user@]host[:port]/[database][?param=value&...] dsql://[user@]host[:port]/[database][?param=value&...]

Parámetros de consulta compatibles:

  • region: región de AWS

  • profile: nombre de perfil de AWS

  • tokenDurationSecs: duración de la validez del token en segundos

Ejemplos:

// Full endpoint (region auto-detected) pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/postgres") // Using dsql:// scheme (also supported) pool, _ := dsql.NewPool(ctx, "dsql://admin@cluster.dsql.us-east-1.on.aws/postgres") // With explicit region pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/mydb?region=us-east-1") // With AWS profile pool, _ := dsql.NewPool(ctx, "postgres://admin@cluster.dsql.us-east-1.on.aws/postgres?profile=dev")

Uso avanzado

Configuración de host

El conector admite dos formatos de host:

Punto de conexión completo (región detectada automáticamente):

pool, _ := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", })

ID de clúster (región requerida):

pool, _ := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster-id", Region: "us-east-1", })

Ajuste de configuración de grupo

Configure el grupo de conexiones para su carga de trabajo:

pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", MaxConns: 20, MinConns: 5, MaxConnLifetime: time.Hour, MaxConnIdleTime: 30 * time.Minute, HealthCheckPeriod: time.Minute, })

Uso de conexión única

Para scripts simples o cuando no es necesaria la agrupación de conexiones:

conn, err := dsql.Connect(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", }) if err != nil { log.Fatal(err) } defer conn.Close(ctx) // Use the connection rows, err := conn.Query(ctx, "SELECT * FROM users")

Uso de perfiles de AWS

Especificación de un perfil de AWS para credenciales:

pool, err := dsql.NewPool(ctx, dsql.Config{ Host: "your-cluster.dsql.us-east-1.on.aws", Profile: "production", })

Reintento de OCC

Aurora DSQL utiliza control de simultaneidad optimista (OCC). Cuando dos transacciones modifican los mismos datos, la primera en confirmarse tiene prioridad y la segunda recibe un error de OCC.

El paquete occretry proporciona ayudantes para el reintento automático con retroceso exponencial y fluctuación. Instálelo con:

go get github.com/awslabs/aurora-dsql-connectors/go/pgx/occretry

Use WithRetry para escrituras transaccionales:

err := occretry.WithRetry(ctx, pool, occretry.DefaultConfig(), func(tx pgx.Tx) error { _, err := tx.Exec(ctx, "UPDATE accounts SET balance = balance - $1 WHERE id = $2", 100, fromID) if err != nil { return err } _, err = tx.Exec(ctx, "UPDATE accounts SET balance = balance + $1 WHERE id = $2", 100, toID) return err })

Para instrucciones DDL o simples, use ExecWithRetry:

err := occretry.ExecWithRetry(ctx, pool, occretry.DefaultConfig(), "CREATE TABLE IF NOT EXISTS users (id UUID PRIMARY KEY, name TEXT)")
importante

WithRetry administra BEGIN/COMMIT/ROLLBACK internamente. Su devolución de llamada recibe una transacción y debe contener solo operaciones de base de datos, además de ser segura para reintentarlo.

Ejemplos

Para ver ejemplos y casos de uso más completos, consulte los ejemplos del conector de Aurora DSQL para Go.

Ejemplo Descripción
example_preferred Recomendado: grupo de conexiones con consultas simultáneas
transacción Gestión de transacciones con BEGIN/COMMIT/ROLLBACK
occ_retry Cómo gestionar los conflictos de OCC con un retroceso exponencial
connection_string Uso de cadenas de conexión para la configuración