我们的云后端设置包含用于Postgres实例的5个cloud。我们使用Terraform管理我们的基础设施。我们使用公共IP和云SQL容器从GKE连接它们。
为了简化我们的设置,我们希望通过转移到私有IP来摆脱代理容器。我试着跟踪地形指南。虽然创建单个实例很好,但是尝试创建5个实例同时以4个失败的实例和一个成功的实例结束:

出现在失败实例上的Google控制台中的错误是“发生了未知错误”:

下面是复制它的代码。请注意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,但我得到了相同的错误。发布于 2019-05-05 12:18:03
找到了一个丑陋而有效的解决方案。虽然不能完成,但是GCP中的一个bug。并不阻止同时创建实例。既没有关于它的文档,也没有有意义的错误消息。它也出现在Terraform Google提供商发布跟踪器中。
另一种选择是增加实例之间的依赖。这使得他们的创造能够成功地完成。但是,每个实例都需要几分钟才能创建。这累积了很多时间。如果在创建实例之间添加60秒的人为延迟,则可以避免失败。备注:
db-f1-micro,30秒就足够了。它们对db-custom-1-3840来说是不够的。db-custom-1-3840所需的秒数是多少。30秒不够,60秒就够了。下面是解决此问题的代码示例。它只显示两个实例,因为由于depends_on的限制,我无法使用count特性,并且显示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"
}发布于 2020-09-30 19:26:10
如果有人在这里遇到了稍微不同的情况(在专用网络中创建google_sql_database_instance会导致“未知错误”):
在那之后为我工作
¯_(ツ)_/
发布于 2021-03-04 16:46:47
我在这里使用了一个稍微不同的情况,类似于@Grigorash (在专用网络中创建google_sql_database_instance会导致“未知错误”)。
我使用UI在私有VPC上部署一个SQL实例,原因是我也遇到了一个“未知错误”。我最终使用了gcloud命令来解决问题(为什么这是可行的,而不是UI呢?IDK,也许UI没有执行与命令相同的操作)
gcloud --project=[PROJECT_ID] beta sql instances create [INSTANCE_ID]
--network=[VPC_NETWORK_NAME]
--no-assign-ip https://stackoverflow.com/questions/55990713
复制相似问题