Amazon RDS Proxy が RDS for SQL Server でも利用出来るようになりました

2022.09.20

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

RDS Proxy はこれまで MySQL と PostgreSQL のみ対応していたのですが、なんと本日のアップデートで RDS for SQL Server もサポートされました。

待望だった人もいるのではないでしょうか。早速試してみました。

設定方法

RDS Proxy 作成時のエンジンファミリーに SQL Server が追加されているので選択するだけです。

注意点としてリーダーエンドポイントを含めることは出来ません。

Secrets Manager へユーザー名とパスワードを格納し接続構成で使用します。
気になるのが IAM 認証です。これまで RDS for SQL Server では IAM 認証に対応していなかったのですが、RDS Proxy で IAM 認証をオフロードさせれるので SQL Server でも使えそうです。

IAM 認証を使う場合は TLS が必須なので選択しておきます。

接続する

では接続してみます。
接続先エンドポイントを RDS から RDS Proxy へ変更するだけです。

[ec2-user@ip-172-31-0-50 ~]$ sqlcmd -S hoge0920rdsproxy.proxy-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U admin
Password: 
1> use hoge1;
2> go
Changed database context to 'hoge1'.
1> select * From piyo;
2> go
foo         fuga                
----------- --------------------
          1 aaa                 
          2 bbb                 
          3 ccc                 

(3 rows affected)

接続出来ました。
これだけで RDB への接続のプーリングと共有を始めとする RDS Proxy の恩恵を受けれるのは便利ですね。

注意点として、RDS Proxy の場合はパブリックアクセスの概念がないので VPC 内からアクセスする必要があります。
名前解決の結果はプライベート IP アドレスです。

フェイルオーバーで瞬断がほぼない

フェイルオーバーも試してみます。
通常だと DNS 関係で少しフェイルオーバーまで待たなければいけませんが RDS Proxy だとうまいことやってくれるのを試してみましょう。
アップデート情報によると「フェイルオーバー時間を最大 83% 短縮(直訳)」と紹介されています。

RDS を再起動でフェイルオーバーさせてみます。

通常

RDS へ直接接続している状態でクライアントから繰り返しクエリを実行します。
クエリの内容はサーバー IP アドレスを取得するものです。

[ec2-user@ip-172-31-0-50 ~]$ sqlcmd -S hoge0920sqlstd.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U admin
Password: 
1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.31.152                                   

(1 rows affected)
1> hoge0920sqlstd.cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com
2> go
Msg 6005, Level 14, State 2, Server EC2AMAZ-D0BDI3K, Line 1
SHUTDOWN is in progress.

1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
Msg 6005, Level 14, State 2, Server EC2AMAZ-D0BDI3K, Line 1
SHUTDOWN is in progress.

:

1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.14.95

途中接続出来ない時間帯が発生していますね。

RDS Proxy

次は RDS Proxy の場合で同じように RDS をフェイルオーバーさせます。

1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.14.95      
                              
(1 rows affected)
1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.14.95                                    

(1 rows affected)
1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.31.152                                   

(1 rows affected)
1> select local_net_address from sys.dm_exec_connections where session_id = @@SPID;
2> go
local_net_address                               
------------------------------------------------
172.31.31.152

スムーズに切り替わりました!

IAM 認証が使える...はず

もうひとつ、RDS Proxy を使うことで IAM 認証を有効化していない RDS に対してアプリケーションからは IAM 認証経由で接続出来るようにすることが出来ます。

AWS re:Invent 2021 の Serverless security best practices セッションでもサーバーレスセキュリティのベストプラクティスのひとつとして RDS Proxy を使うことで IAM 認証対応させる方法が紹介されていました。

IAM 認証を試してみたのですが結論からいうとクライアントのエラーが発生して検証までたどり着けませんでした。
sqlcmdの場合だと-Pオプションは128以上の長さは指定出来ず、環境変数SQLCMDPASSWORDの場合は不正な文字列が含まれているということで以下のエラーに。

[ec2-user@ip-172-31-0-50 ~]$ export SQLCMDPASSWORD="$(aws rds generate-db-auth-token --hostname hoge0920rdsproxy.proxy-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com --port 1433 --username admin)"
[ec2-user@ip-172-31-0-50 ~]$ sqlcmd -S hoge0920rdsproxy.proxy-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com -U admin -N
Sqlcmd: Error: The environment variable: 'SQLCMDPASSWORD' has invalid value: '荐Ə'.

sqlcmdでどうにか通ったとしても、じゃあ Entity Framework だとどこで動的にトークンを取得する?など課題がいくつかあるよなーと気づいたので IAM 認証についてはほどほどで検証を辞めました。

さいごに

本日は Amazon RDS Proxy が RDS for SQL Server でも利用出来るようになったので試してみました。

RDS for Oracle、RDS for SQL Server の場合にはこれまで RDS Proxy は使えずそもそも選択肢に上がってこなかったと思いますがこれからは RDS for SQL Server でも検討出来るようになりましたので覚えておきましょう。