TerraformでAzure Database for MySQLを構築する場合、必ず利用するであろうリソースがazurerm_mysql_database
です。
このリソースはcharset
、
collation
が必須パラメータです。
それぞれ文字セット、照合順序を意味しており、MySQLを利用する方は気にしたことがあるでしょう。
一方で、これらの設定は通常サーバー設定として設定するものです。
そして、Azure Database for MySQLにおけるサーバー設定には専用のリソースazurerm_mysql_configuration
が存在しています。
であれば、azurerm_mysql_database
とazurerm_mysql_configuration
のどちらでこれらの設定を加えれば良いのでしょうか。
azurerm_mysql_databaseで設定→×
azurerm_mysql_database
を以下のように設定して、terraform apply
を実行しました。
ちなみに、mysql_version
には"8.0"
を指定しています。
$ terraform show | awk '/azurerm_mysql_database/,/^$/' | sed 's/.\{8\}-.\{4\}-.\{4\}-.\{4\}-.\{12\}/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/g' # module.mysql.module.db_for_mysql.azurerm_mysql_database.this["kiririmode-database-basic"]: resource "azurerm_mysql_database" "this" { charset = "latin2" collation = "latin2_general_ci" id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/databases/kiririmode-database-basic" name = "kiririmode-database-basic" resource_group_name = "rg_kiririmode_mysql-basic" server_name = "kiririmode-mysql-basic" }
その上で、mysql-clientで接続し、サーバーパラメータを確認してみます。 結果、以下のように設定した値が一切反映されていません。
$ mysql -h kiririmode-mysql-basic.mysql.database.azure.com -u 'kiririmode@kiririmode-mysql-basic' -p mysql> show variables where variable_name in ('character_set_server', 'collation_server'); +----------------------+-------------------+ | Variable_name | Value | +----------------------+-------------------+ | character_set_server | latin1 | | collation_server | latin1_swedish_ci | +----------------------+-------------------+ 2 rows in set (0.02 sec)
azurerm_mysql_configurationで設定→○
次に、azurerm_mysql_configuration
を用いてcollation_server
等を指定した上で、mysql-clientから確認をしてみました。
$ terraform show | awk '/character_set_server|collation_server/,/^$/' | sed 's/.\{8\}-.\{4\}-.\{4\}-.\{4\}-.\{12\}/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/g' # module.mysql.module.db_for_mysql.azurerm_mysql_configuration.this["character_set_server"]: resource "azurerm_mysql_configuration" "this" { id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/configurations/character_set_server" name = "character_set_server" resource_group_name = "rg_kiririmode_mysql-basic" server_name = "kiririmode-mysql-basic" value = "utf8mb4" } # module.mysql.module.db_for_mysql.azurerm_mysql_configuration.this["collation_server"]: resource "azurerm_mysql_configuration" "this" { id = "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/rg_kiririmode_mysql-basic/providers/Microsoft.DBforMySQL/servers/kiririmode-mysql-basic/configurations/collation_server" name = "collation_server" resource_group_name = "rg_kiririmode_mysql-basic" server_name = "kiririmode-mysql-basic" value = "utf8mb4_bin" }
show variables
をしてみましょう。
mysql> show variables where variable_name in ('character_set_server', 'collation_server'); +----------------------+-------------+ | Variable_name | Value | +----------------------+-------------+ | character_set_server | utf8mb4 | | collation_server | utf8mb4_bin | +----------------------+-------------+ 2 rows in set (0.11 sec)
無事に設定ができたようです。
結論
状況的には、azurerm_mysql_database
で設定するcharset
やcollation
にはあまり意味がなさそうです。
サーバー設定としてazurerm_mysql_configuration
で定義するのが良いのでしょう。