AlloyDB, 正式には AlloyDB for PostgreSQL は名前が示す通り PostgreSQL 互換の Google Cloud 上で利用できるマネージドデータベースです。 AWS だと Aurora が類似のサービスで、ストレージとコンピュートのノードが分離したアーキテクチャになっていてスケーラビリティや可用性に優れます。
諸事情で最近 AlloyDB を使っているんですが、通常の PostgreSQL とはちょっと違う点があります。 たぶん最たるものがユーザーと role 周りでしょう。
PostgreSQL の通常のユーザー認証はユーザー名とパスワードで行われます。
AlloyDB のクラスタを作成するときも、postgres
という初期ユーザーが平文で指定したパスワードで作られます。
他のマネージドサービスの認証は通常このようなユーザー名パスワード方式ではなく、IAM のユーザーないしサービスアカウントで行われます。 内部的には短期間で expire する認証トークンを発行して OAuth しているのでしょうが、クライアントライブラリ等が自動で処理するのが通常であるため、利用者観点では認証が自動で行われて快適かつセキュアです。 AlloyDB は通常のユーザーに加えて IAM ユーザーで認証して利用することもできます。
さて、そうなると当然平文パスワードで作成した初期ユーザーは捨てて IAM ユーザーだけにしたくなります。 結論から言えばできます。
方法1: IAM ユーザーだけで頑張る
以下のように postgres
ユーザーを捨て、IAM ユーザーを作成します。
$CLUSTER, $REGION はクラスタ名とクラスタを作成したリージョンです。
$ gcloud alloydb users delete postgres --cluster=$CLUSTER --region=$REGION $ gcloud alloydb users create myname@example.com --cluster=$CLUSTER --region=$REGION --superuser=true --type=IAM_BASED
myname@example.com
は例えば自分の Google Cloud アカウントだと思ってください。
上のコマンドで初期ユーザーはさよなら済みなので、あとはこの IAM ユーザーで接続するだけです。
以下のページを参考に、あとはご自由にどうぞ。
Connect using an IAM account | AlloyDB for PostgreSQL | Google Cloud
方法2: 初期ユーザーで初期設定してからさよならする
好みの問題ですが、上記方法は別の特権ユーザー(superuser)を作っていてちょっぴり嫌な感じがします。
AlloyDB は gcloud alloydb users create
でいつでも特権ユーザーを追加できるので、本当に必要な時以外作りたくない気持ち。
そこで方法2では、初期の特権ユーザーで初期設定した後、初期ユーザーをさよならして特権ユーザーが残らないようにします。
手順としては以下です。
- IAM ユーザーを非特権ユーザーとして作成
- AlloyDB Studio 等で初期設定する
- 初期ユーザーを削除
1. IAM ユーザーを非特権ユーザーとして作成
ここで作る IAM ユーザーは IAM サービスアカウントのものにします。
プロジェクト my-project
のサービスアカウント my-service
の場合、以下のようになります。
$ gcloud alloydb users create my-service@my-project.iam --cluster=$CLUSTER --region=$REGION --type=IAM_BASED
2. AlloyDB Studio で初期設定
AlloyDB Studio は Web ブラウザから SQL で AlloyDB を操作できるツールです。 IAM ユーザーでは利用できず、初期ユーザーのような非 IAM ユーザーでのみ利用できます。
ここでは上記で作成した IAM ユーザーが利用できるデータベースを一つ作りましょう。
単純には CREATE DATABASE test OWNER = "my-service@my-project.iam"
で良さそうに思えます。
ですが実際にはエラーになります。
GRANT "my-service@my-project.iam" TO postgres
のようにして初期ユーザーが IAM ユーザーを利用できるようにしないといけないのですが、
なぜかこれを実行すると初期ユーザーが IAM ユーザーに変化してしまいます。不思議ですね。
そこで、以下のようにグループとして使う role foo
を作成して、foo
に初期ユーザーと IAM ユーザーを所属させ、foo
が利用できるデータベースを作成することにします。
CREATE ROLE foo ROLE postgres, "my-service@my-project.iam"; CREATE DATABASE test OWNER = foo;
これで IAM ユーザーが利用できるデータベース test
が作成できました。
3. 初期ユーザーを削除
$ gcloud alloydb users delete postgres --cluster=$CLUSTER --region=$REGION
以上で特権ユーザーを残さず、IAM サービスアカウントで接続して利用できるデータベースを持つ AlloyDB の構築ができました。
まとめに代えて
ここら辺オフィシャルドキュメントに書いてあると助かるなぁ(ちらっ)