Indirizzi IP in uscita per i servizi App Engine

I servizi in uscita nell'ambiente standard App Engine, come le API URL Fetch, Sockets e Mail, utilizzano un ampio pool di indirizzi IP. Gli intervalli di indirizzi IP in questo pool sono soggetti a modifiche di routine. Infatti, due chiamate API sequenziali dalla stessa applicazione potrebbero sembrare provenire da due indirizzi IP diversi.

Se devi conoscere gli indirizzi IP associati al traffico in uscita dal tuo servizio, puoi trovare gli intervalli di indirizzi IP attuali che includono gli indirizzi IP di App Engine oppure configurare un indirizzo IP statico per il tuo servizio.

Indirizzi IP per i servizi App Engine

Puoi trovare gli intervalli di indirizzi IP attuali per i servizi App Engine utilizzando due file JSON pubblicati da Google:

  • Google pubblica un elenco di indirizzi IP di proprietà di Google in goog.json.

  • Google pubblica anche un elenco di intervalli di indirizzi IP esterni globali e regionali disponibili per le risorse dei clienti' Google Cloud in cloud.json.

Se sottrai tutti gli intervalli in cloud.json da quelli in goog.json, ottieni un ampio insieme di indirizzi IP utilizzati dalle API di Google globali e da altri servizi Google, inclusi i prodotti rivolti ai clienti al di fuori di Google Cloud. Questi elenchi vengono aggiornati di frequente.

Puoi utilizzare il seguente script Python per creare un elenco di intervalli di indirizzi IP che includono quelli utilizzati dalle API di Google e dai servizi.

Per informazioni sull'esecuzione di questo script, consulta la sezione Come eseguire.

from __future__ import print_function

import json

try:
    from urllib import urlopen
except ImportError:
    from urllib.request import urlopen
    from urllib.error import HTTPError

import netaddr

IPRANGE_URLS = {
    "goog": "https://www.gstatic.com/ipranges/goog.json",
    "cloud": "https://www.gstatic.com/ipranges/cloud.json",
}


def read_url(url):
    try:
        return json.loads(urlopen(url).read())
    except (IOError, HTTPError):
        print("ERROR: Invalid HTTP response from %s" % url)
    except json.decoder.JSONDecodeError:
        print("ERROR: Could not parse HTTP response from %s" % url)


def get_data(link):
    data = read_url(link)
    if data:
        print("{} published: {}".format(link, data.get("creationTime")))
        cidrs = netaddr.IPSet()
        for e in data["prefixes"]:
            if "ipv4Prefix" in e:
                cidrs.add(e.get("ipv4Prefix"))
            if "ipv6Prefix" in e:
                cidrs.add(e.get("ipv6Prefix"))
        return cidrs


def main():
    cidrs = {group: get_data(link) for group, link in IPRANGE_URLS.items()}
    if len(cidrs) != 2:
        raise ValueError("ERROR: Could process data from Google")
    print("IP ranges for Google APIs and services default domains:")
    for ip in (cidrs["goog"] - cidrs["cloud"]).iter_cidrs():
        print(ip)


if __name__ == "__main__":
    main()

Configura un indirizzo IP statico in uscita

Per configurare un indirizzo IP statico per il tuo servizio dell'ambiente standard App Engine, utilizza l'accesso VPC serverless con il router Cloud e Cloud NAT. Utilizzando l'accesso VPC serverless, puoi inviare il traffico in uscita alla tua rete Virtual Private Cloud (VPC). Utilizzando un gateway di conversione degli indirizzi di rete (NAT) sul tuo VPC, puoi instradare il traffico di App Engine tramite un indirizzo IP dedicato.

L'instradamento del traffico tramite Cloud NAT non causa un hop aggiuntivo nello stack di rete, poiché il gateway Cloud NAT e il router Cloud forniscono solo un piano di controllo e i pacchetti non passano attraverso il gateway Cloud NAT o il router Cloud.

I seguenti passaggi mostrano come configurare un indirizzo IP statico in uscita per il tuo servizio dell'ambiente standard App Engine.

  1. Assicurati di avere il ruolo roles/compute.networkAdmin o un ruolo personalizzato con le stesse autorizzazioni.

  2. Crea una subnet all'interno della rete VPC per il traffico di App Engine. In questo modo, le altre risorse nella rete VPC non possono utilizzare l'indirizzo IP statico.

    gcloud compute networks subnets create SUBNET_NAME \
        --range=RANGE \
        --network=NETWORK_NAME \
        --region=REGION

    Nel comando precedente, sostituisci:

    • SUBNET_NAME con un nome che vuoi assegnare alla subnet.
    • RANGE con l' intervallo IP in formato CIDR che vuoi assegnare a questa subnet (ad es.10.124.0.0/28).
    • NETWORK_NAME con il nome della tua rete VPC.
    • REGION con la regione del tuo servizio App Engine.
  3. Collega il servizio App Engine alla subnet.

    Segui la guida Connessione a una rete VPC, e specifica il nome della subnet creata nel passaggio precedente per la subnet del connettore.

  4. Crea un nuovo router Cloud. Il router Cloud è un componente del piano di controllo necessario per Cloud NAT.

    gcloud compute routers create ROUTER_NAME \
        --network=NETWORK_NAME \
        --region=REGION

    Nel comando precedente, sostituisci:

    • ROUTER_NAME con un nome per la risorsa router Cloud che vuoi creare.
    • NETWORK_NAME con il nome della tua rete VPC.
    • REGION con la regione in cui vuoi creare un gateway NAT.
  5. Prenota un indirizzo IP statico.

    Questo è l'indirizzo che il tuo servizio utilizzerà per inviare il traffico in uscita. Una risorsa indirizzo IP riservato conserva l'indirizzo IP sottostante quando la risorsa a cui è associata viene eliminata e ricreata. Questo indirizzo IP viene conteggiato ai fini delle quote di indirizzi IP statici nel tuo Google Cloud progetto.

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    Nel comando precedente, sostituisci:

    • ORIGIN_IP_NAME con il nome che vuoi assegnare alla risorsa indirizzo IP.
    • REGION con la regione in cui verrà eseguito il router Cloud NAT. Idealmente la stessa regione del tuo servizio App Engine per ridurre al minimo la latenza e i costi di rete.

    Utilizza il compute addresses describe comando per visualizzare il risultato:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Crea un gateway Cloud NAT e specifica il tuo indirizzo IP.

    Il traffico proveniente dalla tua subnet passerà attraverso questo gateway e utilizzerà l'indirizzo IP statico che hai prenotato nel passaggio precedente.

    gcloud compute routers nats create NAT_NAME \
        --router=ROUTER_NAME \
        --region=REGION \
        --nat-custom-subnet-ip-ranges=SUBNET_NAME \
        --nat-external-ip-pool=ORIGIN_IP_NAME
      

    Nel comando precedente, sostituisci:

    • NAT_NAME con un nome per la risorsa gateway Cloud NAT che vuoi creare.
    • ROUTER_NAME con il nome del tuo router Cloud.
    • REGION con la regione in cui vuoi creare un gateway NAT.
    • ORIGIN_IP_NAME con il nome della risorsa indirizzo IP riservato creata nel passaggio precedente.
  7. Imposta l'impostazione di uscita dell'accesso VPC serverless su all-traffic.

    Per impostazione predefinita, i servizi App Engine che utilizzano l'accesso VPC serverless inviano solo il traffico interno alla rete VPC. Per inviare il traffico con destinazioni esterne alla rete VPC in modo che abbia l'indirizzo IP statico specificato, devi modificare l'impostazione di uscita.

    Specifica l'impostazione di uscita nel app.yaml file per il tuo servizio:

    vpc_access_connector:
    name: projects/PROJECT_ID/locations/REGION/connectors/CONNECTOR_NAME
    egress_setting: all-traffic

    Sostituisci:

    • PROJECT_ID con l'ID del tuo Google Cloud progetto.
    • REGION con la regione in cui si trova il connettore.
    • CONNECTOR_NAME con il nome del connettore.

Esegui il deployment del servizio:

 gcloud app deploy