Adresses IP sortantes pour les services App Engine

Les services sortants, tels que les API URL Fetch, Sockets et Mail, utilisent un vaste pool d'adresses IP. Les plages d'adresses IP de ce pool sont sujettes à des modifications de routine. En effet, deux appels d'API séquentiels provenant de la même application peuvent sembler provenir de deux adresses IP différentes.

Vous pouvez trouver les plages d'adresses IP actuelles des services App Engine en utilisant deux fichiers JSON publiés par Google :

  • Google publie une liste des adresses IP lui appartenant dans goog.json.

  • Google publie également une liste de plages d'adresses IP externes globales et régionales disponibles pour les ressources Google Cloud des clients dans cloud.json.

Si vous supprimez toutes les plages de cloud.json de celles de goog.json, vous obtenez un grand ensemble d'adresses IP utilisées par les API Google mondiales et d'autres services Google, y compris les produits destinés aux clients en dehors de Google Cloud. Ces listes sont mises à jour fréquemment.

Vous pouvez utiliser le script Python suivant pour créer une liste de plages d'adresses IP, incluant celles utilisées par les API et les services Google.

Pour en savoir plus sur l'exécution de ce script, consultez la page Exécuter.

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