Terraform EKS模块升级:如何条件性传递参数避免集群重建
条件性向Terraform EKS模块传递参数的解决方案
我正尝试升级Terraform AWS EKS模块至v18.31.2版本,但上游的破坏性变更会导致现有v17版本的EKS集群被重建。虽然通过设置覆盖参数可以避免重建,示例代码如下:
module "eks" { source = "terraform-aws-modules/eks/aws" version = "v18.31.2" # 覆盖默认值以保持向后兼容 prefix_separator = "" cluster_security_group_description = "EKS cluster security group." cluster_security_group_name = var.cluster_name iam_role_arn = local.iam_role_arn create_iam_role = false ... }
但我希望新集群构建时使用模块默认值,仅对从v17迁移的现有集群应用这些覆盖参数。尝试用三元运算符实现时,传入的是字面量null而非省略参数,达不到预期效果,示例代码如下:
module "eks" { source = "terraform-aws-modules/eks/aws" version = "v18.31.2" prefix_separator = var.v17_migration ? "" : null cluster_security_group_description = var.v17_migration ? "EKS cluster security group." : null cluster_security_group_name = var.v17_migration ? var.cluster_name : null iam_role_arn = var.v17_migration ? local.iam_role_arn : null create_iam_role = var.v17_migration ? false : null ... }
可行方案:使用映射展开实现条件传参
Terraform 0.14及以上版本支持通过映射展开语法...,结合局部变量实现条件性传递模块参数,既能让迁移集群用上覆盖参数避免重建,新集群也能完全使用模块默认值。
具体实现代码:
locals { # 仅当v17_migration为true时,生成包含覆盖参数的映射 migration_overrides = var.v17_migration ? { prefix_separator = "" cluster_security_group_description = "EKS cluster security group." cluster_security_group_name = var.cluster_name iam_role_arn = local.iam_role_arn create_iam_role = false } : {} } module "eks" { source = "terraform-aws-modules/eks/aws" version = "v18.31.2" # 展开条件性覆盖参数:迁移时传入,新集群则无此参数 ...local.migration_overrides # 其他固定配置参数(如集群名称、节点组配置等) ... }
为什么之前的方案无效?
Terraform中,向模块传递null值和完全省略参数是两种不同行为:大部分模块会将显式传入的null当作有效值处理,而非回退到默认值。只有完全省略参数,模块才会使用预设的默认配置。
额外注意事项
- 确保你的Terraform版本≥0.14,否则无法使用映射展开语法
... - 待所有v17集群完成迁移后,可移除
var.v17_migration变量和对应的覆盖参数,统一使用模块默认值
内容的提问来源于stack exchange,提问作者Swiss
相关产品推荐
相关产品推荐

