AWS Advanced .NET Data Provider Wrapper
The AWS Advanced .NET Data Provider Wrapper enhances .NET database providers with AWS-specific features for Amazon Aurora and RDS databases.
Latest Version: 1.0.1
Repository: github.com/aws/aws-advanced-dotnet-data-provider-wrapper
Installation
dotnet add package AWS.AdvancedDotnetWrapper
NuGet Package Manager:
Install-Package AWS.AdvancedDotnetWrapper
Quick Start
PostgreSQL:
using AWS.AdvancedDotnetWrapper;
using Npgsql;
var config = new AwsWrapperConnectionConfig
{
Host = "cluster.region.rds.amazonaws.com",
Database = "mydb",
Username = "username",
Password = "password",
Plugins = "failover,iam"
};
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
using var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT 1";
var result = await cmd.ExecuteScalarAsync();
MySQL:
using AWS.AdvancedDotnetWrapper;
using MySqlConnector;
var config = new AwsWrapperConnectionConfig
{
Host = "cluster.region.rds.amazonaws.com",
Database = "mydb",
Username = "username",
Password = "password",
Plugins = "failover,iam"
};
using var conn = new AwsWrapperConnection<MySqlConnection>(config);
await conn.OpenAsync();
Key Features
- Failover Plugin: Automatic failover for Aurora clusters
- IAM Authentication Plugin: AWS IAM database authentication
- Secrets Manager Plugin: Credential management via AWS Secrets Manager
- Read/Write Splitting Plugin: Intelligent query routing
- Host Monitoring Plugin: Connection health tracking
- Provider Support: Compatible with Npgsql (PostgreSQL) and MySqlConnector (MySQL)
Configuration
Configure plugins via connection config:
var config = new AwsWrapperConnectionConfig
{
Plugins = "failover,iam,secretsManager",
FailoverTimeoutMs = 60000,
Region = "us-east-1"
};
Common Configurations
Basic Failover
var config = new AwsWrapperConnectionConfig
{
Host = "cluster.region.rds.amazonaws.com",
Database = "mydb",
Username = "username",
Password = "password",
Plugins = "failover"
};
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
IAM Authentication
var config = new AwsWrapperConnectionConfig
{
Host = "cluster.region.rds.amazonaws.com",
Database = "mydb",
Username = "iamuser",
Plugins = "failover,iam",
Region = "us-east-1"
};
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
Secrets Manager
var config = new AwsWrapperConnectionConfig
{
Plugins = "failover,secretsManager",
SecretId = "arn:aws:secretsmanager:region:account:secret:name",
Region = "us-east-1"
};
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
Read/Write Splitting
var config = new AwsWrapperConnectionConfig
{
Host = "cluster.region.rds.amazonaws.com",
Database = "mydb",
Username = "username",
Password = "password",
Plugins = "failover,readWriteSplitting"
};
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
// Reads go to reader
using var readCmd = conn.CreateCommand();
readCmd.CommandText = "SELECT * FROM users";
var reader = await readCmd.ExecuteReaderAsync();
// Writes go to writer
using var writeCmd = conn.CreateCommand();
writeCmd.CommandText = "INSERT INTO users VALUES (@name, @email)";
writeCmd.Parameters.AddWithValue("@name", "name");
writeCmd.Parameters.AddWithValue("@email", "email");
await writeCmd.ExecuteNonQueryAsync();
Async/Await Support
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
using var cmd = conn.CreateCommand();
cmd.CommandText = "SELECT * FROM users WHERE id = @id";
cmd.Parameters.AddWithValue("@id", userId);
using var reader = await cmd.ExecuteReaderAsync();
while (await reader.ReadAsync())
{
// Process results
}
Transaction Handling
using var conn = new AwsWrapperConnection<NpgsqlConnection>(config);
await conn.OpenAsync();
using var transaction = await conn.BeginTransactionAsync();
try
{
using var cmd = conn.CreateCommand();
cmd.Transaction = transaction;
cmd.CommandText = "INSERT INTO users VALUES (@name, @email)";
cmd.Parameters.AddWithValue("@name", "name");
cmd.Parameters.AddWithValue("@email", "email");
await cmd.ExecuteNonQueryAsync();
await transaction.CommitAsync();
}
catch
{
await transaction.RollbackAsync();
throw;
}