Alamat IP keluar untuk layanan App Engine

Layanan keluar, seperti URL-fetch, Sockets, dan Mail API, memanfaatkan sekumpulan besar alamat IP. Rentang alamat IP dalam kumpulan ini dapat berubah secara rutin. Bahkan, dua panggilan API berurutan dari aplikasi yang sama mungkin tampak berasal dari dua alamat IP yang berbeda.

Anda dapat menemukan rentang alamat IP saat ini untuk layanan App Engine Anda berdasarkan informasi rentang IP yang dipublikasikan Google:

  • Google memublikasikan daftar lengkap rentang IP yang disediakannya bagi pengguna di internet di goog.json.

  • Google juga memublikasikan daftar rentang alamat IP eksternal global dan regional yang tersedia untuk resource Google Cloud pelanggan di cloud.json.

Alamat IP yang digunakan oleh Google API dan layanan Google sesuai dengan daftar rentang yang dihitung dengan mengambil semua rentang di cloud.json dari rentang di goog.json. Daftar ini sering diupdate.

Anda dapat menggunakan skrip Python berikut untuk membuat daftar rentang alamat IP yang mencakup rentang alamat IP yang digunakan oleh Google API dan layanan Google.

Untuk informasi tentang cara menjalankan skrip ini, lihat Cara menjalankan.

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