App Engine サービス用の送信 IP アドレス

URL Fetch API、Sockets API、Mail API などのアウトバウンド サービスは、IP アドレスの大きなプールを利用します。このプールの IP アドレス範囲は、定期的な変更の対象です。実際、同じアプリからの 2 つの連続した API 呼び出しは、2 つの異なる IP アドレスから発生したように見えることがあります。

App Engine サービスの現在の IP アドレス範囲は、Google が公開している IP 範囲情報に基づいて確認できます。

  • Google では、インターネット上でユーザーが使用できる IP 範囲の完全なリストを goog.json で公開しています。

  • また、お客様の Google Cloud リソースで使用可能なグローバルとリージョンの外部 IP アドレス範囲のリストを cloud.json に公開しています。

Google API とサービスで使用される IP アドレスは、goog.json の範囲から cloud.json のすべての範囲を除いて計算された範囲のリスト内に収まります。このリストは頻繁に更新されます。

次の Python スクリプトを使用して、Google API とサービスで使用されている IP アドレス範囲のリストを作成できます。

このスクリプトの実行については、実行方法をご覧ください。

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