.NET アプリケーションで Amazon RDS / Aurora 向けのデータベース接続ドライバー「AWS Advanced .NET Data Provider Driver」が GA になったので使ってみた

.NET アプリケーションで Amazon RDS / Aurora 向けのデータベース接続ドライバー「AWS Advanced .NET Data Provider Driver」が GA になったので使ってみた

2025.11.09

いわさです。

先日次のアナウンスがあったのですが、「AWS Advanced .NET Data Provider Driver」というデータベース接続用のドライバーがリリースされました。
リポジトリ見る感じ開発自体は 2025 年の 4 月ごろより開始されていたようなのですが、今回 GA という形で我々もアプリケーションに組み込んで利用できるようになりました。

https://aws.amazon.com/about-aws/whats-new/2025/11/aws-net-data-provider-driver/

.NET で Aurora PostgreSQL / MySQL へ接続する際には Npgsql や MySql.Data を接続することが多いと思いますが、AWS Advanced .NET Data Provider Driver はそれら既存のドライバーを包括しつつ機能強化したものになります。

例えば、通常 Aurora のフェイルオーバー機能によって高い可用性が実現できますが、実際にはフェイルオーバーが起きた場合はクライアント側では DNS で新しい接続先に解決できるようになるまで接続に失敗することがあります。
AWS Advanced .NET Data Provider Driver では DNS の切り替わりを待たずにアクティブに接続先変更と再試行を行います。

他にも AWS Secrets Manager や IAM 認証などの AWS 組み込みの各種機能にも対応しています。

AWS Advanced .NET Data Provider Wrapper を試してみる

リポジトリはこちらになります。

https://github.com/aws/aws-advanced-dotnet-data-provider-wrapper

フェイルオーバー自体は発生させていないのですが最も代表的なプラグインであるフェイルオーバープラグインを使った接続を今回は試してみました。
仕組みとしてはドライバーが、認識済みのリーダーの中からプライマリ DB インスタンスとして接続試行することで DNS の解決よりも先に特定してくれます。

7C56BD39-B32E-47C1-81E5-4F6D283D0D4A.png
aws-advanced-dotnet-data-provider-wrapper/docs/using-the-dotnet-driver/using-plugins/UsingTheFailoverPlugin.md at main · aws/aws-advanced-dotnet-data-provider-wrapper より

上記 AWS Advanced .NET Data Provider Wrapper をクローンし、.NET コンソールアプリケーションから Aurora MySQL への接続を試してみます。
事前に Aurora MySQL クラスターは構築済みです。

Program.cs
using System.Data;
using AwsWrapperDataProvider;
using AwsWrapperDataProvider.Driver.Plugins;

namespace AwsAdvancedDataProviderSample;

class Program
{
    static async Task Main(string[] args)
    {
        Console.WriteLine("AWS Advanced .NET Data Provider Driver Sample");
        Console.WriteLine("==============================================");

        // MySQL example
        await TestMySqlConnection();
    }

    static async Task TestMySqlConnection()
    {
        Console.WriteLine("\n--- MySQL Connection Test ---");
        const string connectionString = "Server=hoge1109aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com;Database=hogedb;User Id=admin;Password=hogehoge;Plugins=failover;";
        
        try
        {
            using var connection = new AwsWrapperConnection<MySql.Data.MySqlClient.MySqlConnection>(connectionString);
            
            Console.WriteLine("Opening MySQL connection...");
            await connection.OpenAsync();
            
            Console.WriteLine("Connection opened successfully!");
            Console.WriteLine($"Connection State: {connection.State}");
            
            // Execute a simple query
            using var command = connection.CreateCommand<MySql.Data.MySqlClient.MySqlCommand>();
            command.CommandText = "SELECT 'Hello from MySQL with AWS Advanced Driver!' AS message, NOW() AS current_datetime";
            
            using var reader = await command.ExecuteReaderAsync();
            if (await reader.ReadAsync())
            {
                Console.WriteLine($"Message: {reader.GetString("message")}");
                Console.WriteLine($"Current Time: {reader.GetDateTime("current_datetime")}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"MySQL Connection Error: {ex.Message}");
            Console.WriteLine("Note: Make sure MySQL server is running and connection details are correct.");
        }
    }
}

このサンプルコードでは接続文字列や認証情報はハードコーディングされている点に注意してください。
実行してみると、次のように Aurora クラスターへ接続し、サンプルクエリが実行できていると思います。

% dotnet run
AWS Advanced .NET Data Provider Driver Sample
==============================================

--- MySQL Connection Test ---

:

Connection opened successfully!
2025-11-08 21:44:17.945 dbug: AwsWrapperDataProvider.Driver.PluginService[0]
      PluginService.RefreshHostList() completed with AllHost = All Hosts Topology@15225125
          HostSpec@B09DCB2D [host=hoge1109aurora-instance-1.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com, port=-1, Writer, Available, weight=12, 11/8/2025 9:44:16 PM, host id=hoge1109aurora-instance-1]
Connection State: Open

:

Message: Hello from MySQL with AWS Advanced Driver!
Current Time: 11/8/2025 9:44:17 PM

AWS Secrets Manager のシークレットを使ってみる

AWS Advanced .NET Data Provider Driver では AWS Secretes Manager を直接統合できるみたいなのでそれも試してみましょう。
以前からデータベース接続のシークレットはうまいことアプリケーションに透過的に組み込めないかなーと思っていたのですが、今回のはなかなか良さそうです。

事前に Aurora と AWS Secrets Manager を統合させ、自動でシークレットを作成してもらいました。

0482D531-35DE-4842-98FC-E1E71621DC6E.png

使い方ですが、接続文字列上でユーザー名とパスワードを指定せずに、シークレットの参照を指定します。
そして、プラグイン使用前にSecretsManagerAuthPluginFactoryを使ってプラグインの初期化だけ行います。

Program.cs
using System.Data;
using AwsWrapperDataProvider;
using AwsWrapperDataProvider.Driver.Plugins;
using AwsWrapperDataProvider.Plugin.SecretsManager.SecretsManager;

namespace AwsAdvancedDataProviderSample;

class Program
{

:

    static async Task TestMySqlConnection()
    {
        Console.WriteLine("\n--- MySQL Connection Test ---");
        
        ConnectionPluginChainBuilder.RegisterPluginFactory<SecretsManagerAuthPluginFactory>(PluginCodes.SecretsManager);
        const string connectionString = "Server=hoge1109aurora.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com;Database=hogedb;SecretsManagerSecretId=rds!cluster-cd1fa640-6fb2-4ad0-afad-837e319315a4;SecretsManagerRegion=ap-northeast-1;Plugins=awsSecretsManager;";
        
        try
        {
            using var connection = new AwsWrapperConnection<MySql.Data.MySqlClient.MySqlConnection>(connectionString);
            
            Console.WriteLine("Opening MySQL connection...");
            await connection.OpenAsync();
            
            Console.WriteLine("Connection opened successfully!");
            Console.WriteLine($"Connection State: {connection.State}");
            
            // Execute a simple query
            using var command = connection.CreateCommand<MySql.Data.MySqlClient.MySqlCommand>();
            command.CommandText = "SELECT 'Hello from MySQL with AWS Advanced Driver!' AS message, NOW() AS current_datetime";
            
            using var reader = await command.ExecuteReaderAsync();
            if (await reader.ReadAsync())
            {
                Console.WriteLine($"Message: {reader.GetString("message")}");
                Console.WriteLine($"Current Time: {reader.GetDateTime("current_datetime")}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"MySQL Connection Error: {ex.Message}");
            Console.WriteLine("Note: Make sure MySQL server is running and connection details are correct.");
        }
    }
}

コード上からユーザー名とパスワードを削除することが出来ましたね。
接続元のクライアント上で AWS Secrets Manager にアクセスできる認証情報を構成した上でアプリケーションを実行してみましょう。

% dotnet run
AWS Advanced .NET Data Provider Driver Sample
==============================================

--- MySQL Connection Test ---
2025-11-08 22:02:23.568 dbug: AwsWrapperDataProvider.Driver.Dialects.DialectProvider[0]
      Guessed dialect: AwsWrapperDataProvider.Driver.Dialects.AuroraMySqlDialect
2025-11-08 22:02:23.577 dbug: AwsWrapperDataProvider.Driver.Plugins.ConnectionPluginChainBuilder[0]
      Current Plugins: awsSecretsManager

:

Opening MySQL connection...

:

Connection opened successfully!

:

Connection State: Open

:

Message: Hello from MySQL with AWS Advanced Driver!
Current Time: 11/8/2025 10:02:24 PM

:

ログからawsSecretsManagerの初期化がされていることがわかります。
そして先程と同じようにクラスターへ無事接続することが出来ました。良い感じです。

本日時点の制限事項

一点注意事項がありまして、本日時点ではいくつかまだ制限事項があります。

  • PostgreSQL では Entity Framework Code がサポートされていない
  • Aurora Blue/Green デプロイメント、Aurora Limitless Database、Aurora Global Database の未サポート

制限事項の対応状況、最新情報は以下のドキュメントを確認してください。

https://github.com/aws/aws-advanced-dotnet-data-provider-wrapper/tree/main/docs

さいごに

本日は .NET アプリケーションで Amazon RDS / Aurora 向けのデータベース接続ドライバー「AWS Advanced .NET Data Provider Driver」が GA になったので使ってみました。

Aurora などのマネージドサービスの機能を使った時、サーバーとクライアント双方の挙動によって十分に恩恵を受けきれない時があります。
今回の AWS Advanced .NET Data Provider Driver を使うことでその制限を緩和してより効果的にクライアントとサーバーが連動できるようになりそうです。制限事項に注意しつつ採用していきたいですね。

この記事をシェアする

FacebookHatena blogX

関連記事