Amazon Web Services ブログ

IAM 認証を使用した Amazon RDS Proxy 経由で接続する RDS for SQL Server のデプロイ

Amazon RDS Proxy は、フルマネージド型の可用性の高いデータベースプロキシサービスです。RDS Proxy の使用を開始するにあたり、追加のインフラストラクチャをプロビジョニングしたり管理したりする必要はありません。これに加えて、Amazon Relational Database Service (Amazon RDS) は RDS Proxy のメンテナンス作業を完全に管理します。アップグレードやパッチ適用などは、アプリケーションのダウンタイムを避けるために段階的に実施されます。

この投稿では、プレーンテキストパスワードの使用を避けてデータベースインスタンスの安全性を高め、RDS Proxy による IAM 認証を使用して PowerShell および .Net ベースのアプリケーションから RDS for SQL Server インスタンスに接続する方法について説明します。

RDS Proxy を使用するメリット

モダンなアプリケーションはかつてないほど要求が厳しくなり、急速にスケーリングできるサーバーレスアーキテクチャやマイクロサービスに指数関数的に移行しています。

RDS Proxy 経由での SQL Server への接続は、このようなアプリケーションのニーズに応え、次のような利点があります。

  1. スケーラビリティとパフォーマンスの向上
    サーバーレス、PHP、Ruby on Rails などのテクノロジーに基づいて構築されたアプリケーションは、アプリケーションのリクエストを処理するためにデータベース接続を頻繁にオープンしたりクローズしたりすることがあります。何千もの新しい接続を確立するとクエリの処理に使用できたはずのデータベースリソースが頻繁に消費されます。

    RDS Proxy は、アイドル状態の接続を維持したり、セッション内のさまざまなトランザクション間で十分な待機時間を確保したりするアプリケーションを支援します。RDS Proxy は同じデータベース接続を複数のアプリケーション接続と共有することで、バックエンドデータベースへの接続数を減らし、データベースの CPU とメモリ消費量を削減するのに役立ちます。
  2. 信頼性
    RDS Proxy 経由で接続すると、データベースフェイルオーバーに対するアプリケーションの回復力が高まります。RDS Proxy は DNS の伝播に依存しないため、フェイルオーバー時間を最大 66% 短縮できます。また、元の DB インスタンスが使用できなくなっても、RDS Proxy はアイドル状態のアプリケーション接続を切断せずにスタンバイデータベースに接続します。そうすることでフェイルオーバーのスピードアップとフェイルオーバープロセスの簡素化に役立ちます。
  3. セキュリティ
    プレーンテキストパスワードを使用してデータベースインスタンスに接続することは、今でもデータベース認証のメカニズムとして広く使用されていますが、セキュリティリスクに対する脆弱性、コンプライアンス上の問題、管理オーバーヘッドの増加などのいくつかの課題が伴います。RDS Proxy 経由での SQL Server への接続では、AWS Secrets ManagerAWS Identity and Access Management (IAM) を通じてデータベースの認証情報とアクセスを管理できるようになり、アプリケーションにデータベース認証情報を埋め込む必要がなくなりました。この記事では、PowerShell および .NET Framework ベースのアプリケーション用に IAM 認証を使用する RDS Proxy for SQL Server をセットアップする方法を説明します。

前提条件

RDS Proxy は、データベースインスタンスと同じ Amazon Virtual Private Cloud (Amazon VPC) 内にある必要があり、パブリックにアクセスすることはできません (ただし、データベースインスタンスはアクセス可能です)。RDS Proxy for SQL Server 経由で IAM 接続を確立するには、同じ VPC 内にあるクライアントを使用するか専用ネットワークをセットアップします。

この記事の目的と IAM 接続をテストするために、お使いの RDS for SQL Server インスタンス、RDS Proxy と同じ VPC 内に Windows ベースの Amazon Elastic Compute Cloud (Amazon EC2) インスタンスをセットアップします。PowerShell と .NET サンプルコードを使用して接続をテストするには、AWS コマンドラインインターフェイス (AWS CLI) をセットアップする必要もあります。このセクションでは、ソリューションの使用を開始する前に前提条件となる設定手順を順を追って説明します。

SQL サーバー DB インスタンスを設定

Amazon RDS の基本的な構成要素は DB インスタンスです。RDS DB インスタンスはオンプレミスの SQL Server と似ています。SQL Server DB インスタンスをプロビジョニングする手順については、「Microsoft SQL Server DB インスタンスを作成して接続する」を参照してください。作成後、エンドポイントをメモしておきます。

RDS Proxy 経由で接続する SQL Server の設定

RDS Proxy 経由で接続する SQL Server を設定する手順については、「Amazon RDS Proxy 経由で SQL Server に接続するモダンなサーバーレスアプリケーションをスケールさせる」を参照してください。

AWS CLI の設定

RDS Proxy 経由で接続する SQL Server インスタンスおよび RDS Proxy 経由で接続する SQL Server と同じ VPC にある Windows ベースの Amazon EC2 インスタンス用に AWS CLI をインストールして設定します。

RDS Proxy 用の TLS/SSL の有効化

RDS Proxy 経由で接続する Amazon RDS for SQL Server で IAM 認証を使用するには、RDS Proxy を作成する際に [Transport Layer Security が必要] の設定を有効にします。

RDS Proxy は AWS Certificate Manager (ACM) の証明書を使用します。RDS Proxy を使用している場合は、Amazon RDS 証明書をダウンロードしたり、RDS Proxy 接続を使用するアプリケーションを更新したりする必要はありません。

PowerShell に対する IAM 認証の構成

IAM 認証による RDS Proxy へのアプリケーション接続では、パスワードフィールドの代わりに認証トークンが使用されます。ただし、RDS Proxy から基盤となるデータベースへの接続は Secrets Manager からユーザー名とパスワードの詳細を取得することによって確立されます。

次の AWS CLI スクリプトを実行して認証トークンを生成します。

aws rds generate-db-auth-token --hostname <proxy-endpoint> --port 1433 --region <Region> --username <UserName>

ユーザー名は大文字と小文字が区別されることに注意してください。また、認証トークンの有効期間は 15 分です。これによって IAM 認証による接続をテストできます。

IAM 認証を使用して RDS for SQL Server インスタンスに接続するには、データベースドライバーの適切なトークンプロパティを使用する必要があります。この例では、.Net SqlClient ドライバーの AccessToken プロパティを使用します。

環境に応じてパラメータ値を置き換え、同じ VPC 内に作成された EC2 インスタンスから次の PowerShell スクリプトを実行します。

$RDSSQLProxy = "<proxy-endpoint>"

$Database = "<dbadmin>"

$ConnectionString = "Server=tcp:$($RDSSQLProxy),1433;Initial Catalog=$($Database);Persist Security Info=False;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False"

$AuthToken = "Auth Token Generated in the previous Step"

$SQLConnection = New-Object System.Data.SqlClient.SqlConnection($ConnectionString)

$SQLConnection.AccessToken = $AuthToken

$SQLConnection.Open()

$query = "SELECT * FROM sys.databases"

$command = New-Object System.Data.SqlClient.SqlCommand($query, $SQLConnection)

$reader = $command.ExecuteReader()

while($reader.Read())

{
Write-Output $reader[0]
	}

接続に成功すると、SELECT * FROM sys.databases の出力が表示されるはずです。

.NET フレームワークに対する IAM 認証の設定

.NET Framework は、C#、F#、Visual Basic、およびその他の一般的なプログラミング言語で開発されたアプリケーションと連携するため、Web ベースのアプリケーションで人気があります。このデモでは、まず .NET Framework 用の基本的なコンソールアプリケーションを作成して、Amazon RDS for SQL Server で IAM 認証をテストします。コンソールアプリケーションは簡単にデプロイでき、Windows の cmd プロンプトから実行できます。

このセクションでは、AWS SDK for Amazon RDSRDSAuthTokenGenerator クラスを使用して DB 認証トークンを生成し、.Net Framework の SQLConnection クラスの AccessToken プロパティを生成してDB 認証トークンを介して接続を認証する方法について説明します。同様の例を使用して、フォーム、ウェブアプリケーション、MVC などの他のアプリケーションを作成できます。

  1. EC2 インスタンスに Visual Studio をインストールして設定します。
  2. 新しいプロジェクトを作成し、コンソールアプリケーション (.NET Framework) を選択します。
  3. [次へ] を選択します。
  4. [プロジェクト名] に名前を入力します (例えば、RDSProxy_IAMAuth_RDSSql) 。
  5. フレームワークには、.NET Framework バージョン 4.6 以降を選択します。
  6. [作成] を選択します。
  7. これでプロジェクトを表示できます。

次に、AWS SDK for Amazon RDS を追加して RDSAuthTokenGenerator クラスを公開し、DB 認証トークンを生成する必要があります。

  1. ソリューションエクスプローラーでプロジェクト名を選択 (右クリック) し、[NuGet パッケージの管理] を選択します。
  2. AWSSDK.RDS を参照し、[インストール] を選択します。
  3. ポップアップメッセージで [OK] を選択し、インストールを完了します。
  4. NuGet ウィンドウを閉じて、メインプログラムファイル (Program.cs) に戻ります。
  5. Main クラス内に次のコードを入力します (サンプルコード内のコメントに従い、環境の詳細に従ってパラメータ値を変更してください)。
    // Replace these values with your own Amazon RDS Instance and RDS Proxy details
    
    string rdsProxyEndpoint = "<proxy-endpoint>";
    int port = 1433;
    string username = "<username>";
    string dbname = "<dbname>";
    
    // Create Connection String to connect to your RDS for SQL Server instance via RDS Proxy
    var connectionString = $"Server=tcp:{rdsProxyEndpoint},{port};Initial Catalog={dbname};Persist Security Info=False;Connect Timeout=30;Encrypt=True;TrustServerCertificate=False";
    
    // Create DB Authentication Token
    var authToken = Amazon.RDS.Util.RDSAuthTokenGenerator.GenerateAuthToken(rdsProxyEndpoint, port, username);
    
    // Create a new SQLConnection Object by using ConnectionString created in previous steps
    
    using(SqlConnection RDSSQLConnection = new SqlConnection(connectionString))
    {
    // Use AccessToken Property and provide DB Authentication Token to authenticate connection with RDS for SQL Server instance
    RDSSQLConnection.AccessToken = authToken;
    
    //Open Connection
    RDSSQLConnection.Open();
    
    //Write your query to access data from RDS for SQL Server instance, for example, List all Databases on RDS for SQL Server instance
    string query = @"SELECT @@ServerName";
    
    SqlCommand command = new SqlCommand(query, RDSSQLConnection);
    
    //execute the SQLCommand
    SqlDataReader reader = command.ExecuteReader();
    
    //display retrieved record (first column only/string value)
    while(reader.Read())
    {
    Console.WriteLine(reader.GetString(0));
    }
    
    //Close Connection
    RDSSQLConnection.Close();
    }

  6. ソリューションをビルドし、プロジェクト実行ファイルのビルドパスを書き留めておきます。
  7. cmd プロンプトを開き、ビルドパスに移動してソリューションの .exe ファイルを実行します。

成功すると指定したクエリの出力が表示されます。例えば、上記のサンプルコードを使用した場合はサーバー名が表示されます。

後片付け

Visual Studio プロジェクトをクリーンアップするには、次の手順を実行します。

  1. Visual Studio で、[表示]、[アプリケーションエクスプローラー] を選択してアプリケーションエクスプローラーを開きます。
  2. Visual Studio プロジェクトフォルダーの下にあるプロジェクトに移動します。
  3. プロジェクトを選択 (右クリック) し、[削除] を選択します。
  4. 確認ポップアップで [OK] を選択します。

DB インスタンスは、AWS マネジメントコンソール、AWS CLI、または Amazon RDS API を使用して削除できます。DB インスタンスの削除に必要な時間は、バックアップ保持期間 (削除するバックアップの数)、削除されるデータ量、最終スナップショットを作成するかどうかによって異なります。RDS for SQL Server DB インスタンスを削除するには、次のことを行う必要があります。

  1. Amazon RDS コンソールのナビゲーションペインで、[データベース] を選択し、削除する DB インスタンスを選択します。
  2. [アクション] メニューで [削除] を選択します。
  3. DB インスタンスの最終的な DB スナップショットを作成するには、[最終スナップショットの作成] を選択します。
  4. 最終スナップショットを作成する場合は、[最終スナップショット名] に名前を入力します。
  5. 自動バックアップを保持するには、 [自動バックアップを保持] を選択します。
  6. テキストフィールドに「delete me」と入力します。
  7. [削除] を選択します。

まとめ

この投稿では、RDS Proxy 経由での SQL Server 接続で IAM 認証を使用する利点を示し、PowerShell および .NET ベースのアプリケーションからの接続を設定する方法を示しました。質問やフィードバックがある場合はコメント欄に残してください。


著者について

Sudarshan Roy は、AWS Worldwide Database Services Organization (DBSO) のシニア RDS スペシャリストクラウドソリューションアーキテクトです。彼の専門分野は、AWS RDS サービスを利用するエンタープライズのお客様向けのモダンなデータベースプラットフォームの設計、構築、実装です。余暇には、クリケットをしたり、家族と過ごすのが大好きです。

Sikandra Chaudhary は、AWS の RDS PostgreSQL ソリューションアーキテクトです。Sikandra は AWS のお客様のアーキテクチャ設計を支援し、データベースワークロードを AWS に移行して実行するための効率的なソリューションを提供しています。彼は PostgreSQL と Microsoft SQL Server のデータベーステクノロジーに関する専門知識を持っています。

 

 

翻訳はソリューションアーキテクトの Yoshinori Sawada が担当しました。原文はこちらです。