Direcciones IP salientes para servicios de App Engine

Los servicios salientes, como las API de recuperación de URL, Sockets y Correo electrónico, usan un gran conjunto de direcciones IP. Los rangos de direcciones IP en este grupo están sujetos a cambios de rutina. De hecho, puede parecer que dos llamadas a la API secuenciales desde la misma aplicación se originan en dos direcciones IP diferentes.

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

Direcciones IP para servicios de App Engine

Puedes encontrar los rangos de direcciones IP actuales para tus servicios de App Engine en función de la información del rango de IP que Google publica:

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

  • Google también publica una lista de los rangos de direcciones IP externas internacionales y regionales disponibles para los recursos de Google Cloud del cliente en cloud.json.

Las direcciones IP que usan las APIs y los servicios de Google se ajustan a la lista de rangos calculados si se quitan todos los rangos en cloud.json de los que están en goog.json. Estas listas se actualizan con frecuencia.

Puedes usar la siguiente secuencia de comandos de Python para crear una lista de rangos de direcciones IP que incluyan los 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()

Configura una dirección IP saliente estática

A fin de configurar una dirección IP estática para tu servicio de entorno estándar de App Engine, usa el Acceso a VPC sin servidores con Cloud Router y Cloud NAT. Mediante el Acceso a VPC sin servidores, puedes enviar tráfico de salida a la red de nube privada virtual (VPC). Si usas una puerta de enlace 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.

Enrutar el tráfico a través de Cloud NAT no produce un salto adicional en tu pila de herramientas de redes, ya que Cloud Router y la puerta de enlace de Cloud NAT proporcionan solo un plano de control, y los paquetes no pasan por ninguno de ellos.

Las direcciones IP salientes estáticas no se pueden configurar para el tráfico enviado con el servicio de recuperación de URL. El tráfico que se envía mediante el servicio de recuperación de URL seguirá usando el grupo de direcciones IP públicas. Si deseas que todo tu tráfico saliente use una dirección IP estática, inhabilita la recuperación predeterminada de URL mediante el uso de sockets y deja de usar de forma explícita el paquete urlfetch.

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

  1. Asegúrate de tener la función roles/compute.networkAdmin o una función personalizada con los mismos permisos.

  2. Crea una subred dentro de tu red de VPC para el tráfico de App Engine. Esto garantiza que otros recursos de la 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, reemplaza los siguientes valores:

    • SUBNET_NAME por el nombre que deseas darle a la subred
    • RANGE por el rango de IP en formato CIDR que deseas asignar a esta subred (p. ej., 10.124.0.0/28)
    • NETWORK_NAME por el nombre de la red de VPC
    • REGION por la región del servicio de App Engine
  3. Conecta tu servicio de App Engine a la subred.

    Sigue la guía Conéctate a una red de VPC y especifica el nombre de la subred que creaste en el paso anterior para la subred del conector.

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

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

    En el comando anterior, reemplaza los siguientes valores:

    • ROUTER_NAME por un nombre para el recurso de Cloud Router que deseas crear
    • NETWORK_NAME por el nombre de la red de VPC
    • REGION por la región en la que deseas crear una puerta de enlace 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 retiene la dirección IP subyacente cuando el recurso al que está asociado se borra y se vuelve a crear. Esta dirección IP se considera dentro de las cuotas de direcciones IP estáticas de tu proyecto de Google Cloud.

    gcloud compute addresses create ORIGIN_IP_NAME \
        --region=REGION

    En el comando anterior, reemplaza los siguientes valores:

    • ORIGIN_IP_NAME por el nombre que deseas asignar al recurso de dirección IP
    • REGION por la región en la que se ejecutará el router de Cloud NAT. Lo ideal sería que el router esté en la misma región en la que está tu servicio de App Engine para minimizar la latencia y los costos de red.

    Usa el comando compute addresses describe para ver el resultado:

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

    El tráfico que se origina en la subred pasará por esta puerta de enlace y usará la dirección IP estática que reservaste 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, reemplaza los siguientes valores:

    • NAT_NAME por un nombre para el recurso de puerta de enlace de Cloud NAT que deseas crear
    • ROUTER_NAME por el nombre de tu Cloud Router
    • REGION por la región en la que deseas crear una puerta de enlace NAT
    • ORIGIN_IP_NAME por el nombre del recurso de dirección IP reservada que creaste en el paso anterior
  7. Establece el parámetro de configuración de salida del Acceso a VPC sin servidores en all-traffic.

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

    Especifica el parámetro de configuración de salida en el archivo app.yaml del servicio:

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

    Reemplaza lo siguiente:

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

    Implementa el servicio:

     gcloud app deploy