为何Terraform会无差别更新google_compute_instance_group_manager版本名称?
Terraform GCP实例组管理器无变更却随机触发版本字段更新的解决方法
问题描述
执行terraform apply时,明明模块、实例模板等所有配置都未修改,却随机出现实例组管理器的版本字段被移除的计划日志,示例日志如下:
# module.my_module_name.google_compute_instance_group_manager.main will be updated in-place ~ resource "google_compute_instance_group_manager" "main" { id = "projects/my-project/zones/us-central1-a/instanceGroupManagers/my-instance-group" name = "my-instance-group" # (11 unchanged attributes hidden) ~ version { - name = "0/2022-11-02 13:32:38.953868+00:00" -> null # (1 unchanged attribute hidden) } # (2 unchanged blocks hidden) }
对应的实例组管理器配置:
resource "google_compute_instance_group_manager" "main" { name = "${var.pipeline_id}-group" base_instance_name = "${var.pipeline_id}-group" version { instance_template = google_compute_instance_template.main.id } auto_healing_policies { health_check = google_compute_health_check.main.id initial_delay_sec = 300 } }
尝试设置静态版本名称但未解决问题。
问题根源
这是Terraform GCP Provider的常见问题,核心是Terraform与GCP API对版本名称的处理逻辑不一致:
- 当未显式指定版本名称时,GCP会自动生成带时间戳的版本名(如
0/2022-11-02 13:32:38.953868+00:00) - Terraform的状态文件不会存储这个自动生成的名称,因此每次执行
terraform plan时,会误判该字段需要被移除;但apply完成后,GCP又会重新生成该名称,导致循环出现无意义的变更提示。
解决方案
给version块显式指定与GCP默认规则匹配的固定名称:
GCP默认给第一个版本分配的名称前缀是0(不带时间戳部分),只需将配置中的version块补充该名称即可:
resource "google_compute_instance_group_manager" "main" { name = "${var.pipeline_id}-group" base_instance_name = "${var.pipeline_id}-group" version { name = "0" # 显式指定与GCP默认一致的版本名称 instance_template = google_compute_instance_template.main.id } auto_healing_policies { health_check = google_compute_health_check.main.id initial_delay_sec = 300 } }
执行一次terraform apply后,后续的plan操作就不会再出现该无意义的变更提示。
注:之前设置静态名称无效,大概率是因为指定的名称与GCP自动生成的默认格式不匹配(比如用了自定义字符串而非
0),导致Terraform仍会检测到差异。
内容的提问来源于stack exchange,提问作者stkvtflw
相关产品推荐
相关产品推荐

