Как исправить ошибку «Произошла неизвестная ошибка» при одновременном создании нескольких экземпляров Google Cloud SQL с частным IP-адресом? - PullRequest
1 голос
/ 05 мая 2019

Наша облачная серверная установка содержит 5 Cloud SQL для экземпляров Postgres.Мы управляем нашей инфраструктурой с помощью Terraform.Мы используем соединение их из GKE с использованием общедоступного IP-адреса и Cloud SQL-контейнера .

. Чтобы упростить нашу настройку, мы хотим избавиться от прокси-контейнеров, перейдя на частный IP-адрес.,Я пытался следовать руководству Terraform .Хотя создание отдельного экземпляра работает нормально, попытка создания 5 экземпляров одновременно заканчивается 4 неудачными и один успешным: Failed instance list in the GCP console

Ошибка, которая появляется в консоли Google Clod наНеудачные случаи: «Произошла неизвестная ошибка»: Failed instance with error message in the GCP console

Ниже приведен код, который воспроизводит ее.Обратите внимание на строку count = 5:

resource "google_compute_network" "private_network" {
  provider = "google-beta"

  name = "private-network"
}

resource "google_compute_global_address" "private_ip_address" {
  provider = "google-beta"

  name = "private-ip-address"
  purpose = "VPC_PEERING"
  address_type = "INTERNAL"
  prefix_length = 16
  network = "${google_compute_network.private_network.self_link}"
}

resource "google_service_networking_connection" "private_vpc_connection" {
  provider = "google-beta"

  network = "${google_compute_network.private_network.self_link}"
  service = "servicenetworking.googleapis.com"
  reserved_peering_ranges = ["${google_compute_global_address.private_ip_address.name}"]
}

resource "google_sql_database_instance" "instance" {
  provider = "google-beta"
  count = 5

  name = "private-instance-${count.index}"
  database_version = "POSTGRES_9_6"

  depends_on = [
    "google_service_networking_connection.private_vpc_connection"
  ]

  settings {
    tier = "db-custom-1-3840"
    availability_type = "REGIONAL"
    ip_configuration {
      ipv4_enabled = "false"
      private_network = "${google_compute_network.private_network.self_link}"
    }
  }
}

provider "google-beta" {
  version = "~> 2.5"
  credentials = "credentials.json"
  project = "PROJECT_ID"
  region = "us-central1"
  zone = "us-central1-a"
}

Я попробовал несколько альтернатив:

  • Подождите минуту после создания google_service_networking_connection и затем одновременно создайте все экземпляры, ноЯ получил ту же ошибку.
  • Создание диапазона адресов и google_service_networking_connection на экземпляр, но я получил ошибку, что google_service_networking_connection не может быть создан одновременно.
  • Создание диапазона адресов на экземпляри один google_service_networking_connection, который ссылается на все из них, но я получил ту же ошибку.

1 Ответ

1 голос
/ 05 мая 2019

Нашел уродливое, но работающее решение.В GCP есть ошибка , которая не препятствует одновременному созданию экземпляров, хотя и не может быть завершена.Об этом нет ни документации, ни значимого сообщения об ошибке.Он также появляется в трекере проблем провайдера Google .

Один из вариантов - добавить зависимость между экземплярами.Это позволяет их созданию успешно завершиться.Однако создание каждого экземпляра занимает несколько минут.Это накапливает много потраченных минут.Если мы добавим искусственную задержку в 60 секунд между созданием экземпляра, нам удастся избежать сбоев.Примечания:

  • Необходимое количество секунд для задержки зависит от уровня экземпляра.Например, для db-f1-micro достаточно 30 секунд.Их было недостаточно для db-custom-1-3840.
  • Я не уверен, каково точное количество необходимых секунд для db-custom-1-3840.30 секунд было недостаточно, 60 было.

Ниже приведен пример кода для решения проблемы.Он показывает только 2 экземпляра, поскольку из-за ограничений depends_on я не смог использовать функцию подсчета, и показ полного кода для 5 экземпляров был бы очень длинным.Он работает одинаково для 5 экземпляров:

resource "google_compute_network" "private_network" {
  provider = "google-beta"

  name = "private-network"
}

resource "google_compute_global_address" "private_ip_address" {
  provider = "google-beta"

  name = "private-ip-address"
  purpose = "VPC_PEERING"
  address_type = "INTERNAL"
  prefix_length = 16
  network = "${google_compute_network.private_network.self_link}"
}

resource "google_service_networking_connection" "private_vpc_connection" {
  provider = "google-beta"

  network = "${google_compute_network.private_network.self_link}"
  service = "servicenetworking.googleapis.com"
  reserved_peering_ranges = ["${google_compute_global_address.private_ip_address.name}"]
}

locals {
  db_instance_creation_delay_factor_seconds = 60
}

resource "null_resource" "delayer_1" {
  depends_on = ["google_service_networking_connection.private_vpc_connection"]

  provisioner "local-exec" {
    command = "echo Gradual DB instance creation && sleep ${local.db_instance_creation_delay_factor_seconds * 0}"
  }
}

resource "google_sql_database_instance" "instance_1" {
  provider = "google-beta"

  name = "private-instance-delayed-1"
  database_version = "POSTGRES_9_6"

  depends_on = [
    "google_service_networking_connection.private_vpc_connection",
    "null_resource.delayer_1"
  ]

  settings {
    tier = "db-custom-1-3840"
    availability_type = "REGIONAL"
    ip_configuration {
      ipv4_enabled = "false"
      private_network = "${google_compute_network.private_network.self_link}"
    }
  }
}

resource "null_resource" "delayer_2" {
  depends_on = ["google_service_networking_connection.private_vpc_connection"]

  provisioner "local-exec" {
    command = "echo Gradual DB instance creation && sleep ${local.db_instance_creation_delay_factor_seconds * 1}"
  }
}

resource "google_sql_database_instance" "instance_2" {
  provider = "google-beta"

  name = "private-instance-delayed-2"
  database_version = "POSTGRES_9_6"

  depends_on = [
    "google_service_networking_connection.private_vpc_connection",
    "null_resource.delayer_2"
  ]

  settings {
    tier = "db-custom-1-3840"
    availability_type = "REGIONAL"
    ip_configuration {
      ipv4_enabled = "false"
      private_network = "${google_compute_network.private_network.self_link}"
    }
  }
}

provider "google-beta" {
  version = "~> 2.5"
  credentials = "credentials.json"
  project = "PROJECT_ID"
  region = "us-central1"
  zone = "us-central1-a"
}

provider "null" {
  version = "~> 1.0"
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...