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で定義するのが良いのでしょう。