Terraform EMR模块未声明core_instance_group却在计划中出现致集群重复重建
解决Terraform EMR模块中Instance Fleet与Instance Group冲突导致重复重建集群的问题
问题现象
- 使用
terraform-aws-modules/emr/aws1.0.0版本部署EMR集群,已配置master_instance_fleet和core_instance_fleet - 执行
terraform plan时,计划输出中出现未声明的core_instance_group和master_instance_group,标记为待创建(+) - Terraform状态里这两个字段值为
null,导致哪怕集群无任何修改,每次执行plan都会提示需要重建集群
原因分析
这个版本的EMR模块在处理Instance Fleet配置时,没有自动禁用Instance Group相关参数。Terraform会将未设置的Instance Group参数视为null,但AWS EMR的API逻辑是:集群采用Fleet模式时,不应存在Instance Group资源。这种状态不一致会让Terraform误判为需要修改集群,进而触发重建操作。
解决方法
在模块配置中显式将master_instance_group和core_instance_group设为null,强制Terraform忽略这两个资源块。修改后的完整配置如下:
module "emr_trino_cluster" { source = "terraform-aws-modules/emr/aws" version = "1.0.0" name = "${local.resources_prefix}-trino" log_uri = "s3n://${s3_log}/logs/elasticmapreduce/" release_label = var.trino_emr_version visible_to_all_users = true applications = ["Trino", "Hive", "Hue"] create_service_iam_role = false service_iam_role_arn = aws_iam_role.emr_default_role.arn scale_down_behavior = "TERMINATE_AT_TASK_COMPLETION" ebs_root_volume_size = 20 step_concurrency_level = 1 termination_protection = false vpc_id = var.vpc_id master_instance_fleet = { name = "cfnMaster" target_on_demand_capacity = 1 instance_type_configs = [ { instance_type = "r6g.xlarge" weighted_capacity = 1 ebs_config = [{ iops = 0 size = 64 type = "gp3" volumes_per_instance = 1 }] } ] } core_instance_fleet = { name = "coreNinja" target_on_demand_capacity = 1 instance_type_configs = [ { bid_price_as_percentage_of_on_demand_price = 60 ebs_config = [{ iops = 0 size = 64 type = "gp3" volumes_per_instance = 1 }] instance_type = "r6g.xlarge" weighted_capacity = 1 } ] } # 新增这两行,显式禁用Instance Group master_instance_group = null core_instance_group = null create_iam_instance_profile = false ec2_attributes = { instance_profile = aws_iam_instance_profile.ec2_attributes_profile.name key_name = aws_key_pair.ec2_key_name.key_name subnet_id = var.private_subnet_ids[0] additional_master_security_groups = aws_security_group.trino_additional_master_security_groups.id additional_slave_security_groups = aws_security_group.trino_slave_security_groups.id } tags = local.tags }
验证操作
- 重新执行
terraform plan,确认core_instance_group和master_instance_group不再出现在变更列表中 - 执行
terraform apply更新状态,后续再执行terraform plan将不会再出现重建集群的提示
额外说明
- 该模块的2.0.0及以上版本已修复此问题,模块会自动根据是否配置Fleet来处理Instance Group参数,若能升级模块版本,也可直接通过升级解决问题
- 若暂时无法升级,显式设置
null是最直接有效的解决方案
内容的提问来源于stack exchange,提问作者Marksman
相关产品推荐
相关产品推荐

