AlloyDB で初期ユーザーとさよならする話

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では、初期の特権ユーザーで初期設定した後、初期ユーザーをさよならして特権ユーザーが残らないようにします。

手順としては以下です。

  1. IAM ユーザーを非特権ユーザーとして作成
  2. AlloyDB Studio 等で初期設定する
  3. 初期ユーザーを削除

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 の構築ができました。

まとめに代えて

ここら辺オフィシャルドキュメントに書いてあると助かるなぁ(ちらっ)