Amazon Aurora Serverless v2 で Babelfish for Aurora PostgreSQL が使えるのかを試してみた

2022.05.11

いわさです。

先日、Aurora Serverless v2がGAとなりましたね。

Aurora Serverless v2 は PostgreSQLでも使うことが出来ます。
一方で、Aurora PostgreSQLにはBabelfishという機能もあります。

Babelfish for Aurora PostgreSQL は Aurora PostgreSQLで有効化出来る拡張機能で、SQL Serverで使用するTDSプロトコル用のエンドポイントを提供します。
これによって、SQL Serverが必要なアプリケーションのデータベース接続先をTDSのままでAurora PostgreSQLにすることが出来る機能です。(必ずしも移行出来るわけではなく、互換性を意識しながら利用する必要があります)

その、Babelfishは Aurora PostgreSQL の v13.4以上から利用が可能です。
これまで、Aurora Serverless v1 で利用出来るPostgreSQLバージョンは v10.14 だったので Babelfish を使うことは出来ませんでした。

しかし、今回GAとなった Aurora Serverless v2 でサポートされている PostgreSQL のバージョンはv13.6以上です。
つまり、Babelfishの利用可能なバージョンです。
これは使えるかもしれませんね、ということで試してみました。

Babelfish + Serverless いけるか...

Amazon Aurora を PostgreSQL互換エディションで作成します。
Serverless v2 と Babelfish for PostgreSQL をどちらもサポートする現時点で唯一のバージョンである、v13.6 を選択します。

インスタンス設定はもちろん「サーバーレス」を選択します。
容量は適当に設定しました。

Babelfishをオンにしましょう。

出来ていそうですね。
インスタンスサイズがServerless v2(0.5~1 ACU)となっており、エンドポイントの1433が有効になっています。

今回はパブリックアクセスを有効化してあるので、ローカル環境から接続確認してみます。

sqlcmdユーティリティで接続

問題なくアクセス出来ますね。
テーブルやレコードを作成してみます。

$ sqlcmd -S database-1.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com,1433 -U postgres
Password: 
1> create database hoge;
2> go
1> create table piyo (foo INT NOT NULL IDENTITY(1,1) PRIMARY KEY, fuga VARCHAR(20) NULL);
2> go
1> insert into piyo (fuga) values ('hoge1');
2> insert into piyo (fuga) values ('hoge2');
3> insert into piyo (fuga) values ('hoge3');
4> go

(1 rows affected)

(1 rows affected)

(1 rows affected)
1> select * from piyo;
2> go
foo         fuga                
----------- --------------------
          1 hoge1               
          2 hoge2               
          3 hoge3               

(3 rows affected)

PostgreSQLクライアントから

こちらも問題なくアクセス出来ますね。
先程TDS側で作成したレコードにアクセスして確認することも出来ました。

$ psql -U postgres -h database-1.cluster-cpnu9ipu74g4.ap-northeast-1.rds.amazonaws.com       
Password for user postgres: 
psql (14.2, server 13.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> \l
                                     List of databases
     Name     |  Owner   | Encoding |   Collate   |    Ctype    |    Access privileges     
--------------+----------+----------+-------------+-------------+--------------------------
 babelfish_db | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =Tc/postgres            +
              |          |          |             |             | postgres=CTc/postgres   +
              |          |          |             |             | sysadmin=C*T*c*/postgres+
              |          |          |             |             | master_dbo=CTc/sysadmin +
              |          |          |             |             | tempdb_dbo=CTc/sysadmin +
              |          |          |             |             | msdb_dbo=CTc/sysadmin   +
              |          |          |             |             | dbo=CTc/sysadmin
 postgres     | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | 
 rdsadmin     | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | rdsadmin=CTc/rdsadmin
 template0    | rdsadmin | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/rdsadmin             +
              |          |          |             |             | rdsadmin=CTc/rdsadmin
 template1    | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/postgres             +
              |          |          |             |             | postgres=CTc/postgres
(5 rows)

postgres=> \c babelfish_db
psql (14.2, server 13.6)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
You are now connected to database "babelfish_db" as user "postgres".

babelfish_db=> select name from sys.databases;
  name  
--------
 master
 tempdb
 msdb
 hoge
(4 rows)

babelfish_db=> SELECT * FROM pg_tables;
     schemaname     |         tablename          | tableowner | tablespace | hasindexes | hasrules | hastriggers | rowsecurity 
--------------------+----------------------------+------------+------------+------------+----------+-------------+-------------
 sys                | babelfish_helpcollation    | rdsadmin   |            | f          | f        | f           | f
 sys                | service_settings           | rdsadmin   |            | f          | f        | f           | f
 sys                | versions                   | rdsadmin   |            | f          | f        | f           | f
 sys                | syslanguages               | rdsadmin   |            | f          | f        | f           | f
 sys                | babelfish_configurations   | rdsadmin   |            | f          | f        | f           | f
 sys                | extended_properties        | rdsadmin   |            | f          | f        | f           | f
 sys                | babelfish_sysdatabases     | rdsadmin   |            | t          | f        | f           | f
 pg_catalog         | pg_statistic               | rdsadmin   |            | t          | f        | f           | f
 pg_catalog         | pg_type                    | rdsadmin   |            | t          | f        | f           | f
 sys                | babelfish_namespace_ext    | rdsadmin   |            | t          | f        | f           | f
 pg_catalog         | pg_foreign_table           | rdsadmin   |            | t          | f        | f           | f
 master_dbo         | piyo                       | master_dbo |            | t          | f        | f           | f
 pg_catalog         | pg_authid                  | rdsadmin   | pg_global  | t          | f        | f           | f
 sys                | babelfish_authid_login_ext | rdsadmin   |            | t          | f        | f           | f
 sys                | babelfish_authid_user_ext  | rdsadmin   |            | t          | f        | f           | f
:
 sys                | spt_datatype_info_table    | rdsadmin   |            | f          | f        | f           | f

babelfish_db=> select * from master_dbo.piyo;
 foo | fuga  
-----+-------
   1 | hoge1
   2 | hoge2
   3 | hoge3
(3 rows)

バージョンなど確認

Babelfishのバージョンも確認してみましょう。
以前、Aurora PostgreSQLでv13.5がサポートされた際は、Babelfishのバージョンもv1.1.0にアップデートされていました。

1> SELECT aurora_version() AS aurora_version;
2> go
aurora_version                                                                                                                                                                                                                                                  
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
13.6.1                                                                                                                                                                                                                                                          

(1 rows affected)
1> SELECT CAST(serverproperty('babelfishversion') AS VARCHAR);
2> go
serverproperty                
------------------------------
1.2.1                         

(1 rows affected)
1> SELECT @@VERSION AS version;
2> go
version                                                                                                                                                                                                                                                         
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Babelfish for Aurora Postgres with SQL Server Compatibility - 12.0.2000.8
Apr 15 2022 22:37:24
Copyright (c) Amazon Web Services
PostgreSQL 13.6 on aarch64-unknown-linux-gnu                                                                                   

(1 rows affected)

v1.2.1にアップデートされていますね。
ちなみに、v1.2.1では結構Babelfish自体アップデートされてます。

詳細は以下をご確認ください。

さいごに

Aurora Serverless PostgreSQL で Babelfish が利用出来ることが確認出来ました。

互換性の問題はもちろん注意は必要なのですがそのあたりがクリア出来れば、Microsoft SQL Serverが必要なワークロードをAWS上でサーバーレスアーキテクチャーとして展開したい時の選択肢になりそうです。
個人的には、Babelfishを検証する価値がより高まったのではないかと思います。