View a markdown version of this page

适用于 Rust SQLx 的 Aurora DSQL 连接器 - Amazon Aurora DSQL

适用于 Rust SQLx 的 Aurora DSQL 连接器

适用于 Rust 的 Aurora DSQL 连接器是一款基于 SQLx 构建的 Rust 连接器,它集成了 IAM 身份验证功能,用于将 Rust 应用程序连接到 Amazon Aurora DSQL 集群。

此连接器处理令牌生成、SSL 配置和连接管理,因此您可以专注于应用程序逻辑。

关于连接器

适用于 Rust 的 Aurora DSQL 连接器在 SQLx 之上添加一个身份验证层来处理 IAM 令牌生成,使您无需更改现有 SQLx 工作流程即可连接到 Aurora DSQL。

什么是 Aurora DSQL 身份验证?

在 Aurora DSQL 中,身份验证包括:

  • IAM 身份验证:所有连接都使用基于 IAM 的身份验证和限时令牌

  • 令牌生成:连接器使用 AWS 凭证生成身份验证令牌,并且这些令牌具有可配置的生命周期

适用于 Rust 的 Aurora DSQL 连接器了解这些要求,并在建立连接时自动生成 IAM 身份验证令牌。

功能

  • 自动 IAM 身份验证:处理 Aurora DSQL 令牌生成与刷新

  • 基于 SQLx 构建:封装了适用于 Rust 的常用异步 PostgreSQL 驱动程序

  • 无缝集成:可与现有的 SQLx 工作流程结合使用

  • 连接入池:支持选择加入池,并通过 pool 功能在后台刷新令牌

  • 区域自动检测:从 Aurora DSQL 集群主机名中提取 AWS 区域

  • AWS 凭证支持:支持 AWS 配置文件和默认凭证链

  • OCC 重试:选择加入乐观并发控制重试,具有指数回退和抖动功能

示例应用程序

有关完整的示例,请参阅 GitHub 上的示例应用程序

快速入门指南

要求

  • Rust 1.80 或更高版本

  • Aurora DSQL 入门

  • 已配置 AWS 凭证(通过 AWS CLI、环境变量或 IAM 角色)

安装

添加到 Cargo.toml

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

对于大多数应用程序,请同时启用 poolocc 功能:

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

功能标志

功能 默认值 说明
pool 具有后台令牌刷新功能的 SQLx 池帮助程序
occ OCC 重试帮助程序(retry_on_occis_occ_error

用法

池连接

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

单一 连接

对于简单的脚本或当您不需要连接池时:

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

每次调用 connection::connect() 都会生成一个新的 IAM 令牌。如果操作的时间长于令牌持续时间,请创建一个新连接。

高级用法

主机配置

该连接器支持完整的集群端点(自动检测区域)和集群 ID(需要区域):

// 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 配置文件

为凭证指定 AWS 配置文件:

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

连接字符串格式

该连接器支持 PostgreSQL 连接字符串格式:

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

支持的查询参数:regionprofiletokenDurationSecsormPrefix

池配置

对于自定义池设置,请将 PgPoolOptions 传递到 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?;

编程配置

使用 DsqlConnectOptionsBuilder 进行编程配置:

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?;

OCC 重试

Aurora DSQL 使用乐观并发控制(OCC)。当两个事务修改相同的数据时,提交的第一个事务获胜,第二个事务收到 OCC 错误。

OCC 重试为选择加入的。启用 occ 功能,并使用 retry_on_occ 启用带指数回退和抖动的自动重试功能:

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?;
警告

发生 OCC 冲突时,retry_on_occ 重新执行完整关闭,因此关闭应仅包含数据库操作并且可以安全地重试。

配置选项

字段 类型 默认值 说明
host String (必需) 集群端点或集群 ID
region Option<Region> (自动检测) AWS 区域;如果主机是集群 ID,则为必需
user String "admin" 数据库用户
database String "postgres" 数据库名称
port u16 5432 数据库端口
profile Option<String> None 凭证的 AWS 配置文件名称
tokenDurationSecs u64 900(15 分钟) 令牌有效期,以秒为单位
ormPrefix Option<String> None application_name 的 ORM 前缀(例如,"diesel" 生成 "diesel:aurora-dsql-rust-sqlx/{version}"

身份验证

该连接器通过使用 AWS 凭证生成令牌来自动处理 Aurora DSQL 身份验证。如果您未提供 AWS 区域,则连接器会从主机名中解析该区域。

有关 Aurora DSQL 中的身份验证的更多信息,请参阅 Aurora DSQL 的身份验证和授权

令牌生成

  • 连接池:后台任务会在令牌持续时间的 80% 时刷新令牌。调用 pool.close().await 可停止刷新任务并释放池资源。

  • 单个连接:连接器在连接时生成一个新令牌。

  • 令牌生成是本地 SigV4 预签名操作,成本可以忽略不计。

管理员用户与普通用户

  • 名为“admin”的用户会自动使用管理员身份验证令牌

  • 所有其他用户都使用普通身份验证令牌

  • 该连接器为每个连接动态生成令牌