Aurora DSQL（プレビュー）を少しだけ触ってみた

これは **[PostgreSQL Advent Calendar 2024](https://qiita.com/advent-calendar/2024/postgresql)** 2 枚目・5 日目の記事です。

ワイヤープロトコルレベルで PostgreSQL と互換性があり（SQL も PostgreSQL のサブセットをサポート）、リージョン分散型のリレーショナル DB である **[Aurora DSQL](https://docs.aws.amazon.com/aurora-dsql/)** のプレビュー版が公開されたので、ちょっとだけ試してみました。

:::note
シングルリージョンでクラスターを立てることもできます。
:::

## 概要など

こちらの [AWS Database Blog](https://aws.amazon.com/jp/blogs/database/) に記されています。

https://aws.amazon.com/jp/blogs/database/introducing-amazon-aurora-dsql/

:::note
**2024/12/11 追記：**
日本語の記事はこちらです。

- **[Amazon Aurora DSQL の紹介](https://aws.amazon.com/jp/blogs/news/introducing-amazon-aurora-dsql/)**
:::

re:Invent では明確に（Google の）「Spanner」の名前を出して比較をしていたようですね。

:::note
同じ分散型リレーショナル DB でも、シャードの配置などをユーザーが指定するスタイルの Aurora Limitless Database とは完全に別物です。
:::

なお、こちらに（楽観トランザクションによる）同時実行制御についての説明があります。

https://aws.amazon.com/jp/blogs/database/concurrency-control-in-amazon-aurora-dsql/

:::note
**2024/12/11 追記：**
日本語の記事はこちらです。

- **[Amazon Aurora DSQL の同時実行制御](https://aws.amazon.com/jp/blogs/news/concurrency-control-in-amazon-aurora-dsql/)**
:::

## とりあえずクラスター（群）を立ててみる

[Getting started の記事](https://docs.aws.amazon.com/aurora-dsql/latest/userguide/getting-started.html)を参考に、早速触ってみます。

https://docs.aws.amazon.com/aurora-dsql/latest/userguide/getting-started.html

### マネジメントコンソールの入口は RDS から独立？

先ほどの Getting started の記事にもリンクが記されていますが、RDS / Aurora のコンソール画面ではなく独立したコンソール画面からクラスターを作成するようです。
![スクリーンショット 2024-12-05 20.50.07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/ba3ba672-e256-9279-36ac-198851ab3398.png)

残念ながら東京リージョンはプレビュー対象外です。
![スクリーンショット 2024-12-05 20.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/57de637f-95e6-ef7e-6740-dcf11cb2c91f.png)

### クラスターを立ててみる

バージニア北部リージョンを選んでクラスターを立ててみます。
![スクリーンショット 2024-12-05 20.52.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/c1bb05c1-3f24-2d26-d2e2-c63f9e27983b.png)

リンククラスターをオハイオリージョンに、Witness リージョン（データのコピー（更新ログ）を配置するがエンドポイントは持たないリージョン）をオレゴンに配置します。

すぐ削除する予定なので、削除保護は外しておきます。
![スクリーンショット 2024-12-05 20.57.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/9668e856-4f73-b526-9a14-7e1e34e5bfac.png)

:::note
2024/12/5 時点では、オレゴンリージョンは Witness 専用リージョンのようです。
:::

現時点の設定はこれだけです。

既報のとおり、VPC 外にエンドポイントが作られるようですね。

クラスターができあがるまで待ちます。
![スクリーンショット 2024-12-05 20.59.31.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/6adc8ff3-f59b-e2c4-d44d-f0c8807f0248.png)

できたようです。
![スクリーンショット 2024-12-05 21.03.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/35a87992-ab33-f429-af2f-95aead394ea8.png)

![スクリーンショット 2024-12-05 21.04.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/9ac52898-becc-299c-b7f8-50f6bb60e03e.png)

![スクリーンショット 2024-12-05 21.41.18.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/41e05ab3-0186-5d16-8392-4f614a425d44.png)

こちらはリンククラスター配置先のオハイオリージョンのクラスターです。
![スクリーンショット 2024-12-05 21.00.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/49fbec3f-d127-0600-7996-965f82748b55.png)

### クライアントからバージニア北部リージョンのエンドポイントに接続してみる

今回は Administrator 権限を持つユーザーで CloudShell を使い、`psql`コマンドでの接続を試します。

バージニア北部リージョンのクラスターの画面の下方で CloudShell を開いて、まずは [Getting started の記事に示されたサンプルデータ](https://github.com/aws-samples/aurora-dsql-samples/tree/main/quickstart_data)を配置します。

```sh:サンプルデータを配置
$ mkdir samples
$ cd samples
$ curl https://raw.githubusercontent.com/aws-samples/aurora-dsql-samples/refs/heads/main/quickstart_data/department-insert-multirow.sql > department-insert-multirow.sql 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   610  100   610    0     0   2225      0 --:--:-- --:--:-- --:--:--  2250
$ curl https://raw.githubusercontent.com/aws-samples/aurora-dsql-samples/refs/heads/main/quickstart_data/invoice.csv > invoice.csv
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  233k  100  233k    0     0  4388k      0 --:--:-- --:--:-- --:--:-- 4412k
$ ll
total 240
-rw-r--r--. 1 cloudshell-user cloudshell-user    610 Dec  5 12:26 department-insert-multirow.sql
-rw-r--r--. 1 cloudshell-user cloudshell-user 239459 Dec  5 12:26 invoice.csv
$ cat department-insert-multirow.sql 
BEGIN;
INSERT INTO example.department(id, name, email) VALUES
(1, 'Example Department One', 'example+one@example.com'),
(2, 'Example Department Two', 'example+two@example.com'),
（中略）
(9, 'Example Department Nine', 'example+nine@example.com');
COMMIT;
$ head invoice.csv 
'2019-02-11T21:40:27.892Z',1,39.718145389078366
'2018-05-15T08:04:04.580Z',7,117.0376564084763
'2019-12-06T22:22:48.544Z',6,55.62208681964182
（中略）
'2017-05-03T16:00:54.923Z',2,81.67426959
'2020-01-17T01:44:37.233Z',3,102.77055805103969
$ tail invoice.csv 
'2016-06-20T04:41:17.900Z',2,25.993077038947224
'2018-01-17T07:05:29.340Z',5,35.05190955068556
（中略）
'2019-12-29T14:38:55.070Z',2,87.93198397343093
'2016-05-18T16:02:59.284Z',3,63.546171761560245
'2019-08-30T17:26:07.144Z',6,56.50467195926748
$ cd ..
```

「Connect」ボタンをクリックすると接続に必要な情報が表示されます。
![スクリーンショット 2024-12-05 21.08.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/b8378542-20f4-9c58-6c33-3839114c99be.png)

エンドポイントをコピーして、CloudShell から`psql`コマンドでバージニア北部リージョンのクラスターに接続します。

```sh:バージニア北部リージョンのクラスターに接続
$ PGSSLMODE=require \
>  psql --dbname postgres \
> --username admin \
> --host yiabtvdfljusl7rv6d2w2zbqpm.dsql.us-east-1.on.aws
Password for user admin: 
```

パスワードは先ほどのポップアップウィンドウ右下の「Copy」ボタンをクリックしてペーストします（そして [Enter] キーを押す）。

```sh:接続完了
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.
```

接続できました。

### サンプルデータを投入する

Getting started の記事のとおり、`example`スキーマと 2 つのテーブルと 1 つのインデックスを作成します。

```sh:スキーマ・テーブル・インデックス作成
postgres=> CREATE SCHEMA example;
CREATE SCHEMA
postgres=> CREATE TABLE example.invoice(id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created timestamp, purchaser int, amount float);
CREATE TABLE
postgres=> CREATE INDEX invoice_created_idx on example.invoice(created);
CREATE INDEX
postgres=> CREATE TABLE example.department(id INT PRIMARY KEY UNIQUE, name text, email text);
CREATE TABLE
```

サンプルデータを投入します。

```sh:サンプルデータを投入
postgres=> \include samples/department-insert-multirow.sql
BEGIN
INSERT 0 9
COMMIT
postgres=> \copy example.invoice(created, purchaser, amount) from samples/invoice.csv csv
COPY 5000
```

### バージニア北部リージョンで`SELECT`してみる

こちらも Getting started の記事のとおりの SQL 文を実行します。

```sh:SELECT実行
postgres=> SELECT name, sum(amount) AS sum_amount
postgres-> FROM example.department LEFT JOIN example.invoice ON department.id=invoice.purchaser
postgres-> GROUP BY name
postgres-> HAVING sum(amount) > 0
postgres-> ORDER BY sum_amount DESC;
           name           |     sum_amount     
--------------------------+--------------------
 Example Department Three | 54061.677528545966
 Example Department Seven | 53869.659653652096
 Example Department Eight |  52199.73742066632
 Example Department One   |  52034.07886990081
 Example Department Six   |   50886.1555625639
 Example Department Two   |  50589.98422247927
 Example Department Five  |    49549.852635496
 Example Department Four  |  49266.15578027618
(8 rows)
```

### オハイオリージョンのエンドポイントに接続してみる

今度はオハイオリージョンのクラスターの画面で「Connect」ボタンをクリックして接続に必要な情報を表示します。

![スクリーンショット 2024-12-05 21.38.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/7bb993b6-e044-71bf-1cc1-2f93dab04a5a.png)

先ほどと同じように CloudShell から`psql`コマンドで接続してみます。

```sh:オハイオリージョンのクラスターに接続
$ PGSSLMODE=require \
>  psql --dbname postgres \
> --username admin \
> --host gqabtvdfliuboiehc6voycz6vy.dsql.us-east-2.on.aws
Password for user admin: 
```

パスワードはオハイオリージョンの authentication token を Copy して貼り付けます。

```sh:接続完了
psql (15.8, server 16.5)
WARNING: psql major version 15, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_128_GCM_SHA256, compression: off)
Type "help" for help.
```

接続完了しました。

### オハイオリージョンで`SELECT`してみる

先ほどと同じ`SELECT`文を実行します。

```sh:
SELECT実行
postgres=> SELECT name, sum(amount) AS sum_amount
postgres-> FROM example.department LEFT JOIN example.invoice ON department.id=invoice.purchaser
postgres-> GROUP BY name
postgres-> HAVING sum(amount) > 0
postgres-> ORDER BY sum_amount DESC;
           name           |     sum_amount     
--------------------------+--------------------
 Example Department Three | 54061.677528545966
 Example Department Seven | 53869.659653652096
 Example Department Eight |  52199.73742066632
 Example Department One   |  52034.07886990081
 Example Department Six   |   50886.1555625639
 Example Department Two   |  50589.98422247927
 Example Department Five  |    49549.852635496
 Example Department Four  |  49266.15578027618
(8 rows)
```

オハイオリージョンでも同じ結果が返ってきました。

## 立てたクラスター（群）を削除する

バージニア北部リージョンのクラスターを「Delete」ボタンで削除します。

![スクリーンショット 2024-12-05 21.42.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/b0b660ec-756d-0ed6-a18a-2efba0c2bf46.png)

両リージョンのクラスター（とおそらく Witness リージョンのデータ）がまとめて削除されるようです。

`confirm`を入力して「Delete」ボタンをクリックして、しばらく待つと、
![スクリーンショット 2024-12-05 21.47.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/023660e4-b0b4-840c-7c28-233240cb0962.png)

![スクリーンショット 2024-12-05 21.48.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/123899/3707f3b9-41cb-1549-935b-31c5d88ca09e.png)

両リージョンのクラスターが削除されました。

## 今後は

気になる「複数リージョンのクラスタへの書き込み」などを試してみる予定です。

**2024/12/11 追記：**
Aurora DSQL の楽観的同時実行制御（OCC）について記事を書きました。

https://qiita.com/hmatsu47/items/397aedff77465ed73836

---

明日（6 日目）の 2 枚目カレンダーの担当は noborus さんです。

https://qiita.com/noborus/items/6ac19b754f896e41197c