Direcciones IP de salida de los servicios de App Engine

Los servicios salientes, como las APIs URL Fetch, Sockets y Mail, utilizan un gran conjunto de direcciones IP. Los intervalos de direcciones IP de este grupo están sujetos a cambios rutinarios. De hecho, puede parecer que dos llamadas a la API secuenciales de la misma aplicación proceden de dos direcciones IP diferentes.

Si necesitas saber las direcciones IP asociadas al tráfico saliente de tu servicio, puedes buscar los intervalos de direcciones IP actuales de tu servicio o configurar una dirección IP estática para tu servicio.

Direcciones IP de los servicios de App Engine

Puedes consultar los intervalos de direcciones IP actuales de tus servicios de App Engine en la información sobre intervalos de IP que publica Google:

  • Google publica la lista completa de intervalos de direcciones IP que pone a disposición de los usuarios en Internet en goog.json.

  • Google también publica una lista de intervalos de direcciones IP externas globales y regionales disponibles para los recursos de los clientes en cloud.json. Google Cloud

Las direcciones IP que usan las APIs y los servicios de Google se obtienen a partir de la confluencia entre estas dos fuentes, restando los intervalos de cloud.json de los de goog.json. Estas listas se actualizan con frecuencia.

Puedes usar la siguiente secuencia de comandos de Python para crear una lista de intervalos de direcciones IP que incluya las que usan las APIs y los servicios de Google.

Para obtener información sobre cómo ejecutar esta secuencia de comandos, consulta Cómo ejecutar.

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()

Configurar una dirección IP de salida estática

Para configurar una dirección IP estática para tu servicio del entorno estándar de App Engine, usa Acceso a VPC sin servidor con Cloud Router y Cloud NAT. Con Acceso a VPC sin servidor, puedes enviar tráfico de salida a tu red de nube privada virtual (VPC). Si usas una pasarela de traducción de direcciones de red (NAT) en tu VPC, puedes enrutar el tráfico de App Engine a través de una dirección IP dedicada.

El enrutamiento del tráfico a través de Cloud NAT no provoca un salto adicional en tu pila de redes, ya que la pasarela de Cloud NAT y Cloud Router solo proporcionan un plano de control y los paquetes no pasan por la pasarela de Cloud NAT ni por Cloud Router.

No se pueden configurar direcciones IP de salida estáticas para el tráfico enviado mediante el servicio de obtención de URLs. El tráfico enviado mediante el servicio URL Fetch seguirá usando el grupo de direcciones IP públicas. Si quieres que todo tu tráfico saliente use una dirección IP estática, inhabilita el valor predeterminado de URL Fetch y deja de usar explícitamente la biblioteca urlfetch.

En los siguientes pasos se muestra cómo configurar una dirección IP saliente estática para tu servicio del entorno estándar de App Engine.

  1. Asegúrate de tener el rol roles/compute.networkAdmin o un rol personalizado con los mismos permisos.

  2. Crea una subred en tu red de VPC para el tráfico de App Engine. De esta forma, te aseguras de que otros recursos de tu red de VPC no puedan usar la dirección IP estática.

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

    En el comando anterior, sustituye lo siguiente:

    • SUBNET_NAME con el nombre que quieras asignar a la subred.
    • RANGE con el intervalo de IPs en formato CIDR que quieras asignar a esta subred (por ejemplo, 10.124.0.0/28).
    • NETWORK_NAME con el nombre de tu red de VPC.
    • REGION con la región de tu servicio de App Engine.
  3. Conecta tu servicio de App Engine a la subred.

    Sigue la guía Conectarse a una red de VPC y especifica el nombre de la subred que has creado en el paso anterior para la subred del conector.

  4. Crea un router de Cloud. Cloud Router es un componente del plano de control necesario para Cloud NAT.

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

    En el comando anterior, sustituye lo siguiente:

    • ROUTER_NAME con el nombre del recurso de Cloud Router que quieras crear.
    • NETWORK_NAME con el nombre de tu red de VPC.
    • REGION por la región en la que quieras crear una pasarela de NAT.
  5. Reserva una dirección IP estática.

    Esta es la dirección que usará tu servicio para enviar tráfico saliente. Un recurso de dirección IP reservada conserva la dirección IP subyacente cuando se elimina y se vuelve a crear el recurso al que está asociado. Esta dirección IP se tiene en cuenta en las cuotas de direcciones IP estáticas de tu Google Cloud proyecto.

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    En el comando anterior, sustituye lo siguiente:

    • ORIGIN_IP_NAME con el nombre que quieras asignar al recurso de dirección IP.
    • REGION con la región en la que se ejecutará el router de Cloud NAT. Lo ideal es que sea la misma región que tu servicio de App Engine para minimizar la latencia y los costes de red.

    Usa el comando compute addresses describe para ver el resultado:

    gcloud compute addresses describe ORIGIN_IP_NAME
  6. Crea una pasarela de Cloud NAT y especifica tu dirección IP.

    El tráfico procedente de tu subred pasará por esta pasarela y usará la dirección IP estática que has reservado en el paso anterior.

    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
      

    En el comando anterior, sustituye lo siguiente:

    • NAT_NAME con el nombre del recurso de pasarela Cloud NAT que quieras crear.
    • ROUTER_NAME con el nombre de tu Cloud Router.
    • REGION por la región en la que quieras crear una pasarela de NAT.
    • ORIGIN_IP_NAME con el nombre del recurso de dirección IP reservada que has creado en el paso anterior.
  7. Define el ajuste de salida de Acceso a VPC sin servidor en all-traffic.

    De forma predeterminada, los servicios de App Engine que usan Acceso a VPC sin servidor solo envían tráfico interno a tu red de VPC. Para enviar tráfico con destinos externos a tu red de VPC de forma que tenga la dirección IP estática que has especificado, debes cambiar el ajuste de salida.

    Especifica el ajuste de salida en el archivo app.yaml de tu servicio:

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

    Sustituye:

    • PROJECT_ID por el ID de tu proyecto. Google Cloud
    • REGION con la región en la que se encuentra tu conector.
    • CONNECTOR_NAME con el nombre del conector.

    Despliega el servicio:

     gcloud app deploy