データストアというかインフラ費が安くないと継続運用できないので、色んな (とはいえある程度メンテコストの低い) データストアを試しています。以前は SQLite3 + Litestream + S3 を試していました。
Aurora DSQL とは
PostgreSQL 互換の分散 DB です。マルチリージョンでのアクティブ・アクティブ構成ができる自動シャーディングされるデータストアで、イメージとしては Spanner みたいなヤツですね。
PostgreSQL との違い
公式ドキュメント に書いている以上にたくさん違います。(私が見ていた頃 (半年ぐらい前) からドキュメントだいぶ増量されている!)
書いてあるものとして
postgresdatabase しか使えないTRUNCATEが無いDELETE FROMやDROP TABLEを使え
- 外部キー制約無い
- 外部キーNight のようなバトルは発生しないってことですね
- Sequences が無い
SERIAL型が無い- 代替が最近出てきた? Amazon Aurora DSQL adds support for identity columns and sequence objects - AWS
CREATE INDEXが無いCREATE INDEX ASYNCがある
- 3,000行ずつ制限がある
A transaction can modify up to 3,000 rows, regardless of the number of secondary indexes
The 3,000-row limit applies to all DML statements (
INSERT,UPDATE,DELETE)
他にも ALTER TABLE は制限がキツくて色々動かない。
ERROR: unsupported ALTER TABLE ALTER COLUMN ... DROP NOT NULL statement- NOT NULL 制約を後から外そうとしたらエラーになった
ERROR: unsupported ALTER TABLE DROP COLUMN statementDROP COLUMNできない!!
ので、新しいスキーマでテーブルを作って、データを移して、RENAME TABLE するのがデフォルトかなーって所感です。
データを移そうとしたらこれもまた制限に引っかかったので、試行錯誤するのには本当に向いていないなと思います。オペレーションは慣れたら行けそうとも思う。実際そんなに困ってない。
- 3000行制限:
ERROR: transaction row limit exceeded - 10MB 制限:
ERROR: transaction size limit 10mb exceeded
DSQL の先人としては以下のブログがありそうです。
ActiveRecord から扱う
幾つか違いはあるものの概ね postgres なので postgresql_adapter を拡張します。
特に困るものとしては
- 接続時に IAM 認証が必須
- DDL で
CREATE INDEXが無くてCREATE INDEX ASYNCである - PK が……?
で、軽く探したらあったのでありがたく使わせて貰っています。
- https://github.com/sj26/activerecord-dsql-adapter
- https://gist.github.com/coord-e/5eb7d6cacc17f62f009ed7253c84fc05
特に primary_keys は自分で対応を思いつけなかったので助かりました。
あと公式のサンプル。
- https://github.com/aws-samples/aurora-dsql-samples/tree/main/ruby/ruby-pg
- https://github.com/aws-samples/aurora-dsql-samples/tree/main/ruby/rails
面倒なのになんで使うの?
異常に安い。
まず無料枠がある。
https://aws.amazon.com/rds/aurora/dsql/pricing/#Free_tier
Each month, your first 100,000 DPUs and 1 GB of storage are free and automatically applied to your monthly bill.
DPU は多少しっかり使うと (毎時データをゴリッと読み書きするような Job 動かすとか) お金が掛かりますが、そうでないリクエスト数の少ないサービスなら無料なんじゃないか。
そして従量課金です。
私は普段は 無料〜$0.1 で、割とゴリゴリと使った月でも $5 とかで暮らしています。RDS や Aurora で postgres を立てるとこうはいかないので、少ないリクエストで動いている限りは従量課金は最高。
分散 DB の良いところ (マルチマスタを実現する技術) はまったく気にしていなくて 1 node として使っている目的外利用だろうから、今後どこかで値段が上がってウワーってなる気はしている。
まとめ
- 安い DB を探していて Aurora DSQL に辿り着きました
- 分散 DB なので高いかと思ったら逆に従量課金で安い
- 幾つか非互換や制限はあるものの、まぁ乗りこなせる範囲じゃないか
- 実際に私は運用できています

