Amazon Web Services ブログ

Amazon RDS Proxy 経由で SQL Server に接続するモダンなサーバーレスアプリケーションをスケールさせる

モダンなサーバーレスアーキテクチャで構築されたものも含め、多くのアプリケーションはデータベースサーバーを多数接続し、データベース接続を高速にオープンしたりクローズしたりして、データベースメモリとコンピューティングリソースを使い果たす可能性があります。また、データベースには一時的な障害が発生してアプリケーションの可用性に影響が出ることもあります。最後にアプリケーションはデータベースに接続するためにデータベースの認証情報を維持する必要があるため、データ漏えいのリスクが高まりセキュリティが低下します。

本日、RDS Proxy が RDS for SQL Server をサポートするようになったことをお知らせできることを嬉しく思います。この記事では、Amazon RDS Proxy 経由での RDS for SQL Server への接続がこれらの問題を軽減してアプリケーションのスケーラビリティ、データベース障害に対する耐性、安全性を高める方法について説明します。

SQL Server は、マイクロソフトが開発したリレーショナルデータベース管理システムです。Amazon RDS for SQL Server を使用すると SQL Server のデプロイをクラウドに簡単にセットアップ、運用、スケーリングすることができます。また、Express、Web、Standard、Enterprise など SQL Server の複数のエディション (2014、2016、2017、2019) を数分でデプロイでき、費用対効果が高く、コンピューティング能力の拡張も可能です。AWS にはクラウド内のお客様のデータベースワークロードの運用とスケーリングに 10 年の経験があります。Amazon RDS でリレーショナルデータベースを運用する利点の 1 つは、データベースの管理とスケーリングにかかる多大な労力を省き、お客様を成功に導くことに集中できることです。私たちは、データベースを管理しやすくスケーラブルで可用性と耐久性を高め、さらに重要なこととして安全性とコンプライアンスを高めることでこれを実現します。

RDS Proxy 経由での RDS for SQL Server 接続の利点

RDS Proxy は、フルマネージド型の可用性の高いデータベースプロキシサービスです。そのため、RDS Proxy の使用を開始するために追加のインフラストラクチャをプロビジョニングしたり管理したりする必要はありません。さらに、RDS がお客様に代わって RDS Proxy のパッチ適用やアップグレードなどのメンテナンス作業を行います。このセクションでは、Amazon RDS Proxy 経由での SQL Server への接続がアプリケーションのスケーラビリティを高め、データベース障害に対する耐性を高め、安全性を高めるのにどのように役立つかについて説明します。

モダンなアプリケーションがマイクロサービスに移行するにつれて、サーバーレスアーキテクチャにより迅速なスケーリングが可能になりました。例えば、サーバーレス、PHP、Ruby on Rails などの技術に基づいて構築されたアプリケーションは、アプリケーションのリクエストを処理するためにデータベース接続を頻繁にオープンしたりクローズしたりすることがあります。何千もの新しい接続を頻繁に確立するとデータベースリソースが消費され、クエリの処理に使用できたはずのデータベースリソースを消費します。このような場合、RDS Proxy はアプリケーションとデータベース間のデータベース接続のプールを維持し、新しい接続を確立するときのデータベースのコンピューティングとメモリに不必要な負荷がかからないようにします。RDS Proxy は、安全な場合は複数のアプリケーション接続とデータベース接続を共有します。これは特に、アイドル状態の接続を維持しているアプリケーションやセッション内の異なるトランザクション間で十分な待機時間があるアプリケーションに役立ちます。RDS Proxy は、同じデータベース接続を複数のアプリケーション接続と共有することでバックエンドのデータベースへの接続数を減らし、データベースの CPU とメモリ消費量を削減するのに役立ちます。

ビジネス継続性を確保するために、お客様は一時的なデータベース障害から保護し、アプリケーションの可用性を向上させたいと考えています。Amazon RDS は一時的なデータベースエラーを自動的に検出し、介入なしでフェイルオーバーを実行します。

RDS Proxy は、フェイルオーバーを透過的に行い、データベースのフェイルオーバー時間を短縮することで、アプリケーションの可用性をさらに向上させます。RDS Proxy は、アプリケーション接続を維持したままトラフィックを新しいデータベースインスタンスに自動的にルーティングすることでフェイルオーバーを透過的に行い、複雑な障害をハンドリングするコードを書く必要がなくなります。データベースのフェールオーバー中はアプリケーションのレイテンシーが増加し、進行中のトランザクションを再試行しなければならない場合があります。RDS Proxy は、マルチ AZ 配置の DNS (Domain Name System) キャッシュをバイパスすることでフェイルオーバー時間を短縮するのに役立ちます。RDS for SQL Server は、SQL Server データベースミラーリングまたは Always On 可用性グループを通じて高可用性を実現するマルチ AZ 配置をサポートします。

フェールオーバーが発生するとクライアントは接続障害を検出し、新しいプライマリを検出してできるだけ早く再接続する必要があります。ただし、クライアントが DNS 名を使用してデータベースに接続する場合は、まず DNS サーバーに問い合わせて IP アドレスを解決する必要があります。その後、クライアントは応答をキャッシュします。DNS レスポンスは、プロトコルごとに Time To Live (TTL) を指定します。TTL はクライアントがレコードをキャッシュする期間を決定します。TTL 設定を最適化し、ソケットタイムアウトを 10 秒にすることで、RDS Proxy は、Always On リスナーエンドポイントへの接続よりもフェイルオーバー時間を最大 36%、RDS エンドポイントに直接接続するよりも 59%、SQL Server データベースミラーリングエンドポイントへの接続よりも 83% 短縮します。

次のテストは m5.xlarge の RDS for SQL Server インスタンスで行われ、Amazon RDS Proxy 経由で SQL Server に接続した際のタイムアウトの改善が実証されています。X 軸はフェイルオーバーの試行回数を表し、Y 軸はミリ秒単位の時間を表します。


RDS Proxy を使用すると、AWS Identity and Access Management (IAM) 認証を使用してデータベースに接続することで、アプリケーションの安全性を高めることができます。これにより、アプリケーションコードまたは静的設定ファイルにデータベースの認証情報を保存する必要がなくなります。

ソリューション概要

アプリケーションは PHP、Ruby、.NET で実行することも、AWS Lambda やコンテナなどのサーバーレスアプリケーションで実行することもできます。アプリケーションは RDS Proxy に接続し、そのプロキシはバックエンドの RDS SQL Server データベースに接続します。RDS Proxy は単一のインスタンスではありません。サーバーレスサービスに期待される高い可用性と拡張性を実現するために、複数のアベイラビリティーゾーンに分散された可用性の高いマルチインスタンスプロキシです。次の図は RDS Proxy の仕組みを示しています。

ネットワーク前提条件の設定

RDS Proxy を使用するには、RDS DB インスタンスと RDS Proxy の間に共通の Amazon Virtual Private Cloud が必要です。この VPC には、異なるアベイラビリティーゾーンにある少なくとも 2 つのサブネットが必要です。アカウントはこれらのサブネットを所有することも他のアカウントと共有することもできます。VPC 共有の詳細については、「VPC を他のアカウントと共有する」を参照してください。Amazon Elastic Compute Cloud (Amazon EC2)、Lambda、Amazon Elastic Container Service (Amazon ECS) などのクライアントアプリケーションリソースは、同じ VPC に配置することもプロキシとは別の VPC に配置することもできます。同じ VPC 内または別の VPC 内の RDS DB インスタンスに正常に接続できた場合は、必要なネットワークリソースがすでにあることに注意してください。

Amazon RDS for SQL Server を使い始めたばかりの場合は、「Amazon RDS を使用した Microsoft SQL Server データベースの作成と接続」の手順に従って環境を設定することで、データベースへの接続の基本を学ぶことができます。

また、それぞれが独自の VPC 設定を持つ複数の RDS Proxy エンドポイントを作成し、複数の共有 VPC 間の接続を有効にすることもできます。たとえば、共有 VPC にプロキシエンドポイントを作成して、プロキシの VPC 内のすべてのリソースへのアクセスを許可するのではなく、プロキシのみへのアクセスを選択的に許可することができます。プロキシエンドポイントの詳細については、「Amazon RDS Proxy エンドポイントの操作」を参照してください。

セキュリティ

データベースシークレットは、暗号化されたシークレットストアである AWS Secrets Manager に保存する必要があります。Secrets Manager では、データベース認証情報を管理および取得できます。アプリケーションから API 呼び出しを行うだけで、シークレットを取得して接続を開始できます。もう 1 つ追加された制御レイヤーは、RDS Proxy で IAM 認証を使用できることです。ユーザー名とパスワードによる接続よりもはるかに安全です。Secrets Manager を使用すると、アプリケーションがプロキシ上で使用できる認証情報を管理できます。コード内のハードコードされた認証情報は get secrets 呼び出しに置き換えるか、IAM 認証トークンを使用して削除することもできます。

次のコマンドを使用して、AWS コマンドラインインターフェイス (AWS CLI) を使用してプロキシを作成できます。

// create a secret for user credential that you use on RDS instance
// One per each credential you intend to use with proxy
aws secretsmanager create-secret \
  --name sqlserver-creds --description "db admin user" \
  --secret-string '{"username":"master","password":"**********"}'
   --region us-west-2
  
// create proxy role
aws iam create-role --role-name rds-proxy-role \
  --assume-role-policy-document '{"Version":"2012-10-17","Statement":
  [{"Effect":"Allow","Principal":{"Service":["rds.amazonaws.com"]},
  "Action":"sts:AssumeRole"}]}'
// add secrets reader policy to the role
aws iam put-role-policy --role-name rds-proxy-role \
  --policy-name rds-proxy-secret-reader-policy --policy-document
   '{"Version":"2012-10-17","Statement":[{"Sid":"getsecretvalue","Effect"
   :"Allow","Action":["secretsmanager:GetSecretValue","kms:Decrypt"],
   "Resource":"*"}]}'
  
// create proxy instance
aws rds create-db-proxy --db-proxy-name test-proxy --engine-family SQLSERVER \
--auth Description=master,AuthScheme=SECRETS,SecretArn=arn:<arn details>:<acc>:secret:sqlserver-creds-ConshD,IAMAuth=DISABLED \
--role-arn arn:aws:iam::<acc>:role/rds-proxy-role --vpc-subnet-ids subnet-XXXXX subnet-XXXXX subnet-XXXXX subnet-XXXXX --region us-west-2

// register rds instance
aws rds register-db-proxy-targets --db-proxy-name test-proxy
 --db-instance-identifiers test-instance

RDS for SQL Server を使用したプロキシの作成

指定した DB インスタンスセットの接続を管理するために、プロキシを作成できます。Amazon RDS Proxy は Amazon RDS for SQL Server、Amazon Aurora with MySQL 互換、Amazon Aurora with PostgreSQL 互換、Amazon RDS for MySQL、Amazon RDS for MariaDB、 Amazon RDS for PostgreSQL で利用できます。ここでは RDS for SQL Server の RDS Proxy に焦点を当てます。

  1. Amazon RDS コンソールのナビゲーションペインで [プロキシ] を選択します。
  2. [プロキシの作成] を選択します。
  3. プロキシ設定」のセクションでは、以下の設定に関する情報を入力します。
    1. プロキシ識別子 – AWS アカウント ID と現在の AWS リージョン内で一意になる任意の名前を指定します。
    2. エンジンファミリー – SQL Server を選択してください。
    3. Transport Layer Security が必要 – プロキシがすべてのクライアント接続に TLS/SSL を適用するように設定する場合は、この設定を選択してください。プロキシに対して暗号化された接続または暗号化されていない接続を使用する場合、プロキシは基盤となるデータベースへの接続時に同じ暗号化設定を使用します。
      注意:この項目は、今の画面レイアウトでは「接続」のセクションにあります。
    4. アイドルクライアントの接続タイムアウト – プロキシがクライアント接続を閉じるまで、クライアント接続をアイドル状態にしておく時間を選択します。デフォルトは 1,800 秒 (30 分) です。前の要求が完了してから指定された時間内にアプリケーションが新しい要求を送信しない場合、クライアント接続はアイドル状態と見なされます。基になるデータベース接続は開いたままになり、接続プールに戻されます。そのため、新しいクライアント接続に再利用できます。プロキシに古い接続を積極的に削除させたい場合は、アイドル状態のクライアント接続のタイムアウトを短くすることを検討してください。ワークロードが急増している場合は、接続を確立するコストを節約するためにアイドル状態のクライアント接続タイムアウトを長くすることを検討してください。
  4. 認証」セクションでは、次の情報を入力します。
    1. Secrets Manager シークレット – このプロキシでアクセスする RDS DB インスタンスの DB ユーザー認証情報を含む Secrets Manager シークレットを少なくとも 1 つ選択します。
    2. Access Management (IAM) ロール – 選択した Secrets Manager シークレットにアクセスする権限を持つ IAM ロールを選択します。AWS マネジメントコンソールを使用して新しい IAM ロールを作成することもできます。
    3. IAM 認証 – プロキシへの接続に IAM 認証を許可するか禁止するかを選択します。IAM 認証またはネイティブデータベース認証の選択は、このプロキシにアクセスするすべての DB ユーザーに適用されます。
    4. サブネット – このフィールドには、VPC に関連付けられているすべてのサブネットがあらかじめ入力されています。このプロキシに必要のないサブネットはすべて削除できます。少なくとも 2 つのサブネットを残す必要があります。
      注意:この項目は、今の画面レイアウトでは「接続」のセクションにあります。
  5. 追加の接続設定を指定します。
    1. VPC セキュリティグループ – 既存の VPC セキュリティグループを選択します。コンソールを使用して新しいセキュリティグループを作成することもできます。このセキュリティグループは、プロキシが接続するデータベースへのアクセスを許可する必要があります。アプリケーションからプロキシへの通信、プロキシからデータベースへの通信には、同じセキュリティグループが使用されます。例えば、データベースとプロキシに同じセキュリティグループを使用しているとします。この場合、そのセキュリティグループ内のリソースが同じセキュリティグループ内の他のリソースと通信できるように指定してください。共有 VPC を使用する場合、その VPC のデフォルトのセキュリティグループや別のアカウントに属するセキュリティグループは使用できません。自分のアカウントに属するセキュリティグループを選択してください。存在しない場合は作成してください。この制限について詳しくは、「制限事項」を参照してください。
  6. オプションで、高度な設定を行います。
    1. 拡張ログ記録をアクティブ化 – この設定を有効にすると、プロキシの互換性やパフォーマンスの問題をトラブルシューティングできます。この設定を有効にすると RDS Proxy は SQL ステートメントに関する詳細情報をログに記録します。この情報は、SQL の動作やプロキシ接続のパフォーマンスとスケーラビリティに関する問題のデバッグに役立ちます。デバッグ情報には、プロキシ経由で送信する SQL ステートメントのテキストが含まれます。従って、この設定はデバッグに必要な場合とログに表示される機密情報を保護するためのセキュリティ対策が講じられている場合にのみ有効にしてください。プロキシに関連するオーバーヘッドを最小限に抑えるため、RDS Proxy はこの設定を有効化してから 24 時間後に自動的にオフにします。特定の問題をトラブルシューティングするには、この設定を一時的に有効にしてください。
  7. [プロキシの作成] を選択します。

RDS Proxy に接続する

プロキシを作成すると、その DNS エンドポイントにアクセスしてアプリケーションを接続できます。RDS Proxy は SQL Server のデフォルトポート 1433 を使用します。プロキシエンドポイントの詳細は、Amazon RDS コンソールの対応するプロキシの詳細ページで取得することも、AWS CLI の describe-db-proxies コマンドを使用して取得することもできます。以下のコード例を参照してください。

# Add —output text to get output as a simple tab-separated list.
$ aws rds describe-db-proxies —query '*[*].{DBProxyName:DBProxyName,Endpoint:Endpoint}'
[
[
{
"Endpoint": "the-proxy.proxy-demo.us-east-1.rds.amazonaws.com",
"DBProxyName": "the-proxy"
},
{
"Endpoint": "the-proxy-other-secret.proxy-demo.us-east-1.rds.amazonaws.com",
"DBProxyName": "the-proxy-other-secret"
},
{
"Endpoint": "the-proxy-rds-secret.proxy-demo.us-east-1.rds.amazonaws.com",
"DBProxyName": "the-proxy-rds-secret"
},
{
"Endpoint": "the-proxy-t3.proxy-demo.us-east-1.rds.amazonaws.com",
"DBProxyName": "the-proxy-t3"
}
]
]

ユーザー名とパスワードを含む Secrets Manager シークレットを設定し、RDS Proxy がシークレットマネージャーから認証情報を取得することを許可できます。IAM 認証は、クライアントプログラムとプロキシ間の接続に適用されます。その後、プロキシは Secrets Manager から取得したユーザー名とパスワードの認証情報を使用してデータベースを認証します。RDS Proxy では複数のシークレットを設定できます。詳細については、create-db-proxy を参照してください。

SQL Server の場合は、ドライバごとに適切なトークンプロパティを使用する必要があります。JDBC の場合は AccessToken、ODBC の場合は sql_copt_ss_access_token、.NET SqlClient の場合は AccessToken です。このようなプロパティをサポートしていない他のツールは IAM 認証方法を使用できません。この記事の執筆時点では、AD 認証はサポートされていません。

RDS Proxy for RDS SQL Server のモニタリング

Amazon CloudWatch を使用して RDS Proxy をモニタリングできます。CloudWatch はプロキシから未加工データを収集し、読み取り可能でほぼリアルタイムのメトリクスに加工します。CloudWatch コンソールでこれらのメトリクスを見つけるには、ナビゲーションペインで [すべてのメトリクス] を選択し、[RDS]、[プロキシごとのメトリクス] を選択します。詳細については、「Amazon CloudWatch メトリクスを使用する」を参照してください。

環境の後片付け

次の手順では、このチュートリアルで作成したリソースをクリーンアップします。

  1. Amazon RDS コンソールのナビゲーションペインで [プロキシ] を選択します。
  2. プロキシを選択し、[アクション] メニューで [削除] を選択します。
  3. ダイアログボックスに「delete me」と入力し、[削除] を選択します。
    プロキシのステータスが [削除中] に変わります。完了すると、プロキシはリストから削除されます。AWS CLI で DB プロキシを削除するには、delete-db-proxy コマンドを使用します。関連するアソシエーションを削除するには、deregister-db-proxy-targets コマンドを使用します。次のコードを参照してください。

    aws rds delete-db-proxy --name proxy_name
    aws rds deregister-db-proxy-targets
        --db-proxy-name proxy_name
        [--target-group-name target_group_name]
        [--target-ids comma_separated_list]       # or
        [--db-instance-identifiers instance_id]       # or
        [--db-cluster-identifiers cluster_id]

  4. Secrets Manager コンソールで、シークレットを選択します。
  5. 「アクション」メニューで [シークレットを削除] を選択します。
  6. このチュートリアル用に新しい EC2 インスタンス、RDS インスタンス、および対応するセキュリティグループを作成した場合は、それらのリソースも削除してください。

まとめ

RDS Proxy を使用すると、アプリケーションはデータベースと確立された接続をプールして共有できるため、データベースの効率とアプリケーションのスケーラビリティが向上します。RDS Proxy 経由での RDS for SQL Server への接続では、Always On リスナーエンドポイントに接続するよりもフェイルオーバー時間を最大 36% 短縮し、RDS エンドポイントに直接接続する場合と比べてフェイルオーバー時間を最大 59% 短縮します。RDS Proxy を使用すると、SQL Server データベースミラーリングエンドポイントに接続するときのフェイルオーバー時間が最大 83% 短縮されます。また、RDS Proxy では IAM 認証を使用できるため、アプリケーションに認証情報を保存する必要がないため、アプリケーションのセキュリティが向上します。この投稿では、RDS proxy で SQL Server に接続するための設定方法を示し、これらの潜在的な利点について詳しく説明しました。

RDS for SQL Server インスタンスでこのソリューションを試してみてください。コメントや質問がある場合は、コメント欄に残してください。


著者について

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

Lakshman Thatisetty は、アマゾンウェブサービスのデータベーススペシャリストクラウドソリューションアーキテクトです。彼は AWS のお客様と協力してデータベースプロジェクトに関する顧客ソリューションを設計し、既存のデータベースを AWS クラウドに移行して近代化する支援や、AWS での大規模な移行のオーケストレーションを支援しています。

 

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