Terraform を使って作成したAzure PostgreSQL DBの照合順序を--no-localeにしたい
タイトルの通りです。Azure Database for PostgreSQL Flexible Server を利用している際に、Terraform で照合順序を指定しながらデータベースを作成したい!というときのメモとなります。
PostgreSQLを利用するにあたって、日本語を扱う場合、データベース作成時のロケール指定で--no-locale
にしたいことがあると思います(Azureに限らず…きっと)
しかし、マネージドサービスは initdb に直接--no-locale
設定することが出来ません。
そのため、同義となる--locale-C
をTerraform 上で指定することにより、実質--no-locale
と近い状態でデータベースを構築することが可能となります(あくまで近い状態というのがポイントです)
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_collate
とlc_ctype
は "C"となっているものの、それ以外は "C" とならず、デフォルトまたはサーバーパラメーターで指定された値となります。
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_monetary
とlc_numeric
については、暫定対策としてC.UTF-8
を利用することが出来るようなので、こちらでカバーするしかない模様。
細かいところですが、IaaSでPostgreSQLをインストールしてinitdbに設定していた方にとっては「マネージドサービスの恩恵を受けているので仕方ないか…」と割り切るしかないですかね。私の業務ではまだそれほど重たいデータが入ってきませんが、今後コアな業務領域に携わる場合は気をつけていきたいなと再認識しました。
あと、Terraformでの指定をどうやるんだろう…と悩んでいたのですが、シンプルに"C"で良いというのも学びでした。調べる前にテスト環境で「えいや!」でやってみても良かったかもです…もちろん丁寧に行うのも大切ですが、作成と破棄がしやすいというのもクラウドのメリットですからね。
というわけで、IaCには勇気も大切!(タブン
Discussion