Когда я пытаюсь включить частный 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}"
}
}
}
Вы имеете в виду вот этот - сервис console.cloud.google.com/apis/library/… Да он включен
Странно, что служебная учетная запись не нужна, вы пытались включить ее повторно?
Как вы включаете частный IP? через облачную консоль? через вызов API? или через команду gcloud? Может попробовать запустить команду gcloud beta sql instances patch INSTANCE --network=NETWORK? Вы можете найти больше информации здесь [1]. [1]: cloud.google.com/sdk/gcloud/reference/beta/sql/instances/patch
@mcgin, также еще один вопрос, сеть, в которой вы пытаетесь включить частный IP-адрес, является общей сетью? если это так, вы не сможете сделать это, если экземпляр PostgreSQL уже создан, поскольку это следует сделать при создании [2] (этот документ относится к MySQL, но это ограничение относится и к PostgreSQL). Если вы используете VPC внутри своего проекта, вам не нужно об этом беспокоиться. [2]: cloud.google.com/sql/docs/mysql/private-ip#network_requirements
@AlexRiquelme Я создал базу данных с помощью terraform как общедоступную базу данных. Как только частный IP-адрес стал общедоступным, я попытался преобразовать его в частный IP-адрес, сначала используя пользовательский интерфейс, а затем также с помощью terraform. Я могу точно определить конкретный ресурс, который сейчас дает сбой с помощью конфигурации terrform, это не БД, это сбой создания google_service_networking_connectiong.
@AlexRiquelme Я попытался выполнить команду исправления и получил внутреннюю ошибку, в журналах просто указано «Произошла неизвестная ошибка»
@McGin 1st: вам нужна учетная запись службы для запуска этого кода Terraform, пожалуйста, добавьте в начало файла этот код: provider "google-beta" {credentials = "${file("CREDENTIALS.json")}" project = "ПРОЕКТ" регион = "us-central1" }
2-й: я видел ту же ошибку в прошлом, используя код Terraform, неизвестная ошибка связана с тем, что пиринг VPC был выполнен неправильно. Через несколько минут я отправлю ответ с правильным кодом.
Эти инструкции сработали для меня, но мне пришлось отключить и снова включить API container.googleapis.com и servicenetworking.googleapis.com. Мой кластер GKE не собирался с ошибкой: "reason": "backendError"

Код 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-beta, а не google по умолчанию
Как обсуждалось в комментарии, который я разместил, я видел ошибку "An Unknown Error occurred" перед использованием этого кода Terraform, эта ошибка относится к ошибке при выполнении пиринга 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}"
}
}
}
Спасибо, но это все еще не решает проблему, я все еще получаю сообщение об ошибке, когда terraform создает сетевое подключение службы google_service_networking_connection.private_vpc_connection: set Service Networking service account as servicenetworking.serviceAgent role on consumer project. Учетные данные, которые я предоставил для terraform, предназначены для владельца проекта, так что можно ожидать, что это будет хорошо?
@McGin Вы используете учетные данные .json с достаточными привилегиями для выполнения этого действия? вы можете попробовать сделать это с учетной записью службы редактора проекта?
Это с учетной записи владельца. Похоже, terraform каким-то образом напортачил с разрешениями. Если я отключу сетевой API-интерфейс службы и снова включу его, я смогу запустить его как обычно. Таким образом, решение, похоже, отключает + повторно включает API, что приводит к сбросу разрешений.
@AlexRiquelme - я пытаюсь создать несколько экземпляров БД с частными IP-адресами с помощью Terraform и периодически сталкиваюсь с ошибками «Произошла неизвестная ошибка». Некоторые из экземпляров БД создаются успешно, в то время как другие не работают с этим сообщением об ошибке. Как я могу отладить это?
@AlexRiquelme - мне не удалось войти по предоставленной вами ссылке. Я нашел уродливый, но работающий обходной путь. Пожалуйста, смотрите вопрос и ответ, который я разместил.
@AlexRiquelme - Если вы можете сообщить об ошибке, которую я нашел в ваших внутренних системах, и отправить мне копию, я буду рад.
@McGin Вы нашли обходной путь, позволяющий не отключать и снова включать API вручную? Столкнулся с той же проблемой
@Pydam нет, это был единственный способ сделать это в то время, однако я знаю, что произошли изменения в том, как terraform управляет ресурсами google_project_service, так как у меня возникла эта проблема, поведение старых ресурсов google_project_services, которые я использовал, звучит как это был вероятный виновник - terraform.io/docs/providers/google/guides/…
Кажется, terraform в какой-то момент испортил разрешения для учетной записи и удалил роль servicenetworking.serviceAgent для всех пользователей.
Отключение, а затем повторное включение сетевого API службы решает проблему путем сброса разрешений для всех пользователей системы.
Спасибо, мне тоже пришлось отключать и включать servicenetworking.googleapis.com . Ответ всегда перезагружаться, а? ;)
Кажется, это также связано с ошибкой
Error: googleapi: Error 400: Precondition check failed., failedPrecondition
что касается обеих ошибок, я отключаю и включаю сетевой API, и он снова начинает работать...
Это спасло меня отсюда:
gcloud projects add-iam-policy-binding YOUR_HOST_PROJECT_NAME \
--member=serviceAccount:service-HOST_PROJECT_ACCOUNT_NUMBER@service-networking.iam.gserviceaccount.com \
--role=roles/servicenetworking.serviceAgent
https://thedataguy.in/cloudsql-shared-vpc-private-ip-and-servicenetworking.serviceagent-role/
Есть несколько APIS, которые нужно включить, чтобы это работало, включен ли API сетевой службы?