Terraform动态块配置异常:如何仅为GCP PostgreSQL实例应用database_flags?
问题解决:GCP Cloud SQL 仅为PostgreSQL实例应用database_flags
问题背景
需要为GCP云SQL实例配置database_flags属性,但该属性仅支持PostgreSQL实例,MySQL实例不兼容。尝试用Terraform动态块实现条件配置,却出现invalidFlagName错误——database_flags仍被错误应用到了MySQL实例上。
原错误代码
resource "google_sql_database_instance" "master" { name = "${var.name}" database_version = "${var.database_version}" region = "${var.region}" settings { tier = "${var.tier}" disk_type = "${var.disk_type}" disk_size = "${var.disk_size}" disk_autoresize = "${var.disk_autoresize}" availability_type = "${var.availability_type}" ip_configuration { ipv4_enabled = "true" } maintenance_window { day = "${var.day}" } dynamic "database_flags" { for_each = "substr(${var.database_version}, 0, 5)" == "MYSQL" ? [] : [1] content { name = "log_lock_waits" value = "${var.log_lock_waits}" } } } }
错误原因
原动态块的for_each条件写法有误:将substr函数调用包裹在字符串中,Terraform会将其当作普通字符串处理,不会执行函数逻辑,导致条件判断失效——无论数据库版本是MySQL还是PostgreSQL,都会生成database_flags块。
修正后的代码
resource "google_sql_database_instance" "master" { name = var.name database_version = var.database_version region = var.region settings { tier = var.tier disk_type = var.disk_type disk_size = var.disk_size disk_autoresize = var.disk_autoresize availability_type = var.availability_type ip_configuration { ipv4_enabled = "true" } maintenance_window { day = var.day } dynamic "database_flags" { # 正确判断数据库版本前缀,仅当不是MySQL时生成该块 for_each = substr(var.database_version, 0, 5) == "MYSQL" ? [] : [1] content { name = "log_lock_waits" value = var.log_lock_waits } } } }
关键改动说明
- 修正函数调用逻辑:移除
substr函数外层的字符串包裹,直接使用substr(var.database_version, 0, 5)获取数据库版本的前5个字符,确保Terraform执行函数逻辑完成版本判断。 - 简化变量引用:Terraform 0.12及以上版本中,资源参数内直接引用变量无需添加
${},简化代码同时避免语法歧义。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

