Terraform首次apply后无法获取GCP实例组实例信息求助
问题描述
使用Terraform通过google_compute_instance_template创建GCP Compute实例后,首次执行terraform apply时无法获取实例名称和公网IP,返回空列表报错;第二次执行则能正常获取。
相关代码
main.tf
resource "google_compute_region_instance_group_manager" "instance_group_manager" { region = var.region name = "${var.prefix}-igm-${random_string.random_string.result}" wait_for_instances = true version { instance_template = google_compute_instance_template.instance_template.id name = "${var.prefix}-tmplt" } base_instance_name = "${var.prefix}-${random_string.random_string.result}" }
output.tf
# 获取实例列表 data "google_compute_region_instance_group" "mig_data" { name = google_compute_region_instance_group_manager.instance_group_manager.name region = var.region } # 获取每个实例的数据 data "google_compute_instance" "intance_data" { count = var.instances_min_grop_size self_link = data.google_compute_region_instance_group.mig_data.instances[count.index].instance } # 输出所需数据 output "public_ips" { value = [ for instance in data.google_compute_instance.intance_data: [ instance.name, instance.network_interface.0.access_config.0.nat_ip ] ] }
首次执行报错信息
Error: Invalid index │ │ on output.tf line 49, in data "google_compute_instance" "intance_data": │ 49: self_link = data.google_compute_region_instance_group.mig_data.instances[count.index].instance │ ├──────────────── │ │ count.index is 0 │ │ data.google_compute_region_instance_group.mig_data.instances is empty list of object │ │ The given key does not identify an element in this collection value: the collection has no elements. ╵ ╷ │ Error: Invalid index │ │ on output.tf line 49, in data "google_compute_instance" "intance_data": │ 49: self_link = data.google_compute_region_instance_group.mig_data.instances[count.index].instance │ ├──────────────── │ │ count.index is 1 │ │ data.google_compute_region_instance_group.mig_data.instances is empty list of object │
第二次执行正常输出
public_ips = [ [ "chkp-tf-mig-07m81-97nz", "35.231.4.112", ], [ "chkp-tf-mig-07m81-bkj2", "34.23.235.90", ], ]
原因及解决方案
问题原因
尽管google_compute_region_instance_group_manager设置了wait_for_instances = true,但Terraform的数据资源google_compute_region_instance_group会在资源创建阶段提前读取数据,此时实例组虽已创建,但内部实例尚未完成注册,导致instances列表为空。第二次执行时,实例已完成注册,数据资源能正常读取到实例信息。
解决方法
方法1:直接通过实例组管理器属性获取实例信息
无需使用数据资源,直接从google_compute_region_instance_group_manager的instances属性读取实例链接,避免提前读取空数据:
修改后的output.tf:
# 获取每个实例的数据 data "google_compute_instance" "instance_data" { count = length(google_compute_region_instance_group_manager.instance_group_manager.instances) self_link = google_compute_region_instance_group_manager.instance_group_manager.instances[count.index] } # 输出所需数据 output "public_ips" { value = [ for instance in data.google_compute_instance.instance_data: [ instance.name, instance.network_interface.0.access_config.0.nat_ip ] ] }
这种方式会让Terraform等待实例组管理器的instances属性有值后,再创建数据资源,避免空索引错误。
方法2:添加显式依赖并动态计数
给数据资源添加depends_on确保依赖顺序,同时用实例列表长度作为计数,避免固定数量导致的索引越界:
修改后的output.tf:
# 获取实例列表 data "google_compute_region_instance_group" "mig_data" { name = google_compute_region_instance_group_manager.instance_group_manager.name region = var.region depends_on = [google_compute_region_instance_group_manager.instance_group_manager] } # 获取每个实例的数据 data "google_compute_instance" "instance_data" { count = length(data.google_compute_region_instance_group.mig_data.instances) self_link = data.google_compute_region_instance_group.mig_data.instances[count.index].instance } # 输出所需数据 output "public_ips" { value = [ for instance in data.google_compute_instance.instance_data: [ instance.name, instance.network_interface.0.access_config.0.nat_ip ] ] }
内容的提问来源于stack exchange,提问作者Mahmoud Alsheikh
相关产品推荐
相关产品推荐

