Проблема с созданием вычислительного экземпляра в GCP для разных идентификаторов проекта с помощью terraform

У меня есть терраформ для создания вычислительного экземпляра в GCP, который выглядит так:

resource "google_compute_address" "static_ip" {
  project = var.project_id
  name = "vm-instance"
}

resource "google_compute_instance" "vm_instance" {
  project       = var.project_id
  name          = "vm-instance"
  machine_type  = "e2-standard-4"
  zone          = "us-east4-c"

  boot_disk {
    device_name = "vm-instance"
    mode = "READ_WRITE"

    initialize_params {
      image = "centos-cloud/centos-7"
      size = 20
    }
  }

  tags = ["web-host","http-server","https-server"]

  network_interface {
    network = var.network
    subnetwork = var.subnetwork
    #subnetwork_project = var.project_id

    access_config {
      nat_ip = google_compute_address.static_ip.address
    }

  }

  service_account {
    scopes = ["cloud-platform"]
  }

  scheduling {
    on_host_maintenance = "MIGRATE"
    #provisioning_model = "STANDARD"
  }

  shielded_instance_config {
    enable_secure_boot = true
    enable_vtpm = true
    enable_integrity_monitoring = true
  }
}

и модули, которые будут его использовать:

module "sandbox_vm" {
  source     = "./modules/terraform-vm"
  network    = "sandbox-vpc"
  subnetwork = "sandbox-vpc"
  project_id = var.sandbox_project
}

module "dev_vm" {
  source     = "./modules/terraform-vm"
  network    = "dev-vpc"
  subnetwork = "dev-vpc"
  project_id = var.dev_project
}


module "prod_vm" {
  source     = "./modules/terraform-vm"
  network    = "prod-vpc"
  subnetwork = "prod-vpc"
  project_id = var.prod_project
}

но когда я попытаюсь применить, это закончится ошибками:

Error: Error creating instance: googleapi: Error 400: Invalid value for field 'resource.networkInterfaces[0].subnetwork': 'projects/cloud-sandbox/regions/us-east4/subnetworks/dev-vpc'. The referenced subnetwork resource cannot be found., invalid

  on modules/terraform-vm/main.tf line 6, in resource "google_compute_instance" "vm_instance":
   6: resource "google_compute_instance" "vm_instance" {



Error: Error creating instance: googleapi: Error 400: Invalid value for field 'resource.networkInterfaces[0].subnetwork': 'projects/cloud-sandbox/regions/us-east4/subnetworks/prod-vpc'. The referenced subnetwork resource cannot be found., invalid

  on modules/terraform-vm/main.tf line 6, in resource "google_compute_instance" "vm_instance":
   6: resource "google_compute_instance" "vm_instance" {

Почему он будет пытаться использовать подсети из других идентификаторов проекта, если они строго указаны для каждого модуля?

PS.

Файл провайдера содержит

provider "google" {
  credentials = var.credentials_file
  region      = var.region
}
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
0
0
29
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Выяснилось, что документация неверен, когда речь идет об указании подсетей. Выяснилось, что для правильной работы необходимо указать все 3 параметра:

    network = var.network
    subnetwork = var.subnetwork
    subnetwork_project = var.project_id

Какой идентификатор проекта был указан при настройке поставщика GCP. Я думаю, проблема в том, что использовался проект по умолчанию. Ваше решение переопределяет этот идентификатор проекта. Если это так, то это будет не ошибка документации, а ошибка пользователя. Дважды проверьте и обновите свое решение.

John Hanley 03.05.2022 02:57

@JohnHanley Я обновил ПО. До сих пор у меня не было проблем, подобных описанным выше (с другими вычислительными ресурсами), поэтому я был немного сбит с толку, почему он не работает, когда я ожидал, что он будет.

JackTheKnife 03.05.2022 03:37

У каждого проекта есть свои VPC и подсети. Поскольку ваш HCL переключает проекты, вам также необходимо определить, какие подсети.

John Hanley 03.05.2022 03:38

@JohnHanley Правильно, поэтому я указал оба модуля в каждом модуле и ожидал, что сеть и подсеть будут выбраны в качестве ресурса на основе project_id, указанного в модуле. Документы Terraform упоминают subnetwork_project только в том случае, если network не указано или если subnetwork является именем и это поле не указано, используется проект провайдера (так что в моем случае project_id из модулей). В двух словах - в моем случае должно быть достаточно указать имя network, но это не так.

JackTheKnife 03.05.2022 03:49

Другие вопросы по теме