Google SQL Cloud Postgresql データベースを作るまで!
今回、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
作成するもの
Project:test-nodejs
インスタンスID:test-node-insta
Postgresパスワード:passwd
※Macを使ってるんですが、gcloud sqlでは Option + ¥がバックスラッシュとなってくれなかったので、
バックスラッシュ入力のため、Google日本語入力環境設定を変更しました。
¥キーで入力する文字:バックスラッシュ
テスト用DB:test_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
1 2 3 4 5 6 7 8 9 |
<span class="Apple-converted-space"> </span>List of roles <span class="Apple-converted-space"> </span>Role name <span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>Attributes <span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>Member of -------------------+------------------------------------------------------------+--------------------- cloudsqladmin <span class="Apple-converted-space"> </span>| Superuser, Create role, Create DB, Replication, Bypass RLS | {} cloudsqlagent <span class="Apple-converted-space"> </span>| Create role, Create DB <span class="Apple-converted-space"> </span>| {cloudsqlsuperuser} cloudsqlreplica <span class="Apple-converted-space"> </span>| Replication<span class="Apple-converted-space"> </span>| {} cloudsqlsuperuser | Create role, Create DB <span class="Apple-converted-space"> </span>| {} <span class="Apple-converted-space">dbuser </span>|<span class="Apple-converted-space"> </span>| {} postgres<span class="Apple-converted-space"> </span>| Create role, Create DB <span class="Apple-converted-space"> </span>| {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
1 2 3 4 5 6 7 8 9 |
<span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> <span style="font-family: verdana, geneva, sans-serif;"> </span></span>List of roles</span> <span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> </span>Role name <span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>Attributes <span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>Member of</span> <span style="font-family: verdana, geneva, sans-serif;">-------------------+------------------------------------------------------------+---------------------</span> <span style="font-family: verdana, geneva, sans-serif;">cloudsqladmin <span class="Apple-converted-space"> </span>| Superuser, Create role, Create DB, Replication, Bypass RLS | {}</span> <span style="font-family: verdana, geneva, sans-serif;">cloudsqlagent <span class="Apple-converted-space"> </span>| Create role, Create DB <span class="Apple-converted-space"> </span>| {cloudsqlsuperuser}</span> <span style="font-family: verdana, geneva, sans-serif;">cloudsqlreplica <span class="Apple-converted-space"> </span>| Replication<span class="Apple-converted-space"> </span>| {}</span> <span style="font-family: verdana, geneva, sans-serif;">cloudsqlsuperuser | Create role, Create DB <span class="Apple-converted-space"> </span>| {dbuser}</span> <span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space">dbuser </span>|<span class="Apple-converted-space"> </span>| {}</span> <span style="font-family: verdana, geneva, sans-serif;">postgres<span class="Apple-converted-space"> </span>| Create role, Create DB <span class="Apple-converted-space"> </span>| {cloudsqlsuperuser}</span> |
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
1 2 3 4 5 6 7 8 9 10 11 |
<span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> </span>List of databases</span> <span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> </span>Name<span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>Owner <span class="Apple-converted-space"> </span>| Encoding | <span class="Apple-converted-space"> </span>Collate <span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>Ctype<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>Access privileges</span> <span style="font-family: verdana, geneva, sans-serif;">---------------+-------------------+----------+-------------+-------------+-----------------------------------------</span> <span style="font-family: verdana, geneva, sans-serif;">cloudsqladmin | cloudsqladmin <span class="Apple-converted-space"> </span>| UTF8 <span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>|</span> <span style="font-family: verdana, geneva, sans-serif;">postgres<span class="Apple-converted-space"> </span>| cloudsqlsuperuser | UTF8 <span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>|</span> <span style="font-family: verdana, geneva, sans-serif;">template0 <span class="Apple-converted-space"> </span>| cloudsqladmin <span class="Apple-converted-space"> </span>| UTF8 <span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| =c/cloudsqladmin <span class="Apple-converted-space"> </span>+</span> <span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>| cloudsqladmin=CTc/cloudsqladmin</span> <span style="font-family: verdana, geneva, sans-serif;">template1 <span class="Apple-converted-space"> </span>| cloudsqlsuperuser | UTF8 <span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| en_US.UTF8<span class="Apple-converted-space"> </span>| =c/cloudsqlsuperuser <span class="Apple-converted-space"> </span>+</span> <span style="font-family: verdana, geneva, sans-serif;"><span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>| <span class="Apple-converted-space"> </span>| cloudsqlsuperuser=CTc/cloudsqlsuperuser</span> <span style="font-family: verdana, geneva, sans-serif;">test_db <span class="Apple-converted-space"> </span>|dbuser<span class="Apple-converted-space"> </span>| UTF8 <span class="Apple-converted-space"> </span>| ja_JP.UTF-8 | ja_JP.UTF-8 |</span> |
無事できた。
このあたりの情報って、検索しても出てこなかったけど、どうしてるんだろ?