Невозможно включить частный IP-адрес для моего экземпляра Postgres Cloud SQL

48
5

Когда я пытаюсь включить частный IP в своем экземпляре Cloud SQL (Postgresql 9.6), я получаю следующее сообщение об ошибке:

Network association failed due to the following error: set Service Networking service account as servicenetworking.serviceAgent role on consumer project

У меня есть VPC, который я выбираю в раскрывающемся списке "Связанная сеть", и я также выбрал сеть управляемых сервисов, которую я уже настроил, поэтому теоретически все должно работать.

Я не могу найти в IAM ничего, что относится к сообщению об ошибке, ни учетную запись службы, ни даже разрешение servicenetworking.serviceAgent.

Обновление Включая соответствующие фрагменты terraform

## VPC Setup
resource "google_compute_network" "my_network" {
project = "${var.project_id}"
name = "vpc-play"
auto_create_subnetworks = "false"
routing_mode = "REGIONAL"
}
# There is a bunch of subnets linked to this network which are not included here

## Managed services network

resource "google_compute_global_address" "default" {
name = "google-managed-services-vpc-${var.project_id}"
project = "${var.project_id}"
provider = "google-beta"
ip_version = "IPV4"
prefix_length = 16
address_type = "INTERNAL"
purpose = "VPC_PEERING"
network = "${google_compute_network.my_network.self_link}"
}

## Error occurs on this step
## Error is : google_service_networking_connection.private_vpc_connection: set Service Networking service account as servicenetworking.serviceAgent role on consumer project

resource "google_service_networking_connection" "private_vpc_connection" {
provider = "google-beta"
network = "${google_compute_network.my_network.self_link}"
service = "servicenetworking.googleapis.com"
reserved_peering_ranges = ["${google_compute_global_address.default.name}"]
}

## Database configuration <-- omitted private ip stuff for now as doesn't even get to creation of this, error in previous step

resource "google_sql_database_instance" "my_db" {
depends_on = ["google_service_networking_connection.private_vpc_connection"]
name = "my_db"
project = "${var.project_id}"
database_version = "POSTGRES_9_6"
region = "${var.region}"
lifecycle {
prevent_destroy = true
}

settings {
tier = "db-f1-micro"

backup_configuration {
enabled = true
start_time = "02:00"
}

maintenance_window {
day = 1
hour = 3
update_track = "stable"
}

ip_configuration {
authorized_networks = [
{
name = "office"
value = "${var.my_ip}"
},
]
}

disk_size = 10
availability_type = "ZONAL"

location_preference {
zone = "${var.zone}"
}
}
}

спросил(а) 2019-01-20T20:04:00+03:00 1 год назад
2
Решение
58

Кажется, что terraform в какой-то момент испортил права доступа к учетной записи и удалил роль servicenetworking.serviceAgent у всех пользователей.

Отключение, а затем повторное включение API службы сети решает проблему, сбрасывая разрешения для всех пользователей системы.

ответил(а) 2019-01-24T19:50:00+03:00 1 год назад
Еще 1 ответ
35

Код Terraform для создания экземпляра Cloud SQL с частным IP-адресом содержит некоторые ошибки. Во-первых, переменная ${google_compute_network.private_network.self_link} получает полное имя сети, это означает, что это будет что-то вроде www.googleapis.com/compute/v1/projects/PROJECT-ID/global/networks/testnw2. Это значение недопустимо в поле google_compute_global_address.private_ip_address.network, поэтому вам нужно изменить $ {google_compute_network.private_network.self_link} на $ {google_compute_network.private_network.name}.

Другая ошибка состоит в том, что формат в google_sql_database_instance.instance.settings.ip_configuration.private_network должен быть projects/PROJECT_ID/global/networks/NW_ID. поэтому вам нужно изменить поле на projects/[PROJECT_ID]/global/networks/${google_compute_network.private_network.name}, чтобы работать.

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

Четвертая ошибка заключается в том, что вам нужно сделать это с помощью провайдера Google-бета, а не Google по умолчанию


Как обсуждалось в комментарии, который я разместил, перед использованием этого кода Terraform я видел ошибку "An Unknown Error occurred", эта ошибка относится к ошибке при пиринге VPC. Я понимаю, что это неприятно, потому что он не показывает никакой полезной информации, но если вы откроете заявку в Службу поддержки Google Cloud Platform, мы сможем проверить настоящую ошибку с помощью наших внутренних инструментов.

Как и было обещано, это код, который я использую для создания частной сети и присоединения его к экземпляру Google Cloud SQL при создании.

provider "google-beta" {
credentials = "${file("CREDENTIALS.json")}"
project = "PROJECT-ID"
region = "us-central1"
}
resource "google_compute_network" "private_network" {
name = "testnw"
}

resource "google_compute_global_address" "private_ip_address" {
provider="google-beta"
name = "${google_compute_network.private_network.name}"
purpose = "VPC_PEERING"
address_type = "INTERNAL"
prefix_length = 16
network = "${google_compute_network.private_network.name}"
}

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"
depends_on = ["google_service_networking_connection.private_vpc_connection"]
name = "privateinstance"
region = "us-central1"
settings {
tier = "db-f1-micro"
ip_configuration {
ipv4_enabled = "false"
private_network = "projects/PROJECT-ID/global/networks/${google_compute_network.private_network.name}"
}
}
}

ответил(а) 2019-01-21T15:36:00+03:00 1 год назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема