Endereços IP de saída para serviços do App Engine

Os serviços de saída, como as APIs URL Fetch, Sockets e Mail, usam um grande conjunto de endereços IP. Os intervalos de endereços IP neste conjunto estão sujeitos a alterações de rotina. Na verdade, duas chamadas de API sequenciais da mesma aplicação podem parecer ter origem em dois endereços IP diferentes.

Pode encontrar os intervalos de endereços IP atuais para os seus serviços do App Engine com base nas informações de intervalos de IP publicadas pela Google:

  • A Google publica a lista completa de intervalos de IP que disponibiliza aos utilizadores na Internet em goog.json.

  • A Google também publica uma lista de intervalos de endereços IP externos globais e regionais disponíveis para os recursos dos clientes no cloud.json. Google Cloud

Os endereços IP usados pelas APIs e pelos serviços Google enquadram-se na lista de intervalos calculados subtraindo todos os intervalos em cloud.json aos intervalos em goog.json. Estas listas são atualizadas com frequência.

Pode usar o seguinte script Python para criar uma lista de intervalos de endereços IP que incluem os usados pelas APIs e pelos serviços Google.

Para informações sobre a execução deste script, consulte o artigo Como executar.

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