🚀

Terraform を使って作成したAzure PostgreSQL DBの照合順序を--no-localeにしたい

2023/01/15に公開

タイトルの通りです。Azure Database for PostgreSQL Flexible Server を利用している際に、Terraform で照合順序を指定しながらデータベースを作成したい!というときのメモとなります。

PostgreSQLを利用するにあたって、日本語を扱う場合、データベース作成時のロケール指定で--no-localeにしたいことがあると思います(Azureに限らず…きっと)
しかし、マネージドサービスは initdb に直接--no-locale設定することが出来ません。
そのため、同義となる--locale-CをTerraform 上で指定することにより、実質--no-locale近い状態でデータベースを構築することが可能となります(あくまで近い状態というのがポイントです)

database.tf
resource "azurerm_postgresql_flexible_server_database" "main" {
  # Required
  name      = "sample-database-name"
  server_id = azurerm_postgresql_flexible_server.main.id
  # Optional
  charset   = "UTF-8"
  # 👇 今回はここで直接"C"を指定することで"--no-locale"に近い状態でDBを作成する。
  collation = "C"
}

これでAzure PostgreSQL上に作成したデータベースに照合順序:Cが設定されました。

しかし前述の通り、これはあくまで initdb に--no-localeを設定したのと近い状態であり、全く同じ状態ではありません。上記で作成されたデータベースでは、lc_collatelc_ctypeは "C"となっているものの、それ以外は "C" とならず、デフォルトまたはサーバーパラメーターで指定された値となります。

Azure PostgreSQLの場合
SELECT name, setting, context FROM pg_settings WHERE name LIKE 'lc%';

name     |   setting   |  context
- ------------+-------------+-----------
**lc_collate  | C           | internal**
**lc_ctype    | C           | internal**

lc_messages | en_US.utf8  | superuser
lc_monetary | en_US.utf-8 | user
lc_numeric  | en_US.utf-8 | user
lc_time     | en_US.utf8  | user

Azureの場合、これはマネージドサービスの制約上、変更が出来ないようです。このうち、lc_monetarylc_numericについては、暫定対策としてC.UTF-8を利用することが出来るようなので、こちらでカバーするしかない模様。

細かいところですが、IaaSでPostgreSQLをインストールしてinitdbに設定していた方にとっては「マネージドサービスの恩恵を受けているので仕方ないか…」と割り切るしかないですかね。私の業務ではまだそれほど重たいデータが入ってきませんが、今後コアな業務領域に携わる場合は気をつけていきたいなと再認識しました。

あと、Terraformでの指定をどうやるんだろう…と悩んでいたのですが、シンプルに"C"で良いというのも学びでした。調べる前にテスト環境で「えいや!」でやってみても良かったかもです…もちろん丁寧に行うのも大切ですが、作成と破棄がしやすいというのもクラウドのメリットですからね。

というわけで、IaCには勇気も大切!(タブン

Discussion