Terraform使用for_each创建多个aws_rds_cluster_instance问题求助
Terraform Aurora集群多实例for_each实现方案
前置修正
你提供的variable.tfvars存在语法错误,rds_aurora列表结尾应为]而非},修正后参考:
rds_aurora = [ { cluster_identifier = "aurora-cluster-mysql-qa" cluster_instance_count = 2 engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.07.1" }, { cluster_identifier = "aurora-cluster-mysql-dev" cluster_instance_count = 1 engine = "aurora-mysql" engine_version = "5.7.mysql_aurora.2.07.1" } ]
实现代码
方案1:通过locals预处理(推荐,可读性更高)
先在模块中新增局部变量展开实例配置:
locals { # 按实例数展开所有集群的实例条目,生成符合for_each要求的映射 rds_instance_map = merge([ for rds_config in var.rds_aurora : { for instance_idx in range(rds_config.cluster_instance_count) : "${rds_config.cluster_identifier}-${instance_idx}" => rds_config } ]...) }
然后修改资源配置:
resource "aws_rds_cluster_instance" "cluster_instances" { for_each = local.rds_instance_map identifier = each.key cluster_identifier = each.value.cluster_identifier engine = each.value.engine engine_version = each.value.engine_version # 其余参数按需补充 }
方案2:直接在for_each中写逻辑
如果不需要复用展开后的映射,也可以直接写在资源的for_each字段中:
resource "aws_rds_cluster_instance" "cluster_instances" { for_each = merge([ for rds_config in var.rds_aurora : { for instance_idx in range(rds_config.cluster_instance_count) : "${rds_config.cluster_identifier}-${instance_idx}" => rds_config } ]...) identifier = each.key cluster_identifier = each.value.cluster_identifier engine = each.value.engine engine_version = each.value.engine_version # 其余参数按需补充 }
逻辑说明
- 通过
range(集群实例数)生成从0到实例数-1的连续索引,对应每个实例的序号 - 内层for循环为每个实例生成唯一的映射键
集群标识-序号,值复用当前集群的配置 merge(...)配合参数展开符...将所有集群生成的实例小映射合并为一个统一的大映射,完全符合你预期的输出结构- 映射键为稳定的全局唯一标识,修改任意集群配置、增减实例数都不会触发其他无关资源的重建,满足你使用for_each避免顺序影响的需求
内容的提问来源于stack exchange,提问作者Abhishek Solanki
相关产品推荐
相关产品推荐

