У меня есть терраформ для создания вычислительного экземпляра в 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
}
Выяснилось, что документация неверен, когда речь идет об указании подсетей. Выяснилось, что для правильной работы необходимо указать все 3 параметра:
network = var.network
subnetwork = var.subnetwork
subnetwork_project = var.project_id
@JohnHanley Я обновил ПО. До сих пор у меня не было проблем, подобных описанным выше (с другими вычислительными ресурсами), поэтому я был немного сбит с толку, почему он не работает, когда я ожидал, что он будет.
У каждого проекта есть свои VPC и подсети. Поскольку ваш HCL переключает проекты, вам также необходимо определить, какие подсети.
@JohnHanley Правильно, поэтому я указал оба модуля в каждом модуле и ожидал, что сеть и подсеть будут выбраны в качестве ресурса на основе project_id
, указанного в модуле. Документы Terraform упоминают subnetwork_project
только в том случае, если network
не указано или если subnetwork
является именем и это поле не указано, используется проект провайдера (так что в моем случае project_id
из модулей). В двух словах - в моем случае должно быть достаточно указать имя network
, но это не так.
Какой идентификатор проекта был указан при настройке поставщика GCP. Я думаю, проблема в том, что использовался проект по умолчанию. Ваше решение переопределяет этот идентификатор проекта. Если это так, то это будет не ошибка документации, а ошибка пользователя. Дважды проверьте и обновите свое решение.