Accesso alle API di Google tramite endpoint

Questo documento spiega come utilizzare gli endpoint Private Service Connect per connetterti alle API di Google. Anziché inviare richieste API agli indirizzi IP disponibili pubblicamente per gli endpoint di servizio come storage.googleapis.com, puoi inviarle all'indirizzo IP interno di un endpoint.

Puoi anche utilizzare Private Service Connect per accedere ai servizi in un'altra rete VPC e pubblicare servizi.

Ruoli

I seguenti ruoli IAM forniscono le autorizzazioni necessarie per eseguire le attività descritte in questa guida.

Attività Ruoli
Creazione di un endpoint Tutti i seguenti ruoli:
Amministratore rete Compute (roles/compute.networkAdmin),
Editor Service Directory (roles/servicedirectory.editor) e
Amministratore DNS (roles/dns.admin)
(Facoltativo) Configurare l'accesso privato Google Amministratore rete Compute (roles/compute.networkAdmin)

Prima di iniziare

  • Per saperne di più, inclusa la configurazione DNS e le limitazioni, consulta l'articolo Informazioni sulla connessione alle API di Google tramite endpoint.

  • Private Service Connect non abilita automaticamente alcuna API. Devi abilitare separatamente le API di Google che devi utilizzare dalla pagina API e servizi nella console Google Cloud.

  • Devi enable l'API Compute Engine nel tuo progetto.

  • Devi enable l'API Service Directory nel tuo progetto.

  • Devi enable l'API Cloud DNS nel tuo progetto.

  • Devi scegliere un indirizzo IP da utilizzare per l'endpoint. Per informazioni sugli indirizzi IP che puoi utilizzare, consulta Requisiti per gli indirizzi IP.

  • Le regole firewall in uscita devono consentire il traffico verso l'endpoint. La configurazione predefinita del firewall per una rete VPC consente questo traffico, perché contiene una regola di autorizzazione in uscita implicita. Verifica di non aver creato una regola in uscita a priorità più elevata che blocca il traffico.

  • Le istanze di macchine virtuali (VM) senza un indirizzo IP esterno assegnato devono utilizzare una subnet con accesso privato Google abilitato per accedere alle API e ai servizi Google utilizzando un endpoint.

    Una VM con un indirizzo IP esterno può accedere alle API e ai servizi Google utilizzando gli endpoint anche se l'accesso privato Google è disabilitato per la relativa subnet. La connettività all'endpoint rimane all'interno della rete Google.

  • Se la tua rete VPC non contiene endpoint, controlla se esiste una zona privata di Cloud DNS per p.googleapis.com. Se la zona esiste, eliminala prima di creare l'endpoint. Se non la elimini, la creazione della zona DNS di Service Directory utilizzata per Private Service Connect non va a buon fine. Per ulteriori informazioni, consulta la sezione Risoluzione dei problemi.

  • Gli endpoint non sono accessibili dalle reti VPC in peering.

Abilitare l'accesso privato Google per una subnet

Le VM senza un indirizzo IP esterno assegnato devono essere connesse a una subnet con accesso privato Google abilitato per accedere alle API e ai servizi Google utilizzando un endpoint.

Se la VM ha più di un'interfaccia, connetti l'interfaccia configurata con una route predefinita (di solito nic0).

L'indirizzo IP di origine dei pacchetti inviati dalla VM deve corrispondere all'indirizzo IPv4 interno principale dell'interfaccia VM o a un indirizzo IPv4 interno di un intervallo IP alias.

Per abilitare l'accesso privato Google su una subnet, segui questi passaggi.

Console

  1. Nella console Google Cloud, vai alla pagina Reti VPC.

    Vai a Reti VPC

  2. Fai clic sul nome della rete che contiene la subnet per cui devi abilitare l'accesso privato Google.

  3. Fai clic sul nome della subnet. Viene visualizzata la pagina Dettagli subnet.

  4. Fai clic su Modifica.

  5. Nella sezione Accesso privato Google, seleziona On.

  6. Fai clic su Salva.

gcloud

  1. Determina il nome e la regione della subnet. Per elencare le subnet per una determinata rete, utilizza il seguente comando:

    gcloud compute networks subnets list --filter=NETWORK_NAME
    
  2. Esegui questo comando per abilitare l'accesso privato Google:

    gcloud compute networks subnets update SUBNET_NAME \
    --region=REGION \
    --enable-private-ip-google-access
    
  3. Verifica che l'accesso privato Google sia abilitato eseguendo questo comando:

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

Sostituisci quanto segue:

  • SUBNET_NAME: il nome della subnet
  • REGION: la regione della subnet
  • NETWORK_NAME: il nome della rete VPC che contiene la subnet

Terraform

Puoi utilizzare la risorsa Terraform per abilitare l'accesso privato Google su una subnet.

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
}

Per scoprire come applicare o rimuovere una configurazione Terraform, consulta Comandi Terraform di base.

Creazione di un endpoint

Dopo aver scelto un indirizzo IP che soddisfa i requisiti, puoi creare un endpoint.

Un endpoint si connette alle API e ai servizi Google usando una regola di forwarding globale. Ogni regola di forwarding viene conteggiata ai fini della quota di rete VPC di Private Service Connect.

Non puoi aggiornare un endpoint per le API e i servizi Google dopo la sua creazione. Se devi aggiornare un endpoint per le API e i servizi Google, elimina l'endpoint e creane uno nuovo.

Console

  1. Nella console Google Cloud, vai alla pagina Private Service Connect.

    Vai a Private Service Connect

  2. Fai clic sulla scheda Endpoint collegati.

  3. Fai clic su Connetti endpoint.

  4. Per Target, seleziona il bundle API target che vuoi utilizzare:

    • Tutte le API di Google
    • VPC-SC
  5. In Nome endpoint, inserisci un nome per l'endpoint.

  6. Seleziona una rete per l'endpoint.

  7. Seleziona un indirizzo IP per l'endpoint.

    L'indirizzo IP deve soddisfare questi requisiti.

    Se hai bisogno di un nuovo indirizzo IP, puoi crearne uno:

    1. Fai clic su Crea indirizzo IP.
    2. Inserisci un nome e una descrizione per l'indirizzo IP.
    3. Inserisci l'indirizzo IP che vuoi utilizzare e fai clic su Salva .
  8. Se una regione Service Directory non è già configurata per questa rete VPC, seleziona quella che vuoi utilizzare.

    Tutti gli endpoint utilizzati per accedere alle API e ai servizi Google in una determinata rete VPC utilizzano la stessa regione di Service Directory.

  9. Se non è già configurato uno spazio dei nomi di Service Directory per questa rete VPC, configura lo spazio dei nomi che vuoi utilizzare:

    • Per utilizzare uno spazio dei nomi assegnato automaticamente, fai clic sul menu a discesa Spazio dei nomi e seleziona lo spazio dei nomi assegnato automaticamente.

    • Per selezionare uno spazio dei nomi esistente che viene utilizzato in un'altra rete, fai clic sul menu a discesa Spazio dei nomi e seleziona uno spazio dei nomi dall'elenco. L'elenco mostra tutti gli spazi dei nomi nel progetto. Devi selezionare uno spazio dei nomi utilizzato solo per gli endpoint utilizzati per accedere alle API di Google.

    • Per creare un nuovo spazio dei nomi, fai clic sul menu a discesa Spazio dei nomi e poi su Crea spazio dei nomi. Inserisci lo spazio dei nomi e fai clic su Crea.

    Tutti gli endpoint che utilizzi per accedere alle API e ai servizi Google in una determinata rete VPC utilizzano lo stesso spazio dei nomi Service Directory.

  10. Fai clic su Aggiungi endpoint.

gcloud

  1. Prenota un indirizzo IP interno globale da assegnare all'endpoint.

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

    Sostituisci quanto segue:

    • ADDRESS_NAME: il nome da assegnare all'indirizzo IP riservato.

    • ENDPOINT_IP: l'indirizzo IP da prenotare per l'endpoint.

      L'indirizzo IP deve soddisfare questi requisiti.

    • NETWORK_NAME: il nome della rete VPC dell'endpoint.

  2. Creare una regola di forwarding per connettere l'endpoint alle API e ai servizi 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 ]
    

    Sostituisci quanto segue:

    • ENDPOINT_NAME: il nome da assegnare all'endpoint. Il nome deve essere una stringa di 1-20 caratteri contenente solo lettere minuscole e numeri. Il nome deve iniziare con una lettera.

    • NETWORK_NAME: il nome della rete VPC dell'endpoint.

    • ADDRESS_NAME: il nome dell'indirizzo riservato sulla rete associata.

    • API_BUNDLE: il pacchetto di API da rendere disponibili tramite l'endpoint. Consulta l'elenco delle API supportate.

      • Usa all-apis per concedere l'accesso a tutte le API supportate.

      • Utilizza vpc-sc per limitare l'accesso alle API di Google che supportano i Controlli di servizio VPC.

    • REGION_NAMESPACE_URI: l'URI della regione o spazio dei nomi di Service Directory che vuoi utilizzare. Questo URI deve fare riferimento allo stesso progetto in cui stai creando l'endpoint.

      • Puoi definire una regione solo con projects/PROJECT_NAME/locations/REGION.

      • Puoi definire una regione e uno spazio dei nomi con projects/PROJECT_NAME/locations/REGION/namespaces/NAMESPACE.

      Se ometti completamente --service-directory-registration o imposti una regione senza uno spazio dei nomi, si verifica quanto segue:

      • Se per questa rete VPC è già configurata una regione o uno spazio dei nomi, vengono utilizzati i valori predefiniti.

      • Se una regione non è configurata, viene impostata su us-central1. Se non viene configurato uno spazio dei nomi, viene assegnato uno spazio dei nomi generato dal sistema.

API

  1. Prenota un indirizzo IP interno globale da assegnare all'endpoint.

    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
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.

    • ADDRESS_NAME: il nome da assegnare all'indirizzo IP riservato.

    • ENDPOINT_IP: l'indirizzo IP da prenotare per l'endpoint.

      L'indirizzo IP deve soddisfare questi requisiti.

    • NETWORK_URL: la rete VPC per l'endpoint. Usa il metodo network.list o gcloud compute networks list --uri per trovare gli URL delle tue reti.

  2. Creare una regola di forwarding per connettere l'endpoint alle API e ai servizi 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"
    
       }
     ],
    }
    

    Sostituisci quanto segue:

    • PROJECT_ID: il tuo ID progetto.

    • ENDPOINT_NAME: il nome da assegnare all'endpoint. Il nome deve essere una stringa di 1-20 caratteri contenente solo lettere minuscole e numeri. Il nome deve iniziare con una lettera.

    • NETWORK_URL: la rete VPC per l'endpoint. Usa il metodo network.list o gcloud compute networks list --uri per trovare gli URL delle tue reti.

    • ADDRESS_URL: l'URL dell'indirizzo riservato sulla rete associata. Usa il metodo globaleAddresses.list o gcloud compute addresses list --uri per trovare gli URL dei tuoi indirizzi riservati.

    • API_BUNDLE: il bundle di API da rendere disponibili tramite l'endpoint. Consulta l'elenco delle API supportate.

      • Usa all-apis per concedere l'accesso a tutte le API supportate.

      • Utilizza vpc-sc per limitare l'accesso alle API di Google che supportano i Controlli di servizio VPC.

    • REGION: la regione di Service Directory che vuoi utilizzare. Ad esempio: us-central1. Se ometti REGION e una regione è già configurata per questa rete VPC, viene utilizzata quella regione. Se una regione non è configurata, quella è impostata su us-central1.

    • NAMESPACE: il nome dello spazio dei nomi di Service Directory che vuoi utilizzare. Se ometti NAMESPACE e per questa rete VPC è già configurato uno spazio dei nomi, verrà utilizzato questo spazio dei nomi. Se uno spazio dei nomi non è configurato, viene assegnato uno spazio dei nomi generato dal sistema.

Terraform

Puoi utilizzare le seguenti risorse Terraform per creare un endpoint:

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

Verifica che l'endpoint funzioni

Crea un'istanza VM nella rete VPC in cui è configurato Private Service Connect. Esegui questo comando sulla VM per verificare che l'endpoint Private Service Connect funzioni. Gli endpoint non rispondono alle richieste di ping (ICMP).

curl -v ENDPOINT_IP/generate_204

Sostituisci ENDPOINT_IP con l'indirizzo IP dell'endpoint.

Se l'endpoint funziona, viene visualizzato un codice di risposta HTTP 204.

Elenco endpoint

Puoi elencare tutti gli endpoint configurati.

Console

  1. Nella console Google Cloud, vai alla pagina Private Service Connect.

    Vai a Private Service Connect

  2. Fai clic sulla scheda Endpoint collegati.

    Gli endpoint sono visualizzati.

gcloud

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

L'output è simile al seguente:

NAME  REGION  IP_ADDRESS  IP_PROTOCOL  TARGET
RULE          IP          TCP          all-apis

recupera informazioni su un endpoint

Puoi visualizzare tutti i dettagli di configurazione di un endpoint.

Console

  1. Nella console Google Cloud, vai alla pagina Private Service Connect.

    Vai a Private Service Connect

  2. Fai clic sulla scheda Endpoint collegati.

    Gli endpoint vengono visualizzati.

  3. Fai clic sull'endpoint di cui vuoi visualizzare i dettagli.

gcloud

gcloud compute forwarding-rules describe \
    ENDPOINT_NAME --global

Etichetta un endpoint

Puoi gestire le etichette per gli endpoint. Per ulteriori informazioni, consulta la pagina relativa alle risorse di etichettatura.

Eliminazione di un endpoint

Puoi eliminare un endpoint.

Console

  1. Nella console Google Cloud, vai alla pagina Private Service Connect.

    Vai a Private Service Connect

  2. Fai clic sulla scheda Endpoint collegati.

  3. Seleziona l'endpoint che vuoi eliminare e fai clic su Elimina.

gcloud

    gcloud compute forwarding-rules delete \
        ENDPOINT_NAME --global

Sostituisci ENDPOINT_NAME con il nome dell'endpoint che vuoi eliminare.

Utilizza un endpoint

Per utilizzare un endpoint, invii richieste a un nome host DNS che si risolve nell'indirizzo IP dell'endpoint.

  • Puoi utilizzare i nomi DNS p.googleapis.com creati automaticamente se puoi configurare i tuoi client per l'utilizzo di un endpoint personalizzato e se vengono creati record DNS p.googleapis.com per le API e i servizi che vuoi utilizzare. Per ulteriori informazioni, consulta la sezione Utilizzare i nomi DNS p.googleapis.com.

    Ad esempio, se il nome del tuo endpoint è xyz, nel bundle API vengono creati record DNS per storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com e altre API di uso comune.

  • Puoi creare record DNS utilizzando i nomi DNS predefiniti se utilizzi un client non configurato per l'utilizzo di un endpoint personalizzato o se non esiste un record DNS p.googleapis.com per il servizio che vuoi utilizzare. Per maggiori informazioni, consulta Creare record DNS utilizzando nomi DNS predefiniti.

    Ad esempio, crea i record DNS per storage.googleapis.com e compute.googleapis.com.

Utilizza p.googleapis.com nomi DNS

Quando crei un endpoint, Service Directory crea record DNS per le API e i servizi di uso comune disponibili tramite l'endpoint. I record DNS vengono creati solo per le API e i servizi che hanno nomi DNS predefiniti che terminano con googleapis.com e solo per un sottoinsieme di queste API e questi servizi.

I record DNS vengono creati in una zona privata p.googleapis.com. I record puntano all'indirizzo IP dell'endpoint e utilizzano questo formato: SERVICE-ENDPOINT.p.googleapis.com

Ad esempio, se il nome dell'endpoint è xyz, vengono creati record DNS per storage-xyz.p.googleapis.com, compute-xyz.p.googleapis.com e altre API supportate.

I client che possono essere configurati per l'utilizzo di un endpoint personalizzato possono utilizzare i nomi DNS p.googleapis.com per inviare richieste a un endpoint.

Consulta la documentazione della tua libreria client o client per informazioni su come configurarla per l'utilizzo di endpoint personalizzati. Ad esempio:

  • Python: puoi configurare api_endpoint in Opzioni client.

  • Vai: puoi configurare WithEndpoint in ClientOptions.

  • .NET: puoi configurare Endpoint nella classe del builder del client.

  • gcloud: puoi configurare api_endpoint_overrides in gcloud CLI.

Creare record DNS utilizzando nomi DNS predefiniti

Devi creare record DNS per indirizzare i nomi DNS predefiniti per le API e i servizi al tuo endpoint in queste circostanze:

  • Il client o l'applicazione non possono essere configurati per l'utilizzo di un nome DNS p.googleapis.com.

  • Devi accedere a un servizio supportato, ma non esiste un nome DNS p.googleapis.com creato automaticamente per quel servizio.

Per creare record DNS che puntino al tuo endpoint Private Service Connect, segui queste istruzioni:

  1. Crea una zona DNS per il dominio che devi utilizzare (ad esempio, googleapis.com o gcr.io). A questo scopo, valuta la possibilità di creare una zona privata di Cloud DNS.

  2. In questa zona DNS:

    1. Crea un record A per il nome del dominio (zona), ad esempio googleapis.com o gcr.io. Punta questo record A sull'indirizzo IP dell'endpoint. Se utilizzi Cloud DNS, consulta l'articolo sull'aggiunta di un record.

    2. Crea un record CNAME per tutti i possibili nomi host del dominio aggiuntivo utilizzando un asterisco e un punto seguiti dal nome del dominio (zona), ad esempio *.googleapis.com o *.gcr.io. Indirizza questo record CNAME al record A nella stessa zona. Ad esempio, posiziona il puntatore *.googleapis.com su googleapis.com o *.gcr.io su gcr.io.

Accedi all'endpoint da host on-premise

Se la tua rete on-premise è connessa a una rete VPC, puoi utilizzare Private Service Connect per accedere alle API e ai servizi Google da host on-premise utilizzando l'indirizzo IP interno dell'endpoint.

  • La rete on-premise deve essere connessa a una rete VPC tramite tunnel Cloud VPN o collegamenti VLAN.

  • L'endpoint si trova nella rete VPC connessa alla rete on-premise.

  • La rete on-premise deve avere route appropriate per l'endpoint. Configura un pubblicità personalizzata delle route del router Cloud per annunciare le route per l'endpoint nella sessione BGP che gestisce le route per il tunnel Cloud VPN o il collegamento VLAN.

  • Devi configurare i sistemi on-premise in modo che possano eseguire query sulle tue zone DNS private.

    Se hai implementato le zone DNS private utilizzando Cloud DNS, completa questi passaggi:

Risoluzione dei problemi

Creazione della zona DNS privata non riuscita

Quando crei un endpoint, viene creata una zona DNS di Service Directory. La creazione della zona può non riuscire per i seguenti motivi:

  • Non hai abilitato l'API Cloud DNS nel progetto.

  • Non hai le autorizzazioni necessarie per creare una zona DNS di Service Directory.

  • In questa rete VPC esiste una zona DNS con lo stesso nome di zona.

  • Esiste già una zona DNS per p.googleapis.com in questa rete VPC.

Potrebbero esistere zone in conflitto a causa di un'eliminazione non riuscita precedente.

Per creare la zona DNS di Service Directory:

  1. Verifica che l'API Cloud DNS sia abilitata nel tuo progetto.

  2. Verifica di disporre delle autorizzazioni necessarie per creare la zona DNS di Service Directory:

    • dns.managedZones.create
    • servicedirectory.namespaces.associatePrivateZone
  3. Elimina la zona DNS.

  4. Crea una zona DNS di Service Directory supportata dallo spazio dei nomi di Service Directory associato al tuo endpoint.

    Quando crei la zona, utilizza i valori seguenti:

    • Nome zona: usa lo stesso nome della zona usato dal sistema durante il tentativo di creazione non riuscito. Il messaggio di errore mostra il nome della zona utilizzato.

    • Nome DNS: p.googleapis.com. (incluso il punto finale).

    • Spazio dei nomi Service Directory: trova lo spazio dei nomi Service Directory per l'endpoint Private Service Connect che hai creato e utilizza questo spazio dei nomi quando crei la zona DNS di Service Directory.

    Lo spazio dei nomi di Service Directory ha il seguente formato: goog-psc-NETWORK_NAME-NETWORK_ID.

Eliminazione della zona DNS privata non riuscita

Quando elimini l'ultimo endpoint in una rete VPC, viene eliminata la configurazione di Service Directory associata, inclusa la zona DNS.

Questa eliminazione può non riuscire per i seguenti motivi:

  • Non hai le autorizzazioni necessarie per eliminare la zona DNS.

  • La zona contiene voci DNS definite dall'utente che non sono state create da Service Directory.

Per risolvere il problema:

  1. Verifica di avere l'autorizzazione dns.managedZones.delete. Per ulteriori informazioni, consulta Controllo degli accessi nella documentazione di Cloud DNS.

  2. Elimina la zona DNS.