Terraform Shared VPC на GCP - статический внутренний IP-адрес

Я пытаюсь написать автоматизацию для развертывания экземпляров в общем VPC на GCP. У меня есть проект хост-сети и сервисный проект. Я могу создать ресурс статического внутреннего IP-адреса в главном проекте (ресурс «google_compute_address» «internal»), в котором я указываю хост-проект VPC (NET_HUB_PROJ), но я не могу использовать его при создании экземпляра. Я получаю следующую ошибку:

google_compute_instance.compute: Error creating instance: googleapi: 
Error 400: Invalid value for field 
'resource.networkInterfaces[0].networkIP': '10.128.0.10'. IP address 
'projects/prototype-network-hub/regions/us-central1/addresses/bh-int- 
ip' (10.128.0.10) is reserved by another project., invalid

Мой вычислительный модуль:

data "google_compute_image" "image" {
  name    = "${var.IMAGE_NAME}"
  project = "${var.IMAGE_PROJECT}"
}

resource "google_compute_address" "internal" {
  name         = "${var.NAME}-int-ip"
  address_type = "INTERNAL"
  address      = "${var.PRIVATE_IP}"
  subnetwork   = "${var.NET_HUB_SUBNETWORK}"
  region       = "${var.NET_HUB_REGION}"
  project      = "${var.NET_HUB_PROJ}"
}

resource "google_compute_address" "external" {
  count        = "${var.EXT_IP_CREATE ? 1 : 0}"
  name         = "${var.NAME}-ext-ip"
  address_type = "EXTERNAL"
  region       = "${var.REGION}"
}

resource "google_compute_instance" "compute" {
   depends_on  = ["google_compute_address.external"] 
   name = "${var.NAME}"
   machine_type = "${var.MACHINE_TYPE}"
   zone = "${var.ZONE}"
   can_ip_forward = "${var.CAN_IP_FORWARD}"
   deletion_protection ="${var.DELETION_PROTECTION}"
   allow_stopping_for_update = "${var.ALLOW_STOPPING_FOR_UPDATE}"
   tags = ["allow-ssh"]
   metadata = {
    "network" = "${var.NETWORK}"
    "env" = "${var.ENV}"
    "role" = "${var.ROLE}"
    "region" = "${var.REGION}"
    "zone" = "${var.ZONE}"
   }
   labels = {
    "network" = "${var.NETWORK}"
    "env" = "${var.ENV}"
    "role" = "${var.ROLE}"
    "region" = "${var.REGION}"
    "zone" = "${var.ZONE}"
    }
   boot_disk {
      device_name = "${var.NAME}"
      auto_delete = "${var.BOOT_DISK_AUTO_DELETE}"
      initialize_params {
      size = "${var.BOOT_DISK_SIZE}"
      type = "${var.BOOT_DISK_TYPE}"
      image = "${data.google_compute_image.image.self_link}"
      }
   }

network_interface {
   network_ip = "${google_compute_address.internal.address}"
   subnetwork_project = "${var.NET_HUB_PROJ}"
   subnetwork   = "projects/prototype-network-hub/regions/us-central1/subnetworks/custom"
   access_config {
      nat_ip = "${element(concat(google_compute_address.external.*.address, list("")), 0)}"
   }
}
service_account {
   scopes = ["service-control", "service-management", "logging-write", "monitoring-write", "storage-ro", "https://www.googleapis.com/auth/trace.append" ]
   }
}

Конечная цель - выполнить следующее:  введите описание изображения здесь


person glux    schedule 26.03.2019    source источник
comment
Вы проверили, что 10.128.0.10 не использовался другим ресурсом?   -  person norbjd    schedule 27.03.2019
comment
Ни один другой ресурс не использует его. Я могу подтвердить, что он был создан в проекте сети хоста (prototype-network-hub), но не применен к какому-либо ресурсу. Сообщение об ошибке намекает на это. Он просто указывает, что он зарезервирован проектом. Следует обратить внимание на одну интересную вещь: при использовании TF я вижу внутреннее резервирование IP-адреса: evernote.com/l/AfdR3FOkerEW2 / a>, но когда зарезервировано вручную, как показано на картинке в моем сообщении выше, это не так.   -  person glux    schedule 27.03.2019


Ответы (2)


ИЗМЕНИТЬ (новый ответ): согласно документации GCP, статический внутренний IP-адрес должен принадлежать проекту службы (а не проекту сети хоста, как в вашем коде), если вы хотите зарезервировать внутренний IP-адрес на общий VPC в другом проекте. См. Здесь: https://cloud.google.com/vpc/docs/provisioning-shared-vpc#reserve_internal_ip

Поскольку shared-vpc вряд ли можно найти в вашей кодовой базе TF, вам придется использовать data, чтобы получить self_link подсети, которая будет использоваться для google_compute_address. Примерно так:

data "google_compute_subnetwork" "subnet" {
  name    = "${var.NET_HUB_SUBNETWORK}"
  project = "${var.NET_HUB_PROJ}"
  region  = "${var.NET_HUB_REGION}"
}

resource "google_compute_address" "internal" {
  name         = "${var.NAME}-int-ip"
  address_type = "INTERNAL"
  address      = "${var.PRIVATE_IP}"
  subnetwork   = "${data.google_compute_subnetwork.subnet.self_link}"
}

Это должно создать ресурс в вашем сервисном проекте, но с адресом в указанной подсети.

При развертывании экземпляра вы должны увидеть ссылку на него в столбце internal_ip на вкладке экземпляров виртуальной машины для назначенного экземпляра.

(старый ответ для потомков): к сожалению, google_compute_address не содержит subnetwork_project типа google_compute_instance. Чтобы исправить это, нужно предоставить полный URL-адрес поля subnetwork в google_compute_address. Примерно так:

resource "google_compute_address" "internal" {
  name         = "${var.NAME}-int-ip"
  address_type = "INTERNAL"
  address      = "${var.PRIVATE_IP}"
  subnetwork   = "https://www.googleapis.com/compute/v1/projects/${var.NET_HUB_PROJ}/regions/${var.NET_HUB_REGION}/subnetworks/${var.NET_HUB_SUBNETWORK}"
}
person Colin Garcia    schedule 02.04.2019
comment
У меня такая же проблема, но она не работает. - person jlim; 13.12.2020
comment
Я наконец понял это. При создании compute_address я должен использовать свой проект службы, а не основной проект. Как только я использую свой сервисный проект, все просто работает. Извините за путаницу. решение предоставлено ниже - person jlim; 13.12.2020

Добавление моего решения ниже: -


resource "google_compute_address" "internal_ip" {
  count        = 1
  name         = "${local.cluster_name}-int-ip-${count.index}"
  project      = <service project id>
  subnetwork   = <host project subnet self_link>
  address_type = "INTERNAL"
  region       = "asia-northeast1"
  purpose      = "GCE_ENDPOINT"
}

output "internal_ipaddr_info" {
  value = google_compute_address.internal_ip
}


resource "google_compute_instance" "test" {
  project        = module.gcp_service_project.project_id
  name           = "eps-gce-vm-d-swmgr-ane1-test"
  machine_type   = "n1-standard-1"
  zone           = "asia-northeast1-a"
  can_ip_forward = true
  boot_disk {
    initialize_params {
      image = "centos7"
    }
  }

  network_interface {
    subnetwork = <host project subnet self_link>
    network_ip = google_compute_address.internal_ip[0].self_link

  }

}
person jlim    schedule 13.12.2020