使用 .NET 连接器连接到 Aurora DSQL 集群
Amazon Aurora DSQL Connector for .NET
此连接器处理令牌生成、SSL 配置和连接池,因此您可以专注于应用程序逻辑。
关于连接器
Amazon Aurora DSQL 要求使用 IAM 身份验证以及限时令牌,而现有 .NET PostgreSQL 驱动程序并不原生支持这种方法。适用于 .NET 的 Aurora DSQL 连接器在 Npgsql 之上添加一个身份验证层来处理 IAM 令牌生成,使您无需更改现有 Npgsql 工作流程即可连接到 Aurora DSQL。
什么是 Aurora DSQL 身份验证?
在 Aurora DSQL 中,身份验证包括:
-
IAM 身份验证:所有连接都使用基于 IAM 的身份验证和限时令牌
-
令牌生成:连接器使用 AWS 凭证生成身份验证令牌,并且这些令牌具有可配置的生命周期
适用于 .NET 的 Aurora DSQL 连接器了解这些要求,并在建立连接时自动生成 IAM 身份验证令牌。
功能
-
自动 IAM 身份验证:处理 Aurora DSQL 令牌生成与刷新
-
基于 Npgsql 构建:封装了适用于 .NET 的常用 PostgreSQL 驱动程序
-
无缝集成:可与现有的 Npgsql 工作流程结合使用
-
连接池:通过
NpgsqlDataSource提供内置支持,强制执行最长使用寿命 -
区域自动检测:从 Aurora DSQL 集群主机名中提取 AWS 区域
-
AWS 凭证支持:支持 AWS 配置文件和自定义凭证提供商
-
OCC 重试:选择加入乐观并发控制重试,具有指数回退
-
SSL 强制执行:始终在
verify-full模式和直接 TLS 协商中使用 SSL
示例应用程序
有关完整的示例,请参阅 GitHub 上的示例应用程序
快速入门指南
要求
-
.NET 8.0 或更高版本
-
已配置 AWS 凭证(通过 AWS CLI、环境变量或 IAM 角色)
安装
将程序包添加到您的项目:
dotnet add package Amazon.AuroraDsql.Npgsql
用法
池连接
using Amazon.AuroraDsql.Npgsql; // Create a connection pool await using var ds = await AuroraDsql.CreateDataSourceAsync(new DsqlConfig { Host = "your-cluster.dsql.us-east-1.on.aws", OccMaxRetries = 3 }); // Read await using (var conn = await ds.OpenConnectionAsync()) { await using var cmd = conn.CreateCommand(); cmd.CommandText = "SELECT 'Hello, DSQL!'"; var greeting = await cmd.ExecuteScalarAsync(); Console.WriteLine(greeting); } // Transactional write with OCC retry await ds.WithTransactionRetryAsync(async conn => { await using var cmd = conn.CreateCommand(); cmd.CommandText = "INSERT INTO users (id, name) VALUES (gen_random_uuid(), @name)"; cmd.Parameters.AddWithValue("name", "Alice"); await cmd.ExecuteNonQueryAsync(); });
单一 连接
对于简单的脚本或当您不需要连接池时:
await using var conn = await AuroraDsql.ConnectAsync(new DsqlConfig { Host = "your-cluster.dsql.us-east-1.on.aws" }); await using var cmd = conn.CreateCommand("SELECT 1"); await cmd.ExecuteScalarAsync();
OCC 重试
Aurora DSQL 使用乐观并发控制(OCC)。当两个事务修改相同的数据时,提交的第一个事务获胜,第二个事务收到 OCC 错误。
OCC 重试为选择加入的。在配置中设置 OccMaxRetries,以启用带指数回退和抖动的自动重试功能。使用 WithTransactionRetryAsync 进行事务写入:
await ds.WithTransactionRetryAsync(async conn => { await using var cmd = conn.CreateCommand(); cmd.CommandText = "UPDATE accounts SET balance = balance - 100 WHERE id = @from"; cmd.Parameters.AddWithValue("from", fromId); await cmd.ExecuteNonQueryAsync(); cmd.CommandText = "UPDATE accounts SET balance = balance + 100 WHERE id = @to"; cmd.Parameters.Clear(); cmd.Parameters.AddWithValue("to", toId); await cmd.ExecuteNonQueryAsync(); });
对于 DDL 或单个语句,使用 ExecWithRetryAsync:
await ds.ExecWithRetryAsync("CREATE TABLE IF NOT EXISTS users (id UUID PRIMARY KEY, name TEXT)");
重要
WithTransactionRetryAsync 在内部管理 BEGIN/COMMIT/ROLLBACK,每次尝试都会打开一个全新的连接。您的回调应仅包含数据库操作,并且可以安全地重试。
配置选项
连接器还通过 region 和 profile 查询参数接受 postgres:// 和 postgresql:// 连接字符串。
| 字段 | 类型 | 默认值 | 说明 |
|---|---|---|---|
Host |
string |
(必需) | 集群端点或 26 个字符集群 ID |
Region |
string? |
(自动检测) | AWS 区域;如果 Host 是集群 ID,则为必需 |
User |
string |
"admin" |
数据库用户 |
Database |
string |
"postgres" |
数据库名称 |
Port |
int |
5432 |
数据库端口 |
Profile |
string? |
null |
凭证的 AWS 配置文件名称 |
CustomCredentialsProvider |
AWSCredentials? |
null |
自定义 AWS 凭证提供商 |
TokenDurationSecs |
int? |
null(SDK 默认值,900 秒) |
令牌有效期,以秒为单位 |
OccMaxRetries |
int? |
null(已禁用) |
数据来源上重试方法的默认最大 OCC 重试次数 |
OrmPrefix |
string? |
null |
附加在 application_name 之前的 ORM 前缀 |
LoggerFactory |
ILoggerFactory? |
null |
用于重试警告和诊断的记录器工厂 |
ConfigureConnectionString |
Action<NpgsqlConnectionStringBuilder>? |
null |
回调以覆盖池设置,或设置其它 Npgsql 连接字符串属性。SSL 和 Enlist 是安全不变量,不能被覆盖。 |
身份验证
该连接器通过使用 AWS 凭证生成令牌来自动处理 Aurora DSQL 身份验证。如果您未提供 AWS 区域,则连接器会从主机名中解析该区域。
有关 Aurora DSQL 中的身份验证的更多信息,请参阅 Aurora DSQL 的身份验证和授权。
管理员用户与普通用户
-
名为“admin”的用户会自动使用管理员身份验证令牌
-
所有其他用户都使用普通身份验证令牌
-
该连接器为每个连接动态生成令牌