Aurora DSQLの強力なデータ一貫性を試してみる！

2024年12月3日、Amazon Aurora DSQL(プレビュー版)が発表されました！
DSQLとは、Distributed SQLという意味であり、日本語にすると「分散SQL」という意味になります。

要するに、アクティブ/アクティブの高可用性を備えた新しいサーバーレス分散SQLデータベースです。

ちなみにですが、読み方は「ディー・エスキューエル」ではなく、「ディー・シークウェル」だそうです。

https://aws.amazon.com/about-aws/whats-new/2024/12/amazon-aurora-dsql-preview/

# 前置き
以前にDSQLの立ち上げ方についてはご説明したので、今回はDSQLに接続し、操作していく内容となっています！
※以降、DSQLのマルチリージョンリンククラスターが作成されているという前提で話を進めます。
　クラスター作成方法についてはこちら↓

https://qiita.com/har1101/items/b0e1c85d4ebde1198e21

# CloudShellでAurora DSQLクラスター(バージニア北部リージョン)に接続する
まず、接続するクラスターを選択し、「connect」を選択します。
そして、クラスターのエンドポイントをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/65299a44-54b1-236b-be94-d2e822fb43f5.png)

続いて、バージニア北部リージョンでCloudShellを立ち上げ、以下のコマンドを実行します。
```
PGSSLMODE=require \
  psql --dbname postgres \
  --username admin \
  --host <先ほどコピーしたエンドポイントをここに貼り付け>
```

すると、管理者権限でログインするためのパスワードが求められます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/d7c9c418-7f81-6def-be52-26ede5b8be20.png)

先ほどの「connect」の画面に戻りましょう。
認証トークン(Authentication Token)が「Connect as admin」なのを確認し、コピーします。
これがパスワードの代わりになります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/2f72255d-d5a7-dbb1-943a-11b569a8b386.png)

CloudShellの画面に戻り、パスワードを貼り付けてエンターキーを押します。
※パスワードは貼り付けても画面上には表示されません。

すると、以下のような表示になり、DSQLへのログインが成功しました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/4af46c6a-9fc1-1344-50e7-4a2d446ab112.png)

:::note warn
アクセス拒否エラーが出た場合は、恐らくIAMに `dsql:DbConnectAdmin` 権限が不足しています。
:::

# SQLコマンドを実行しデータを格納する
続いて、実際にコマンドを入力してみます。

1.exampleという名前のスキーマを作成します。
```
CREATE SCHEMA example;
```
PostgreSQLにおける「スキーマ」とは、1つのデータベースの中に複数設定可能な名前空間のことを指すそうです。
<br>
2.自動的に生成されたUUIDを主キーとして利用する請求書テーブルを作成します。
```
CREATE TABLE example.invoice(id UUID PRIMARY KEY DEFAULT gen_random_uuid(), created timestamp, purchaser int, amount float);
```
<br>
3.空のテーブルを使用するせカンダリインデックスを作成します。

```
CREATE INDEX invoice_created_idx on example.invoice(created);
```

<br>

4.部門テーブルを作成します。
```
CREATE TABLE example.department(id INT PRIMARY KEY UNIQUE, name text, email text);
```

ここまでの実行結果はこんな感じ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/cec93547-ec06-2d9d-2c22-cc69bd1db027.png)

<br>
5.下記のGitHubリポジトリから、`department-insert-multirow.sql` と `invoice.csv` ファイルをダウンロードしておきます。

https://github.com/aws-samples/aurora-dsql-samples/tree/main/quickstart_data

<br>
6.「アクション」から、「ファイルのアップロード」を選択し、先ほどダウンロードした2つのファイルをCloudShell上にアップロードします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/21f150f3-9e9d-7d9f-70b9-214fa3038f1c.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/8989764e-b6d9-21ed-2b88-6cdd113a937c.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/1a0d24ab-7cb1-fe97-c9cc-8a9d3c378e81.png)

<br>

7.アップロードしたスクリプトを実行します。
```
\include /home/cloudshell-user/department-insert-multirow.sql
(実行環境次第では、パスが異なります。)
```
\includeコマンドは、ファイルに含まれるSQLスクリプトを読み込んで実行するコマンドです。
引数には `/path/path/script.sql` のような形で、パスとスクリプト名を指定します。

<br>

8.アップロードしたファイルを元に、サンプルデータをデータベースに挿入します。
```
\copy example.invoice(created, purchaser, amount) from /home/cloudshell-user/invoice.csv csv
(実行環境次第では、パスが異なります。)
```
\copyコマンドは、データをインポート/エクスポートするために使用するコマンドです。
構文としては、
`\copy table_name [ ( column_list ) ] {FROM | TO} source [ WITH ( option [, ...] ) ]`
という感じになります。

インポートする場合は `FROM`, エクスポートする場合は `TO`を用います。

2つのコマンド実行結果は以下の感じです。
これでdepartmentテーブルと、invoiceテーブルが作成されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/c2ab2e34-fd38-2b95-9d6b-aa697d744677.png)

<br>

9.最後に、部門を売上高順に並べ替えて表示させます。
```
SELECT name, sum(amount) AS sum_amount
FROM useast1.department 
LEFT JOIN useast1.invoice ON department.id=invoice.purchaser
GROUP BY name
HAVING sum(amount) > 0
ORDER BY sum_amount DESC;
```

こんな感じのが表示されるはずです！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/0c602fc2-64b9-b2be-9927-4756cac39ad7.png)

というところで、ドキュメントに記載されていたサンプルの手順は終わりです。
当たり前ですが、普通にSQLコマンド使えましたね！

# オハイオリージョンでデータを確認する
バージニア北部リージョンで格納したデータが反映されているかを確認してみましょう。

先ほど同様に、オハイオリージョンでCloudShellを開き、Aurora DSQLに接続します。
この時、オハイオリージョンのエンドポイントに接続しましょう。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/714f786c-a0ef-03a2-b632-881a0dff5487.png)
↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/55953e33-97ac-8ce9-5061-5a724ebd7f33.png)

そして、以下のコマンドを実行します。先ほどの9.と同じコマンドです。
```
SELECT name, sum(amount) AS sum_amount
FROM example.department 
LEFT JOIN example.invoice ON department.id=invoice.purchaser
GROUP BY name
HAVING sum(amount) > 0
ORDER BY sum_amount DESC;
```

同じ出力が返ってきました！
バージニア北部リージョンで書き込んだデータがオハイオリージョンでも反映されているのがわかりますね！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/b0f28ad0-8387-8e31-6dc1-65cb3d48b3c5.png)

ついでに、他の情報も色々確認してみましょう。
1.データベースの一覧を表示：
```
\l
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/4a716b45-f922-4a55-bf57-8615e27f981a.png)
<br>
2.全てのスキーマを表示：
```
\dn
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/8aa6a9cf-bd82-62fc-a558-8771b0eedc2d.png)
<br>
3.exampleスキーマ内のテーブルの一覧を表示：
```
\dt example.*
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/82fe8b91-9598-9757-49b4-75faacd2037b.png)
<br>
4.作成した2つのテーブルの構造（カラム情報）を表示：
```
\d example.department
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/54919bf3-0a61-440c-d479-0673a44f511e.png)
```
\d example.invoice
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/313e9190-1af7-b20c-1719-a63fd3415940.png)
<br>
5.インストールされている拡張機能を表示：
```
\dx
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/baf9e146-706f-c8ed-86ba-068713d781c4.png)
<br>
6.ユーザー（ロール）の一覧を表示：
```
\du
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/7a884534-be1f-47dd-f889-321db399adcd.png)
<br>
7.現在の接続情報を確認する
```
\conninfo
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3616210/e76a1cc8-de57-f0d3-4647-d6ba3aaf585c.png)
<br>

ということで、オハイオリージョンのデータも確認できました！

# 大体何秒くらいでデータが反映されるのか？
ここで1つ気になるのは、データ書き込みがどのくらいの速度で反映されているのか。
実際の挙動で確認してみます！

実験方法としては、
1. バージニア北部リージョンで新しいスキーマ「us-east-1」を作成する
1. オハイオリージョンでスキーマを確認しまくる

というパワースタイルでいきます。

https://youtu.be/ft_WWu1WD0U

上記の動画を見て貰えば分かる通り、1秒以内に書き込まれていました！

# まとめ
Aurora DSQLのデータ一貫性の一端に触れることができました！
次はLambdaなどからアクセスしてみます！