如何用for_each为aws_rds_cluster_parameter_group设置参数?
问题:Terraform批量生成aws_rds_cluster_parameter_group的parameter块失败
我尝试创建aws_rds_cluster_parameter_group资源,希望从列表变量加载参数,但用for_each和dynamic块的尝试都失败了,具体操作如下:
变量定义
variable "parameters" { type = list }
tfvars文件内容
parameters = [ { name = "timezone" value = "CET" } # 更多参数... ]
第一种尝试(直接在parameter块用for_each)
resource "aws_rds_cluster_parameter_group" "db-aurora-postgresql-cluster-parameter-group" { family = "aurora-postgresql13" description = "Aurora PostgreSQL cluster parameter group" parameter { for_each = { for par in var.parameters : par.name => par } name = each.value.name value = each.value.value } }
错误信息:
Error: each.value cannot be used in this context on resources.tf line 21, in resource "aws_rds_cluster_parameter_group" "db-aurora-postgresql-cluster-parameter-group": 21: name = each.value.name A reference to "each.value" has been used in a context in which it is unavailable, such as when the configuration no longer contains the value in its "for_each" expression. Remove this reference to each.value in your configuration to work around this error.
第二种尝试(dynamic块写法错误)
resource "aws_rds_cluster_parameter_group" "db-aurora-postgresql-cluster-parameter-group" { family = "aurora-postgresql13" description = "Aurora PostgreSQL cluster parameter group" dynamic "parameter" { for_each = var.parameters name = parameter.value["name"] value = parameter.value["value"] } }
错误信息:
Error: Unsupported argument on resources.tf line 21, in resource "aws_rds_cluster_parameter_group" "db-aurora-postgresql-cluster-parameter-group": 21: name = each.value.name An argument named "name" is not expected here.
正确实现方法
使用dynamic块时,必须通过content字段定义每个生成的parameter块的内容,正确写法如下:
resource "aws_rds_cluster_parameter_group" "db-aurora-postgresql-cluster-parameter-group" { family = "aurora-postgresql13" description = "Aurora PostgreSQL cluster parameter group" dynamic "parameter" { for_each = var.parameters content { name = parameter.value.name value = parameter.value.value # 可选:如果需要参数立即生效,添加该行 # apply_method = "immediate" } } }
额外优化:变量类型约束
为避免参数格式错误,建议给parameters变量添加更严格的类型校验:
variable "parameters" { type = list(object({ name = string value = string })) description = "List of RDS cluster parameters" }
错误原因说明
- 第一种尝试错误:Terraform的嵌套块(如
parameter)不支持直接在块内声明for_each,必须通过dynamic块实现批量生成嵌套块。 - 第二种尝试错误:
dynamic块的语法错误,name、value等参数不能直接写在dynamic块顶层,必须放在content内部,content才是定义生成块内容的区域。
内容的提问来源于stack exchange,提问作者XerX
相关产品推荐
相关产品推荐

