Wenn ich versuche, eine private IP auf meiner Cloud SQL-Instanz (Postgresql 9.6) zu aktivieren, wird die folgende Fehlermeldung angezeigt:

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

Ich habe eine VPC, die ich in der Dropdown-Liste "Zugehöriges Netzwerk" auswähle, und ich habe auch ein Managed Services-Netzwerk ausgewählt, das ich bereits eingerichtet habe, damit theoretisch alles funktionieren sollte.

Ich kann unter IAM nichts finden, was sich auf die Fehlermeldung bezieht, weder ein Dienstkonto noch die Berechtigung servicenetworking.serviceAgent.

Update Einschließlich der relevanten Terraform-Schnipsel

## 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}"
    }
  }
}

9
McGin 20 Jän. 2019 im 20:04

3 Antworten

Beste Antwort

Es scheint, dass Terraform die Berechtigungen für das Konto irgendwann durcheinander gebracht und die Rolle servicenetworking.serviceAgent von allen Benutzern entfernt hat.

Durch Deaktivieren und erneutes Aktivieren der Service-Netzwerk-API wird das Problem behoben, indem die Berechtigungen für alle Benutzer des Systems zurückgesetzt werden.

1
McGin 24 Jän. 2019 im 16:50

Der Terraform-Code zum Erstellen einer Cloud SQL-Instanz mit Private IP hat einige Fehler. Die erste ist, dass die Variable ${google_compute_network.private_network.self_link} den gesamten Namen des Netzwerks erhält, was bedeutet, dass dies so etwas wie www.googleapis.com/compute/v1/projects/PROJECT-ID/global/networks/testnw2 ist. Dieser Wert ist im Feld google_compute_global_address.private_ip_address.network nicht zulässig. Sie müssen daher $ {google_compute_network.private_network.self_link} in $ {google_compute_network.private_network.name} ändern.

Ein weiterer Fehler ist, dass das Format in google_sql_database_instance.instance.settings.ip_configuration.private_network projects/PROJECT_ID/global/networks/NW_ID sein sollte. Sie müssen also das Feld in projects/[PROJECT_ID]/global/networks/${google_compute_network.private_network.name} ändern, um arbeiten zu können.

Für den dritten Fehler und den Fehler, den Sie in Ihrer ersten Nachricht geteilt haben, müssen Sie ein Dienstkonto im Terraform-Code, um über die entsprechenden Berechtigungen zu verfügen, um diesen Fehler zu vermeiden. Bitte überprüfen Sie die ersten Zeilen des freigegebenen Codes.

Der vierte Fehler ist, dass Sie dies mit dem Google Beta-Anbieter tun müssen, nicht mit dem Google-Standardanbieter

Wie in dem von mir geposteten Kommentar erläutert, habe ich vor der Verwendung dieses Terraform-Codes den Fehler "An Unknown Error occurred" gesehen. Dieser Fehler bezieht sich auf einen Fehler beim VPC-Peering. Ich verstehe, dass es frustrierend ist, dies zu beheben, da keine nützlichen Informationen angezeigt werden. Wenn Sie jedoch ein Ticket im Google Cloud Platform-Support öffnen, können wir den tatsächlichen Fehler mithilfe unserer internen Tools überprüfen.

Wie versprochen ist dies der Code, mit dem ich ein privates Netzwerk erstelle und es bei der Erstellung an eine Google Cloud SQL-Instanz anhänge.

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}"
        }
    }
}
10
Alex Riquelme 21 Jän. 2019 im 12:36

Es scheint auch mit dem Fehler zu tun zu haben

Fehler: googleapi: Fehler 400: Vorbedingungsprüfung fehlgeschlagen., FailedPrecondition

Was beide Fehler betrifft, deaktiviere und aktiviere ich die Netzwerk-API und es funktioniert wieder ...

1
AS Mackay 29 Juli 2019 im 22:03