7
votes

Impossible d'activer une adresse IP privée pour mon instance Postgres Cloud SQL

Lorsque j'essaie d'activer une adresse IP privée sur mon instance Cloud SQL (PostgreSQL 9.6), j'obtiens le message d'erreur suivant:

L'association réseau a échoué en raison de l'erreur suivante: définissez le compte de service Service Networking en tant que réseau de service. Rôle serviceAgent sur un projet consommateur

J'ai un VPC que je sélectionne dans la liste déroulante "Réseau associé" et j'ai également choisi un réseau de services gérés que j'ai déjà configuré, donc en théorie tout devrait fonctionner .

Je ne trouve rien sous IAM qui se rapporte au message d'erreur, que ce soit un compte de service ou même l'autorisation servicenetworking.serviceAgent .

Mettre à jour Y compris les extraits de terraform pertinents

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


10 commentaires

Il y a quelques APIS à activer pour que cela fonctionne, l'API du service réseau est-elle activée?


Vous voulez dire celui-ci - console.cloud.google.com / apis / library /… service Oui, il est activé


C'est étrange, il ne devrait pas avoir besoin d'un compte de service, avez-vous réessayé de l'activer?


Comment activez-vous l'adresse IP privée? via Cloud Console? via un appel API? ou via la commande gcloud? Pouvez-vous essayer d'exécuter la commande gcloud beta sql instances patch INSTANCE --network = NETWORK ? Vous pouvez trouver plus d'informations ici [1]. [1]: cloud.google.com/sdk/gcloud/ reference / beta / sql / instances / pat‌ ch


@mcgin, Aussi, une autre question, le réseau sur lequel vous essayez d'activer l'adresse IP privée est un réseau partagé? si c'est le cas, vous ne pourrez pas le faire si l'instance PostgreSQL est déjà créée, car cela devrait être fait lors de la création [2] (Ce document est pour MySQL, mais cette restriction s'applique également à PostgreSQL). Si vous utilisez un VPC dans votre projet, vous n'avez pas à vous en soucier. [2]: cloud.google.com/sql/docs/mysql/ private-ip # network_requireme‌ nts


@AlexRiquelme J'ai créé la base de données avec terraform comme base de données publique. Une fois que les IP privées sont devenues GA, j'ai essayé de la convertir en IP privée en utilisant d'abord l'interface utilisateur, puis aussi avec terraform. Je peux identifier la ressource spécifique qui échoue maintenant avec la configuration de terrform, ce n'est pas la base de données, c'est la création de google_service_networking_connection qui échoue.


@AlexRiquelme J'ai essayé d'exécuter la commande de patch et j'ai obtenu une erreur interne, les journaux indiquent simplement "Une erreur inconnue s'est produite"


@McGin 1er: Vous avez besoin d'un compte de service pour exécuter ce code Terraform, veuillez ajouter en haut du fichier ce code: provider "google-beta" {credentials = "$ {file (" CREDENTIALS.json ")}" project = "PROJECT" region = "us-central1"}


2ème: J'ai vu la même erreur dans le passé en utilisant le code Terraform, l'erreur inconnue est parce que l'appairage VPC n'a pas été effectué correctement. Je posterai une réponse dans quelques minutes avec le bon code.


Ces instructions ont fonctionné pour moi, mais j'ai dû désactiver et réactiver les API container.googleapis.com et servicenetworking.googleapis.com. La création de mon cluster GKE a échoué avec l'erreur: "reason": "backendError"


4 Réponses :


11
votes

Le code Terraform pour créer un Cloud SQL l'instance avec une adresse IP privée comporte des erreurs. Le premier est que la variable $ {google_compute_network.private_network.self_link} obtient le nom complet du réseau, ce qui signifie que ce sera quelque chose comme www.googleapis.com/compute/v1/ projets / ID-PROJET / global / réseaux / testnw2 . Cette valeur n'est pas autorisée dans le champ google_compute_global_address.private_ip_address.network , vous devez donc remplacer $ {google_compute_network.private_network.self_link} par $ {google_compute_network.private_network.name}.

Une autre erreur est que le format dans google_sql_database_instance.instance.settings.ip_configuration.private_network doit être projects / PROJECT_ID / global / networks / NW_ID . vous devez donc changer le champ en projects / [PROJECT_ID] / global / networks / $ {google_compute_network.private_network.name} pour fonctionner.

La troisième erreur, et également, celui que vous avez partagé dans votre message initial, vous devez définir un compte de service dans le code Terraform pour disposer des privilèges appropriés pour éviter cette erreur. Veuillez vérifier les premières lignes du code partagé.

La quatrième erreur est que vous devez le faire en utilisant le fournisseur google-beta, pas celui par défaut de google

Comme indiqué dans le commentaire que j'ai posté, j'ai vu l'erreur "Une erreur inconnue s'est produite" avant d'utiliser ce code Terraform, cette erreur fait référence à une erreur lors de l'appairage de VPC. Je comprends que résoudre ce problème est frustrant, car cela ne montre aucune information utile, mais si vous ouvrez un ticket dans l'assistance Google Cloud Platform, nous pourrons vérifier la véritable erreur à l'aide de nos outils internes.

Comme promis, c'est le code que j'utilise pour créer un réseau privé et le joindre à une instance Google Cloud SQL lors de la création.

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


8 commentaires

Merci, mais cela ne résout toujours pas le problème, je reçois toujours l'erreur lorsque terraform crée la connexion réseau de service google_service_networking_connection.private_vpc_connection: définissez le compte de service Service Networking sur le rôle servicenetworking.serviceAgent sur le projet consommateur . Les informations d'identification que j'ai fournisseur pour terraformer sont pour un propriétaire du projet, alors s'attendrait-il à ce que cela se passe bien?


@McGin utilisez-vous un credentials.json avec suffisamment de privilèges pour effectuer cette action? pouvez-vous essayer de le faire avec un compte de service Project Editor?


C'est avec le compte propriétaire. Il semble que terraform foutait en quelque sorte les permissions. Si je désactive l'API de mise en réseau de service et la réactive, je pourrais alors l'exécuter normalement. La solution semble donc être de désactiver + réactiver l'API, ce qui entraîne la réinitialisation des autorisations.


@AlexRiquelme - J'essaie de créer plusieurs instances de base de données avec des adresses IP privées à l'aide de Terraform et je rencontre des erreurs intermittentes «Une erreur inconnue s'est produite». Certaines des instances de base de données sont créées avec succès, tandis que d'autres échouent avec ce message d'erreur. Comment puis-je le déboguer?


@AlexRiquelme - Je n'ai pas réussi à me connecter dans le lien que vous avez fourni. J'ai trouvé une solution de contournement laide mais efficace. Veuillez consulter la question et réponse j'ai posté.


@AlexRiquelme - Si vous pouvez déposer le bogue que j'ai trouvé dans vos systèmes internes et me Cc sur la progression, ce serait génial.


@McGin Avez-vous trouvé une solution de contournement pour ne pas avoir à désactiver et réactiver manuellement l'API? Rencontrer le même problème


@Pydam non, c'était la seule façon dont je pouvais le faire à l'époque, mais je sais qu'il y a eu des changements dans la façon dont terraform gère les ressources google_project_service depuis que j'ai eu ce problème, le comportement des anciennes ressources google_project_services que j'utilisais sonne comme c'était probablement un coupable - terraform.io/docs/ fournisseurs / google / guides /…



1
votes

Il semble que terraform ait gâché les autorisations sur le compte à un moment donné et supprimé le rôle servicenetworking.serviceAgent de tous les utilisateurs.

La désactivation puis la réactivation de l'API de réseau de service résout le problème en réinitialisant les autorisations de tous les utilisateurs du système.


1 commentaires

Merci, j'ai également dû désactiver et activer servicenetworking.googleapis.com . La réponse est toujours de redémarrer, hein? ;)



1
votes

Cela semble aussi être lié à l'erreur

Erreur: googleapi: Erreur 400: la vérification des conditions préalables a échoué., failedPrecondition

quant aux deux erreurs, je désactive et active l'API de mise en réseau et cela fonctionne à nouveau ...


0 commentaires

0
votes

Cela m'a sauvé par conséquent:

projets gcloud 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 /


0 commentaires