适用于 Rust SQLx 的 Aurora DSQL 连接器
适用于 Rust 的 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 或更高版本
-
已配置 AWS 凭证(通过 AWS CLI、环境变量或 IAM 角色)
安装
添加到 Cargo.toml:
[dependencies] aurora-dsql-sqlx-connector = "0.1.2"
对于大多数应用程序,请同时启用 pool 和 occ 功能:
[dependencies] aurora-dsql-sqlx-connector = { version = "0.1.2", features = ["pool", "occ"] }
功能标志
| 功能 | 默认值 | 说明 |
|---|---|---|
pool |
否 | 具有后台令牌刷新功能的 SQLx 池帮助程序 |
occ |
否 | OCC 重试帮助程序(retry_on_occ、is_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&...]
支持的查询参数:region、profile、tokenDurationSecs、ormPrefix。
池配置
对于自定义池设置,请将 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”的用户会自动使用管理员身份验证令牌
-
所有其他用户都使用普通身份验证令牌
-
该连接器为每个连接动态生成令牌