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 serviços do App Engine através de dois ficheiros JSON publicados pela Google:

  • A Google publica uma lista de endereços IP pertencentes à Google 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 em cloud.json. Google Cloud

A remoção de todos os intervalos em cloud.json dos intervalos em goog.json resulta num grande conjunto de endereços IP usados pelas APIs Google globais e outros serviços Google, incluindo produtos virados para o cliente fora de Google Cloud. 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()