Accéder aux API Google via des points de terminaison

Ce document explique comment utiliser des points de terminaison Private Service Connect pour se connecter aux API Google. Au lieu d'envoyer des requêtes API aux adresses IP disponibles publiquement pour les points de terminaison de service tels que storage.googleapis.com, vous pouvez envoyer les requêtes à l'adresse IP interne d'un point de terminaison.

Vous pouvez également utiliser Private Service Connect pour accéder aux services d'un autre réseau VPC et pour publier des services.

Rôles

Les rôles IAM suivants fournissent les autorisations nécessaires pour effectuer les tâches décrites dans ce guide.

Tâche Rôles
Créer un point de terminaison Tous les rôles suivants :
Administrateur de réseaux Compute (roles/compute.networkAdmin),
Éditeur de l'annuaire des services (roles/servicedirectory.editor) et
Administrateur DNS (roles/dns.admin)
Configurer l'accès privé à Google (facultatif) Administrateur de réseaux Compute (roles/compute.networkAdmin)

Avant de commencer

  • Pour en savoir plus, y compris sur la configuration et les limites DNS, consultez la section À propos de la connexion aux API Google à l'aide de points de terminaison.

  • Private Service Connect n'active pas automatiquement les API. Vous devez activer séparément les API Google dont vous avez besoin depuis la page API et services de Google Cloud Console.

  • Vous devez activer l'API Compute Engine dans votre projet.

  • Vous devez activer l'API de l'Annuaire des services dans votre projet.

  • Vous devez activer l'API Cloud DNS dans votre projet.

  • Vous devez choisir une adresse IP à utiliser pour le point de terminaison. Pour en savoir plus sur les adresses IP que vous pouvez utiliser, consultez la section Exigences relatives à l'adresse IP.

  • Les règles de pare-feu de sortie doivent autoriser le trafic vers le point de terminaison. La configuration de pare-feu par défaut d'un réseau VPC autorise ce trafic, car elle contient une règle implicite de sortie autorisée. Vérifiez que vous n'avez pas créé de règle de sortie de priorité plus élevée qui bloque le trafic.

  • Les instances de machines virtuelles (VM) sans adresse IP externe attribuée doivent utiliser un sous-réseau avec l'accès privé à Google activé pour accéder aux API et services Google à l'aide d'un point de terminaison.

    Une VM avec une adresse IP externe peut accéder aux API et services Google à l'aide de points de terminaison, même si l'accès privé à Google est désactivé pour son sous-réseau. La connectivité au point de terminaison reste dans le réseau de Google.

  • Si votre réseau VPC ne contient aucun point de terminaison, vérifiez s'il existe une zone privée Cloud DNS pour p.googleapis.com. Si la zone existe, supprimez-la avant de créer le point de terminaison. Si vous ne la supprimez pas, la création de la zone DNS de l'annuaire des services utilisé pour Private Service Connect échoue. Pour en savoir plus, consultez la section Dépannage.

  • Les points de terminaison ne sont pas accessibles à partir des réseaux VPC appairés.

Activer l'accès privé à Google pour un sous-réseau

Les VM sans adresse IP externe attribuée doivent être connectées à un sous-réseau avec l'accès privé à Google activé pour accéder aux API et services Google à l'aide d'un point de terminaison.

Si la VM comporte plusieurs interfaces, connectez celle qui est configurée avec une route par défaut (généralement nic0).

L'adresse IP source des paquets envoyés depuis la VM doit correspondre à l'adresse IPv4 interne principale de l'interface de VM, ou à une adresse IPv4 interne issue d'une plage d'adresses IP d'alias.

Pour activer l'accès privé à Google sur un sous-réseau, procédez comme suit :

Console

  1. Dans Google Cloud Console, accédez à la page Réseaux VPC.

    Accéder aux réseaux VPC

  2. Cliquez sur le nom du réseau contenant le sous-réseau pour lequel vous devez activer l'accès privé à Google.

  3. Cliquez sur le nom du sous-réseau. La page Détails du sous-réseau s'affiche.

  4. Cliquez sur Modifier.

  5. Dans la section Accès privé à Google, sélectionnez Activé.

  6. Cliquez sur Enregistrer.

gcloud

  1. Déterminez le nom et la région du sous-réseau. Pour répertorier les sous-réseaux d'un réseau particulier, utilisez la commande suivante :

    gcloud compute networks subnets list --filter=NETWORK_NAME
    
  2. Exécutez la commande suivante pour activer l'accès privé à Google :

    gcloud compute networks subnets update SUBNET_NAME \
    --region=REGION \
    --enable-private-ip-google-access
    
  3. Vérifiez que l'accès privé à Google est activé en exécutant la commande suivante :

    gcloud compute networks subnets describe SUBNET_NAME \
    --region=REGION \
    --format="get(privateIpGoogleAccess)"
    

Remplacez les éléments suivants :

  • SUBNET_NAME : nom du sous-réseau
  • REGION : région du sous-réseau
  • NETWORK_NAME : nom du réseau VPC contenant le sous-réseau

Terraform

Vous pouvez activer l'accès privé à Google sur un sous-réseau à l'aide de la ressource Terraform.

resource "google_compute_network" "network" {
  project                 = var.project # Replace this with your project ID in quotes
  name                    = "tf-test"
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "vpc_subnetwork" {
  project                  = google_compute_network.network.project
  name                     = "test-subnetwork"
  ip_cidr_range            = "10.2.0.0/16"
  region                   = "us-central1"
  network                  = google_compute_network.network.id
  private_ip_google_access = true
}

Pour savoir comment appliquer ou supprimer une configuration Terraform, consultez la page Commandes Terraform de base.

Créer un point de terminaison

Après avoir choisi une adresse IP qui répond aux exigences, vous pouvez créer un point de terminaison.

Un point de terminaison se connecte aux API et services Google à l'aide d'une règle de transfert globale. Chaque règle de transfert est comptabilisée dans le quota de réseaux VPC pour Private Service Connect.

Vous ne pouvez pas mettre à jour un point de terminaison pour les API et services Google après sa création. Si vous devez mettre à jour un point de terminaison pour les API et services Google, supprimez-le, puis créez-en un autre.

Console

  1. Dans Google Cloud Console, accédez à la page Private Service Connect.

    Accéder à Private Service Connect

  2. Cliquez sur l'onglet Points de terminaison connectés.

  3. Cliquez sur Connecter le point de terminaison.

  4. Dans le champ Cible, sélectionnez le bundle d'API cible que vous souhaitez utiliser :

    • Toutes les API Google
    • VPC SC
  5. Dans le champ Nom du point de terminaison, saisissez un nom pour le point de terminaison.

  6. Sélectionnez un réseau pour le point de terminaison.

  7. Sélectionnez une adresse IP pour le point de terminaison.

    L'adresse IP choisie doit respecter ces critères.

    Si vous avez besoin d'une nouvelle adresse IP, vous pouvez en créer une :

    1. Cliquez sur Créer une adresse IP.
    2. Saisissez un nom et une description pour l'adresse IP.
    3. Saisissez l'adresse IP que vous souhaitez utiliser, puis cliquez sur Enregistrer.
  8. Si une région de l'annuaire des services n'est pas déjà configurée pour ce réseau VPC, sélectionnez la région que vous souhaitez utiliser.

    Tous les points de terminaison utilisés pour accéder aux API et aux services Google d'un réseau VPC donné utilisent la même région de l'annuaire des services.

  9. Si un espace de noms de l'annuaire des services n'est pas déjà configuré pour ce réseau VPC, configurez l'espace de noms que vous souhaitez utiliser :

    • Pour utiliser un espace de noms attribué automatiquement, cliquez sur le menu déroulant Espace de noms et sélectionnez l'espace de noms attribué automatiquement.

    • Pour sélectionner un espace de noms existant utilisé dans un autre réseau, cliquez sur le menu déroulant Espace de noms et sélectionnez un espace de noms dans la liste. La liste affiche tous les espaces de noms du projet. Vous devez sélectionner un espace de noms utilisé uniquement pour les points de terminaison permettant d'accéder aux API Google.

    • Pour créer un espace de noms, cliquez sur le menu déroulant Espace de noms, puis sur Créer un espace de noms. Saisissez l'espace de noms et cliquez sur Créer.

    Tous les points de terminaison que vous utilisez pour accéder aux API et services Google d'un réseau VPC donné utilisent le même espace de noms de l'annuaire des services.

  10. Cliquez sur Ajouter un point de terminaison.

gcloud

  1. Réservez une adresse IP interne globale à attribuer au point de terminaison.

    gcloud compute addresses create ADDRESS_NAME \
      --global \
      --purpose=PRIVATE_SERVICE_CONNECT \
      --addresses=ENDPOINT_IP \
      --network=NETWORK_NAME
    

    Remplacez l'élément suivant :

    • ADDRESS_NAME : nom à attribuer à l'adresse IP réservée.

    • ENDPOINT_IP : adresse IP à réserver pour le point de terminaison.

      L'adresse IP choisie doit respecter ces critères.

    • NETWORK_NAME : nom du réseau VPC utilisé pour le point de terminaison.

  2. Créez une règle de transfert pour connecter le point de terminaison aux API et services Google.

    gcloud compute forwarding-rules create ENDPOINT_NAME \
      --global \
      --network=NETWORK_NAME \
      --address=ADDRESS_NAME \
      --target-google-apis-bundle=API_BUNDLE \
      [ --service-directory-registration=REGION_NAMESPACE_URI ]
    

    Remplacez l'élément suivant :

    • ENDPOINT_NAME : nom à attribuer au point de terminaison. Le nom doit être une chaîne de 1 à 20 caractères ne contenant que des lettres minuscules et des chiffres. Le nom doit commencer par une lettre.

    • NETWORK_NAME : nom du réseau VPC utilisé pour le point de terminaison.

    • ADDRESS_NAME : nom de l'adresse réservée sur le réseau associé.

    • API_BUNDLE : groupe d'API à mettre à disposition à l'aide du point de terminaison. Consultez la liste des API compatibles.

      • Utilisez all-apis pour accorder l'accès à toutes les API compatibles.

      • Utilisez vpc-sc pour limiter l'accès aux API Google compatibles avec VPC Service Controls.

    • REGION_NAMESPACE_URI : URI de la région ou de l'espace de noms de l'annuaire des services que vous souhaitez utiliser. Cet URI doit faire référence au projet dans lequel vous créez le point de terminaison.

      • Vous ne pouvez définir une région qu'avec projects/PROJECT_NAME/locations/REGION.

      • Vous pouvez définir une région et un espace de noms avec projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE.

      Si vous omettez complètement --service-directory-registration ou définissez une région sans espace de noms, les événements suivants se produisent :

      • Si une région ou un espace de noms est déjà configuré pour ce réseau VPC, ces valeurs par défaut sont utilisées.

      • Si une région n'est pas configurée, elle est définie sur us-central1. Si un espace de noms n'est pas configuré, un espace de noms généré par le système est attribué.

API

  1. Réservez une adresse IP interne globale à attribuer au point de terminaison.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/addresses
    
    {
    "name": ADDRESS_NAME,
    "address": ENDPOINT_IP,
    "addressType": "INTERNAL",
    "purpose": PRIVATE_SERVICE_CONNECT,
    "network": NETWORK_URL
    }
    

    Remplacez l'élément suivant :

    • PROJECT_ID : ID de votre projet.

    • ADDRESS_NAME : nom à attribuer à l'adresse IP réservée.

    • ENDPOINT_IP : adresse IP à réserver pour le point de terminaison.

      L'adresse IP choisie doit respecter ces critères.

    • NETWORK_URL : réseau VPC pour le point de terminaison. Utilisez la méthode network.list ou gcloud compute networks list --uri pour rechercher les URL de vos réseaux.

  2. Créez une règle de transfert pour connecter le point de terminaison aux API et services Google.

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/forwardingRules
    {
     "IPAddress": ADDRESS_URL,
     "network": NETWORK_URL,
     "name": ENDPOINT_NAME,
     "target": API_BUNDLE,
     "serviceDirectoryRegistrations : [
       {
         "service_directory_region": REGION,
         "namespace": "NAMESPACE"
    
       }
     ],
    }
    

    Remplacez l'élément suivant :

    • PROJECT_ID : ID de votre projet.

    • ENDPOINT_NAME : nom à attribuer au point de terminaison. Le nom doit être une chaîne de 1 à 20 caractères ne contenant que des lettres minuscules et des chiffres. Le nom doit commencer par une lettre.

    • NETWORK_URL : réseau VPC pour le point de terminaison. Utilisez la méthode network.list ou gcloud compute networks list --uri pour rechercher les URL de vos réseaux.

    • ADDRESS_URL : URL de l'adresse réservée sur le réseau associé. Utilisez la méthode globalAddresses.list ou gcloud compute addresses list --uri pour rechercher les URL de vos adresses réservées.

    • API_BUNDLE : bundle d'API à mettre à disposition à l'aide du point de terminaison. Consultez la liste des API compatibles.

      • Utilisez all-apis pour accorder l'accès à toutes les API compatibles.

      • Utilisez vpc-sc pour limiter l'accès aux API Google compatibles avec VPC Service Controls.

    • REGION: région de l'annuaire des services que vous souhaitez utiliser. Exemple : us-central1. Si vous omettez REGION et qu'une région est déjà configurée pour ce réseau VPC, cette région est utilisée. Si une région n'est pas configurée, elle est définie sur us-central1.

    • NAMESPACE : nom de l'espace de noms de l'annuaire des services que vous souhaitez utiliser. Si vous omettez NAMESPACE et qu'un espace de noms est déjà configuré pour ce réseau VPC, cet espace de noms est utilisé. Si un espace de noms n'est pas configuré, un espace de noms généré par le système est attribué.

Terraform

Vous pouvez utiliser les ressources Terraform suivantes pour créer un point de terminaison :

resource "google_compute_global_address" "default" {
  project      = google_compute_network.network.project
  name         = "global-psconnect-ip"
  address_type = "INTERNAL"
  purpose      = "PRIVATE_SERVICE_CONNECT"
  network      = google_compute_network.network.id
  address      = "10.3.0.5"
}
resource "google_compute_global_forwarding_rule" "default" {
  project               = google_compute_network.network.project
  name                  = "globalrule"
  target                = "all-apis"
  network               = google_compute_network.network.id
  ip_address            = google_compute_global_address.default.id
  load_balancing_scheme = ""
}

Vérifier que le point de terminaison fonctionne

Créez une instance de VM dans le réseau VPC sur lequel Private Service Connect est configuré. Exécutez la commande suivante sur la VM pour vérifier que le point de terminaison Private Service Connect fonctionne. Les points de terminaison ne répondent pas aux requêtes ping (ICMP).

curl -v ENDPOINT_IP/generate_204

Remplacez ENDPOINT_IP par l'adresse IP du point de terminaison.

Si le point de terminaison fonctionne, un code de réponse HTTP 204 s'affiche.

Répertorier les points de terminaison

Vous pouvez répertorier tous les points de terminaison configurés.

Console

  1. Dans Google Cloud Console, accédez à la page Private Service Connect.

    Accéder à Private Service Connect

  2. Cliquez sur l'onglet Points de terminaison connectés.

    Les points de terminaison s'affichent.

gcloud

gcloud compute forwarding-rules list  \
--filter target="(all-apis OR vpc-sc)" --global

Le résultat ressemble à ce qui suit :

NAME  REGION  IP_ADDRESS  IP_PROTOCOL  TARGET
RULE          IP          TCP          all-apis

Obtenir des informations sur un point de terminaison

Vous pouvez afficher tous les détails de configuration d'un point de terminaison.

Console

  1. Dans Google Cloud Console, accédez à la page Private Service Connect.

    Accéder à Private Service Connect

  2. Cliquez sur l'onglet Points de terminaison connectés.

    Les points de terminaison s'affichent.

  3. Cliquez sur le point de terminaison dont vous souhaitez afficher les détails.

gcloud

gcloud compute forwarding-rules describe \
    ENDPOINT_NAME --global

Ajouter un libellé à un point de terminaison

Vous pouvez gérer les libellés des points de terminaison. Pour en savoir plus, consultez la section Attribuer des libellés à des ressources.

Supprimer un point de terminaison

Vous pouvez supprimer un point de terminaison.

Console

  1. Dans Google Cloud Console, accédez à la page Private Service Connect.

    Accéder à Private Service Connect

  2. Cliquez sur l'onglet Points de terminaison connectés.

  3. Sélectionnez le point de terminaison que vous souhaitez supprimer, puis cliquez sur Supprimer.

gcloud

    gcloud compute forwarding-rules delete \
        ENDPOINT_NAME --global

Remplacez ENDPOINT_NAME par le nom du point de terminaison que vous souhaitez supprimer.

Utiliser un point de terminaison

Pour utiliser un point de terminaison, vous devez envoyer des requêtes à un nom d'hôte DNS qui pointe vers l'adresse IP du point de terminaison.

  • Vous pouvez utiliser les noms DNS p.googleapis.com créés automatiquement si vous pouvez configurer vos clients pour utiliser un point de terminaison personnalisé et si des enregistrements DNS p.googleapis.com sont créés pour les API et les services que vous souhaitez utiliser. Pour en savoir plus, consultez la section Utiliser des noms DNS p.googleapis.com.

    Par exemple, si le nom de votre point de terminaison est xyz, des enregistrements DNS sont créés pour storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com et d'autres API couramment utilisées dans le groupe d'API.

  • Vous pouvez créer des enregistrements DNS à l'aide des noms DNS par défaut si vous utilisez un client qui n'a pas été configuré pour utiliser un point de terminaison personnalisé, ou si aucun enregistrement DNS p.googleapis.com n'existe pour le service que vous souhaitez utiliser. Pour en savoir plus, consultez la section Créer des enregistrements DNS à l'aide de noms DNS par défaut.

    Par exemple, créez des enregistrements DNS pour storage.googleapis.com et compute.googleapis.com.

Utiliser des noms DNS p.googleapis.com

Lorsque vous créez un point de terminaison, l'Annuaire des services crée des enregistrements DNS pour les API et les services couramment utilisés disponibles à l'aide du point de terminaison. Les enregistrements DNS ne sont créés que pour les API et les services dont les noms DNS par défaut se terminent par googleapis.com, et uniquement pour un sous-ensemble de ces API et services.

Les enregistrements DNS sont créés dans une zone privée p.googleapis.com. Les enregistrements pointent vers l'adresse IP du point de terminaison et utilisent le format suivant : SERVICE-ENDPOINT.p.googleapis.com

Par exemple, si le nom de votre point de terminaison est xyz, des enregistrements DNS sont créés pour storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com et d'autres API compatibles.

Les clients pouvant être configurés de manière à utiliser un point de terminaison personnalisé peuvent utiliser les noms DNS p.googleapis.com pour envoyer des requêtes à un point de terminaison.

Consultez la documentation de votre client ou bibliothèque cliente pour en savoir plus sur sa configuration afin d'utiliser des points de terminaison personnalisés. Exemple :

  • Python : vous pouvez configurer api_endpoint dans la section Options client.

  • Go : vous pouvez configurer WithEndpoint dans ClientOptions.

  • .NET : vous pouvez configurer Endpoint dans la classe de compilateur du client.

  • gcloud : vous pouvez configurer api_endpoint_overrides dans la gcloud CLI.

Créer des enregistrements DNS à l'aide de noms DNS par défaut

Vous devez créer des enregistrements DNS pour diriger les noms DNS par défaut des API et des services vers votre point de terminaison dans les cas suivants :

  • Votre client ou votre application ne peuvent pas être configurés pour utiliser un nom DNS p.googleapis.com.

  • Vous devez accéder à un service compatible, mais il n'existe pas de nom DNS p.googleapis.com créé automatiquement pour ce service.

Pour créer des enregistrements DNS pointant vers votre point de terminaison Private Service Connect, procédez comme suit :

  1. Créez une zone DNS pour le domaine que vous devez utiliser (par exemple, googleapis.com ou gcr.io). Envisagez pour cela de créer une zone privée Cloud DNS.

  2. Dans cette zone DNS, procédez comme suit :

    1. Créez un enregistrement A pour le nom de domaine (zone) lui-même, par exemple, googleapis.com ou gcr.io. Faites pointer cet enregistrement A vers l'adresse IP du point de terminaison. Si vous utilisez Cloud DNS, consultez la page Ajouter un enregistrement.

    2. Créez un enregistrement CNAME pour tous les noms d'hôte possibles du domaine supplémentaire en utilisant un astérisque et un point suivi du nom de domaine (zone), par exemple, *.googleapis.com ou *.gcr.io. Faites pointer cet enregistrement CNAME vers l'enregistrement A dans la même zone. Par exemple, faites pointer *.googleapis.com vers googleapis.com ou *.gcr.io vers gcr.io.

Accéder au point de terminaison à partir d'hôtes sur site

Si votre réseau sur site est connecté à un réseau VPC, vous pouvez utiliser Private Service Connect pour accéder aux API et services Google à partir d'hôtes sur site à l'aide de l'adresse IP interne du point de terminaison.

  • Votre réseau sur site doit être connecté à un réseau VPC à l'aide de tunnels Cloud VPN ou de rattachements de VLAN.

  • Le point de terminaison se trouve dans le réseau VPC connecté à votre réseau sur site.

  • Le réseau sur site doit disposer des routes appropriées pour le point de terminaison. Configurez une annonce de routage personnalisée du routeur cloud pour annoncer les routes du point de terminaison sur la session BGP qui gère les routes du tunnel Cloud VPN ou du rattachement de VLAN.

  • Vous devez configurer des systèmes sur site afin qu'ils puissent envoyer des requêtes vers vos zones DNS privées.

    Si vous avez mis en œuvre les zones DNS privées à l'aide de Cloud DNS, procédez comme suit :

Dépannage

Échec de la création de la zone DNS privée

Lorsque vous créez un point de terminaison, une zone DNS de l'Annuaire des services est créée. La création de zone peut échouer pour les raisons suivantes :

  • Vous n'avez pas activé l'API Cloud DNS dans votre projet.

  • Vous ne disposez pas des autorisations nécessaires pour créer une zone DNS de l'annuaire de service.

  • Ce réseau VPC contient une zone DNS portant le même nom de zone.

  • Une zone DNS pour p.googleapis.com existe déjà dans ce réseau VPC.

Des zones en conflit peuvent exister en raison d'une échec de suppression précédente.

Pour créer la zone DNS de l'annuaire de service, procédez comme suit :

  1. Vérifiez que l'API Cloud DNS est activée dans votre projet.

  2. Vérifiez que vous disposez des autorisations nécessaires pour créer la zone DNS de l'annuaire de service :

    • dns.managedZones.create
    • servicedirectory.namespaces.associatePrivateZone
  3. Supprimez la zone DNS.

  4. Créez une zone DNS de l'Annuaire des services reposant sur l'espace de noms de l'Annuaire des services associé à votre point de terminaison.

    Utilisez les valeurs suivantes lorsque vous créez la zone :

    • Nom de la zone : utilisez le même nom de zone que le système utilisé lors de la tentative de création ayant échoué. Le message d'erreur indique le nom de zone utilisé.

    • Nom DNS : p.googleapis.com. (incluez le point final).

    • Espace de noms de l'annuaire de service : recherchez l'espace de noms de l'annuaire de service pour le point de terminaison Private Service Connect que vous avez créé, et utilisez cet espace de noms lorsque vous créez la zone DNS de l'annuaire des services.

    L'espace de noms de l'annuaire des services est au format suivant : goog-psc-NETWORK_NAME-NETWORK_ID.

Échec de la suppression de la zone DNS privée

Lorsque vous supprimez le dernier point de terminaison d'un réseau VPC, la configuration de l'Annuaire des services associée, y compris la zone DNS, est supprimée.

Cette suppression peut échouer pour les raisons suivantes :

  • Vous ne disposez pas des autorisations nécessaires pour supprimer la zone DNS.

  • La zone contient des entrées DNS définies par l'utilisateur qui n'ont pas été créées par l'annuaire des services.

Pour résoudre ce problème, procédez comme suit :

  1. Vérifiez que vous disposez de l'autorisation dns.managedZones.delete. Pour en savoir plus, consultez la page Contrôle des accès dans la documentation Cloud DNS.

  2. Supprimez la zone DNS.