今回、Google Cloud でPostgresqlを使う機会があり、手順をまとめてみました。

参考資料:

Postgresql入門ガイド

https://cloud.google.com/sql/docs/postgres/how-to?hl=ja

App Engine からの接続

https://cloud.google.com/sql/docs/postgres/connect-app-engine?hl=ja

Cloud SQL for PostgreSQL のクイックスタート

https://cloud.google.com/sql/docs/postgres/quickstart?hl=ja

作成するもの

Projecttest-nodejs

インスタンスIDtest-node-insta

Postgresパスワード:passwd

※Macを使ってるんですが、gcloud sqlでは Option + ¥がバックスラッシュとなってくれなかったので、

バックスラッシュ入力のため、Google日本語入力環境設定を変更しました。

¥キーで入力する文字:バックスラッシュ

テスト用DBtest_db

ユーザー名:dbuser / dbpasswd

gcloudでの接続

$ gcloud sql connecttest-node-insta –user=postgres

1)ユーザーを作成する

Cloud SQL を使用して作成するすべてのユーザーは cloudsqlsuperuser 役割の一部として作成されるため、

psqlクライアントで作成する

postgresql => CREATE USER dbuser WITH LOGIN PASSWORD ‘dbpasswd’;

postgres=> \du

                                            List of roles
    Role name     |                         Attributes                         |      Member of
-------------------+------------------------------------------------------------+---------------------
cloudsqladmin     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
cloudsqlagent     | Create role, Create DB                                     | {cloudsqlsuperuser}
cloudsqlreplica   | Replication                                                | {}
cloudsqlsuperuser | Create role, Create DB                                     | {}
dbuser         |                                                            | {}
postgres          | Create role, Create DB                                     | {cloudsqlsuperuser}

 

2)データベースを作成する

postgres=> CREATE DATABASE test_db OWNER dbuser;

ERROR:  must be member of role “dbuser”

これはロール”postgresql”がスーパーユーザーでないために発生するエラー。

Postgresql独自の制約であり、PostgreSQLドキュメントにも記載されています(^^;

・対処方法

マスタユーザが新たに作成したロールのメンバになっていないといけない。

ここでは、”cloudsqlsuperuser”がマスターユーザーになっているようなので、GRANTする

これなら1)のときCloud SQLで作ればよかったorz

postgres=> GRANT dbuser TO cloudsqlsuperuser;

postgres=> \du

                                            List of roles
     Role name     |                         Attributes                         |      Member of
-------------------+------------------------------------------------------------+---------------------
cloudsqladmin     | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
cloudsqlagent     | Create role, Create DB                                     | {cloudsqlsuperuser}
cloudsqlreplica   | Replication                                                | {}
cloudsqlsuperuser | Create role, Create DB                                     | {dbuser}
dbuser         |                                                            | {}
postgres          | Create role, Create DB                                     | {cloudsqlsuperuser}

postgres=> CREATE DATABASE test_db OWNER dbuser ENCODING UTF8  LC_COLLATE ja_JP.UTF-8 LC_CTYPE ja_JP.UTF-8 ;

ERROR:  new collation (ja_JP.UTF-8) is incompatible with the collation of the template database (en_US.UTF8)

HINT:  Use the same collation as in the template database, or use template0 as template.

template databaseのなかのcollationを使うか、template0を使えとのことなんで、template0をつかった。

postgres=> CREATE DATABASE test_db OWNER dbuser ENCODING UTF8  LC_COLLATE ja_JP.UTF-8 LC_CTYPE ja_JP.UTF-8 TEMPLATE template0’;

CREATE DATABASE

postgres=> \l

                                                List of databases

     Name      |       Owner       | Encoding |   Collate   |    Ctype    |            Access privileges
---------------+-------------------+----------+-------------+-------------+-----------------------------------------
cloudsqladmin | cloudsqladmin     | UTF8     | en_US.UTF8  | en_US.UTF8  |
postgres      | cloudsqlsuperuser | UTF8     | en_US.UTF8  | en_US.UTF8  |
template0     | cloudsqladmin     | UTF8     | en_US.UTF8  | en_US.UTF8  | =c/cloudsqladmin                       +
               |                   |          |             |             | cloudsqladmin=CTc/cloudsqladmin
template1     | cloudsqlsuperuser | UTF8     | en_US.UTF8  | en_US.UTF8  | =c/cloudsqlsuperuser                   +
               |                   |          |             |             | cloudsqlsuperuser=CTc/cloudsqlsuperuser
test_db       |dbuser          | UTF8     | ja_JP.UTF-8 | ja_JP.UTF-8 |
(5 rows)

 

無事できた。

このあたりの情報って、検索しても出てこなかったけど、どうしてるんだろ?