View a markdown version of this page

Conector do Aurora DSQL para Rust SQLx - Amazon Aurora DSQL

Conector do Aurora DSQL para Rust SQLx

O Conector do Aurora DSQL para Rust é um conector Rust baseado em SQLx que integra a autenticação do IAM para conectar aplicações Rust a clusters do Amazon Aurora DSQL.

O conector gerencia a geração de tokens, a configuração SSL e o gerenciamento de conexões para que você se concentre na lógica da aplicação.

Sobre o conector

O Conector do Aurora DSQL para Rust adiciona uma camada de autenticação sobre o SQLx que gerencia a geração de tokens do IAM, permitindo conectar ao Aurora DSQL sem alterar fluxos de trabalho existentes do SQLx.

O que é a autenticação do Aurora DSQL?

Na autenticação do Aurora DSQL, a autenticação envolve:

  • Autenticação do IAM: todas as conexões usam autenticação baseada no IAM com tokens de tempo limitado.

  • Geração de token: o conector gera tokens de autenticação usando credenciais da AWS, e esses tokens têm vida útil configurável

O Conector do Aurora DSQL para Rust compreende esses requisitos e gera automaticamente tokens de autenticação do IAM ao estabelecer conexões.

Recursos

  • Autenticação automática do IAM: lida com a geração e atualização de tokens do Aurora DSQL

  • Baseado em SQLx: encapsula o driver assíncrono popular de PostgreSQL para Rust

  • Integração perfeita: funciona com fluxos de trabalho existentes do SQLx

  • Agrupamento de conexões: suporte opcional a grupo com atualização em segundo plano de tokens do IAM por meio do recurso pool

  • Detecção automática de região: extrai a região da AWS do nome de host do cluster do Aurora DSQL

  • Suporte de credenciais da AWS: é compatível com perfis da AWS e com a cadeia de credenciais padrão

  • Nova tentativa de OCC: permite optar por uma nova tentativa de controle de simultaneidade otimista com recuo exponencial e variação aleatória

Aplicativo de exemplo

Para ver um exemplo completo, consulte a aplicação de exemplo no GitHub.

Guia de início rápido

Requisitos

Instalação

Adicione ao seu Cargo.toml:

[dependencies] aurora-dsql-sqlx-connector = "0.1.2"

Para a maioria das aplicações, ative os recursos pool e occ:

[dependencies] aurora-dsql-sqlx-connector = { version = "0.1.2", features = ["pool", "occ"] }

Sinalizadores de atributo

Recurso Padrão Descrição
pool Não Auxiliar de grupo de SQLx com atualização de token em segundo plano
occ Não Auxiliares de nova tentativa de OCC (retry_on_occ, is_occ_error)

Usage

Conexão do grupo

use sqlx::Row; #[tokio::main] async fn main() -> anyhow::Result<()> { let pool = aurora_dsql_sqlx_connector::pool::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" ).await?; // Read let row = sqlx::query("SELECT 'Hello, DSQL!' as greeting") .fetch_one(&pool) .await?; let greeting: &str = row.get("greeting"); println!("{}", greeting); // Write — you must wrap writes in a transaction let mut tx = pool.begin().await?; sqlx::query("INSERT INTO users (id, name) VALUES (gen_random_uuid(), $1)") .bind("Alice") .execute(&mut *tx) .await?; tx.commit().await?; pool.close().await; Ok(()) }

Conexão única

Para scripts simples ou quando não houver necessidade de agrupamento de conexões:

use sqlx::Row; #[tokio::main] async fn main() -> anyhow::Result<()> { let mut conn = aurora_dsql_sqlx_connector::connection::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" ).await?; let row = sqlx::query("SELECT 1 as value") .fetch_one(&mut conn) .await?; let value: i32 = row.get("value"); println!("Result: {}", value); Ok(()) }

Cada chamada para connection::connect() gera um novo token do IAM. Para operações mais longas que a duração do token, crie outra conexão.

Uso avançado

Configuração do host

O conector é compatível com endpoints de cluster completos (região detectada automaticamente) e IDs de cluster (região obrigatória):

// Full endpoint (region auto-detected) let opts = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" )?; // Cluster ID (region required) let opts = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster-id/postgres?region=us-east-1" )?;

AWS Perfis do

Especifique um perfil da AWS para credenciais:

let pool = aurora_dsql_sqlx_connector::pool::connect( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres?profile=production" ).await?;

Formato de string da conexão

O conector é compatível com os formatos de string de conexão do PostgreSQL:

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

Parâmetros de consulta compatíveis: region, profile, tokenDurationSecs, ormPrefix.

Configuração do grupo

Para configurações personalizadas de grupo, passe PgPoolOptions para connect_with():

use aurora_dsql_sqlx_connector::DsqlConnectOptions; use sqlx::postgres::PgPoolOptions; let config = DsqlConnectOptions::from_connection_string( "postgres://admin@your-cluster.dsql.us-east-1.on.aws/postgres" )?; let pool = aurora_dsql_sqlx_connector::pool::connect_with( &config, PgPoolOptions::new().max_connections(20), ).await?;

Configuração programática

Use DsqlConnectOptionsBuilder para configuração programática:

use aurora_dsql_sqlx_connector::{DsqlConnectOptionsBuilder, Region}; use sqlx::postgres::PgConnectOptions; let pg = PgConnectOptions::new() .host("your-cluster.dsql.us-east-1.on.aws") .username("admin") .database("postgres"); let opts = DsqlConnectOptionsBuilder::default() .pg_connect_options(pg) .region(Some(Region::new("us-east-1"))) .build()?; let mut conn = aurora_dsql_sqlx_connector::connection::connect_with(&opts).await?;

Nova tentativa de OCC

O Aurora DSQL usa o controle de simultaneidade otimista (OCC). Quando duas transações modificam os mesmos dados, a primeira a confirmar vence e a segunda recebe um erro de OCC.

A nova tentativa do OCC é opcional. Ative o recurso occ e retry_on_occ use para habilitar nova tentativa automática com recuo exponencial e variação aleatória:

use aurora_dsql_sqlx_connector::{retry_on_occ, OCCRetryConfig}; let config = OCCRetryConfig::default(); // max_attempts: 3, exponential backoff retry_on_occ(&config, || async { let mut tx = pool.begin().await?; sqlx::query("UPDATE accounts SET balance = balance - 100 WHERE id = $1") .bind(account_id) .execute(&mut *tx) .await?; tx.commit().await?; Ok(()) }).await?;
Atenção

retry_on_occ executa novamente toda a closure em caso de conflito OCC, portanto a closure deve conter apenas operações de banco de dados e ser segura para nova tentativa.

Opções de configuração

Campo Tipo Padrão Descrição
host String (obrigatório) Endpoint do cluster ou ID do cluster
region Option<Region> (detectado automaticamente) Região da AWS; obrigatória se o host for um ID de cluster
user String "admin" Usuário do banco de dados
database String "postgres" Nome do banco de dados
port u16 5432 Porta do banco de dados
profile Option<String> None Nome do perfil da AWS para credenciais
tokenDurationSecs u64 900 (15 min) Duração da validade do token em segundos
ormPrefix Option<String> None Prefixo de ORM para application_name (por exemplo, "diesel" produz "diesel:aurora-dsql-rust-sqlx/{version}")

Autenticação

O conector gerencia automaticamente a autenticação do Aurora DSQL gerando tokens com o uso de credenciais da AWS. Se você não fornecer a região da AWS, o conector a analisará a partir do nome do host.

Para obter mais informações sobre autenticação no Aurora DSQL, consulte Autenticação e autorização para o Aurora DSQL.

Geração de tokens

  • Grupos de conexão: uma tarefa em segundo plano atualiza o token em 80% da duração do token. Chame pool.close().await para interromper a tarefa de atualização e liberar recursos do grupo.

  • Conexões únicas: o conector gera um novo token do IAM no momento da conexão.

  • A geração de tokens é uma operação local de pré-assinatura SigV4 com custo insignificante.

Admin versus usuários regulares

  • Usuários chamados “admin” utilizam automaticamente tokens de autenticação de admin.

  • Todos os outros usuários utilizam tokens de autenticação regulares.

  • O conector gera tokens dinamicamente para cada conexão