外部 IP アドレスを持つ VM から API にアクセスする

このページに記載されているネットワーク要件が満たされている場合、ネットワーク インターフェースに割り振られた外部 IP アドレスを持つ仮想マシン(VM)インスタンスは Google API とサービスに接続できます。接続は VM の外部 IP アドレスから行われますが、トラフィックは Google Cloud 内にとどまり、公共のインターネットを介して送信されません。

ネットワーク要件

外部 IP アドレスを持つ VM から Google API とサービスにアクセスするには、次の要件を満たす必要があります。

  • Google Cloud Console の [API とサービス] ページで、使用する Google API を有効にする必要があります。

  • private.googleapis.com または restricted.googleapis.com ドメイン名を使用する場合、これらのドメインに関連付けられた IP アドレスにトラフィックを転送する DNS レコードを作成する必要があります。詳しくは、ネットワーク構成をご覧ください。

  • ネットワークには、Google API とサービスで使用される宛先 IP 範囲に適したルートが必要です。このルートでは、デフォルトのインターネット ゲートウェイのネクストホップを使用する必要があります。private.googleapis.com または restricted.googleapis.com ドメイン名を使用する場合、ドメインごとに 1 つのルートのみが必要です。それ以外の場合は、複数のルートを作成する必要があります。詳細については、ルーティング オプションをご覧ください。

  • 下り(外向き)ファイアウォールでは、Google API とサービスによって使用される IP アドレス範囲へのトラフィックを許可する必要があります。暗黙の下り(外向き)許可ファイアウォール ルールがこの要件を満たしています。ファイアウォールの要件を満たすその他の方法については、ファイアウォールの構成をご覧ください。

ネットワークの構成

このセクションでは、VPC ネットワーク内の VM が Google API とサービスにアクセスするために必要な基本的なネットワーク要件について説明します。

まず、Google API とサービスにアクセスするドメインを選択します。

private.googleapis.com VIP と restricted.googleapis.com VIP は、TCP 上の HTTP ベースのプロトコル(HTTP、HTTPS、HTTP/2)のみをサポートします。MQTT や ICMP などの他のプロトコルはサポートされていません。

ドメインと IP アドレス範囲 サポート対象のサービス 使用例
デフォルト ドメイン

private.googleapis.comrestricted.googleapis.com を除く、Google API とサービスのすべてのドメイン名。

さまざまな IP アドレス範囲 - デフォルト ドメインの IP アドレスを参照することにより、デフォルト ドメインで使用される可能性のあるアドレスを含む IP 範囲のセットを決定できます。
VPC Service Controls でサポートされているかどうかにかかわらず、ほとんどの Google API とサービスへの API アクセスを有効にします。これには、マップ、Google 広告、Google Cloud Platform への API アクセスが含まれます。Google Workspace とその他のウェブ アプリケーションも含まれます。 デフォルトのドメインは、private.googleapis.comrestricted.googleapis.com の DNS レコードを構成していない場合に使用されます。
private.googleapis.com

199.36.153.8/30
VPC Service Controls でサポートされているかどうかにかかわらず、ほとんどの Google API とサービスへの API アクセスを有効にします。マップ、Google 広告、Google Cloud、以下のリストを含むその他のほとんどの Google API への API アクセスが含まれます。Google Workspace ウェブ アプリケーションはサポートされていません。インタラクティブなウェブサイトには対応していません。

一致するドメイン名:
  • accounts.google.com(OAuth 認証に必要なパスのみ)
  • appengine.google.com
  • *.appspot.com
  • *.cloudfunctions.net
  • *.cloudproxy.app
  • *.composer.cloud.google.com
  • *.composer.googleusercontent.com
  • *.datafusion.cloud.google.com
  • *.datafusion.googleusercontent.com
  • dl.google.com
  • gcr.io または *.gcr.io
  • *.googleadapis.com
  • *.googleapis.com
  • *.gstatic.com
  • *.ltsapis.goog
  • *.notebooks.cloud.google.com
  • *.notebooks.googleusercontent.com
  • packages.cloud.google.com
  • pkg.dev または *.pkg.dev
  • pki.goog または *.pki.goog
  • *.run.app
  • source.developers.google.com

private.googleapis.com を使用して、Google Cloud 内からのみルーティング可能な一連の IP アドレスを使用して Google API とサービスにアクセスします。

次の状況では private.googleapis.com を選択します。

  • VPC Service Controls を使用しない。
  • VPC Service Controls を使用するものの、VPC Service Controls でサポートされていない Google API とサービスにもアクセスする必要がある。

restricted.googleapis.com

199.36.153.4/30
VPC Service Controls でサポートされている Google API およびサービスへの API アクセスを有効にします。

VPC Service Controls をサポートしていない Google API とサービスへのアクセスをブロックします。Google Workspace ウェブ アプリケーションと Google Workspace API はサポートされていません。

restricted.googleapis.com を使用して、Google Cloud 内からのみルーティング可能な一連の IP アドレスを使用して Google API とサービスにアクセスします。

VPC Service Controls でサポートされている Google API とサービスにアクセスする必要がある場合にのみ restricted.googleapis.com を選択します。restricted.googleapis.com は VPC Service Controls をサポートしていない Google API とサービスへのアクセスを許可しません。

DNS 構成

private.googleapis.com または restricted.googleapis.com を選択した場合は、VPC ネットワーク内の VM が *.googleapis.com へのリクエストを解決できるように DNS を構成する必要があります。

  1. googleapis.com の限定公開 DNS ゾーンを作成します。その場合は、Cloud DNS 限定公開ゾーンの作成を検討してください。
  2. 選択したドメインに応じて、googleapis.com ゾーンで次のいずれかの A レコードを作成します。

    • 次の IP アドレスを指す private.googleapis.comA レコード: 199.36.153.8199.36.153.9199.36.153.10199.36.153.11
    • 次の IP アドレスを指す restricted.googleapis.comA レコード: 199.36.153.4199.36.153.5199.36.153.6199.36.153.7

    Cloud DNS を使用している場合は、googleapis.com 限定公開ゾーンにレコードを追加します。

  3. googleapis.com ゾーンで、前の手順で作成した A レコードを指す *.googleapis.comCNAME レコードを作成します。

一部の Google API とサービスは、*.gcr.io*.gstatic.compki.goog などの追加ドメイン名を使用して提供されます。追加のドメインのサービスに private.googleapis.com または restricted.googleapis.com を使用してアクセスできるかどうかを判断するため、ネットワークの要件のドメインと IP アドレス範囲の表を参照します。それぞれの追加ドメインについて、次の作業を行います。

  1. 追加のドメインの DNS ゾーンを作成します(例: gcr.io)。Cloud DNS を使用している場合は、このゾーンが googleapis.com 限定公開ゾーンと同じプロジェクトにあることを確認してください。
  2. この DNS ゾーンで次のことを行います。
    • ドメイン(ゾーン)名自体の A レコード(例: gcr.io)を作成します。この A レコードが、選択したカスタム ドメイン名(private.googleapis.com または restricted.googleapis.com)の 4 つの同じ IP アドレスを指すようにします。
    • アスタリスクとドットに続くドメイン(ゾーン)名を使用して、可能性のあるすべての追加ドメインのホスト名に対する CNAME レコードを作成します(例: *.gcr.io)。この CNAME レコードが、同じゾーンの A レコードを指すようにします。たとえば、*.gcr.iogcr.io を指します。

ルーティング オプション

VPC ネットワークには、ネクストホップがデフォルトのインターネット ゲートウェイである適切なルートが必要です。Google Cloud は、他の VM インスタンスまたはカスタム ネクストホップを介した Google API とサービスへのトラフィックのルーティングをサポートしていません。デフォルトのインターネット ゲートウェイと呼ばれてはいますが、VPC ネットワーク内の VM から Google API とサービスに送信されるパケットは、Google のネットワーク内に残ります。

  • デフォルト ドメインを選択した場合、VM インスタンスは Google の外部 IP アドレスのサブセットを使用して Google API とサービスに接続します。この IP アドレスは一般公開され、ルーティング可能ですが、VPC ネットワーク内の VM からこれらのアドレスへのパスが Google のネットワーク内に残ります。

  • Google は、private.googleapis.com ドメインまたは restricted.googleapis.com ドメインで使用されているいずれの IP アドレス範囲のインターネット上のルートも公開していません。したがって、こうしたドメインにアクセスできるのは、VPC ネットワーク内の VM または VPC ネットワークに接続されているオンプレミス システムの場合のみです。

ネクストホップがデフォルトのインターネット ゲートウェイであるデフォルト ルートが VPC ネットワークに含まれている場合、そのルートを使用すると、カスタムルートを作成しなくても、どのドメインの Google API とサービスにもアクセスできます。詳細については、デフォルト ルートでのルーティングをご覧ください。

デフォルトのルートを、宛先が 0.0.0.0/0 で、ネクストホップがデフォルトのインターネット ゲートウェイではないカスタム静的ルートに置き換えた場合は、カスタム ルーティングを使用する Google API とサービスのルーティング要件を満たすことができます。次のような状況では、カスタム ルーティングをおすすめします。

  • 宛先 0.0.0.0/0 のカスタム静的ルートと、Cloud VPN トンネル、内部 TCP / UDP ロードバランサ、別の VM インスタンスであるネクストホップがある場合
  • Cloud Router を使用して、宛先が 0.0.0.0/0 のカスタム動的ルートを受け入れる場合

デフォルト ルートでのルーティング

各 VPC ネットワークには、作成時にデフォルト ルートが含まれます。このルートのネクストホップはデフォルトのインターネット ゲートウェイであり、デフォルト ドメインの private.googleapis.comrestricted.googleapis.com へのパスを提供します。

特定のネットワークのデフォルト ルートの構成を確認する方法は次のとおりです。

Console

  1. Google Cloud Console の [ルート] ページに移動します。
    [ルート] ページに移動
  2. ルートのリストをフィルタして、検査する必要があるネットワークのルートのみを表示します。
  3. 宛先が 0.0.0.0/0 で、そのネクストホップがデフォルト インターネット ゲートウェイであるルートを探します。

gcloud

次の gcloud コマンドを使用して、NETWORK_NAME を調べるネットワークの名前に置き換えます。

gcloud compute routes list \
    --filter="default-internet-gateway NETWORK_NAME"

置換用のデフォルト ルートを作成する必要がある場合は、静的ルートの追加をご覧ください。

カスタム ルーティング

デフォルト ルートの代わりに、宛先がより狭く、デフォルトのインターネット ゲートウェイ ネクストホップを使用するカスタム静的ルートを使用することもできます。必要なルートの数と宛先 IP アドレスは、選択したドメインによって異なります。

特定のネットワークで Google API とサービスのカスタムルートの構成を確認する方法は次のとおりです。

Console

  1. Google Cloud Console の [ルート] ページに移動します。
    [ルート] ページに移動
  2. [表をフィルタリング] テキスト フィールドで、次の条件を指定してルートのリストをフィルタリングします。NETWORK_NAME は実際の VPC ネットワークの名前に置き換えてください。
    • ネットワーク: NETWORK_NAME
    • ネクストホップのタイプ: default internet gateway
  3. 各ルートの [宛先 IP の範囲] 列を確認します。デフォルト ドメインを選択した場合は、複数のカスタム静的ルート(デフォルト ドメインで使用される各 IP アドレス範囲ごとに 1 つ)がないか確認します。private.googleapis.com または restricted.googleapis.com を選択した場合は、そのドメインの IP 範囲を探します。

gcloud

次の gcloud コマンドを使用して、NETWORK_NAME を調べるネットワークの名前に置き換えます。

gcloud compute routes list \
    --filter="default-internet-gateway NETWORK_NAME"

--format フラグでコマンドをカスタマイズしない限り、ルートはテーブル形式で一覧表示されます。DEST_RANGE 列で各ルートの宛先を探します。デフォルト ドメインを選択した場合は、複数のカスタム静的ルート(デフォルト ドメインで使用される各 IP アドレス範囲ごとに 1 つ)がないか確認します。private.googleapis.com または restricted.googleapis.com を選択した場合は、そのドメインの IP 範囲を探します。

ルートを作成する必要がある場合は、静的ルートの追加をご覧ください。

ファイアウォール構成

VPC ネットワークのファイアウォール構成では、VM から Google API とサービスによって使用される IP アドレスへのアクセスを許可する必要があります。暗黙の allow egress ルールは、この要件を満たしています。

一部のファイアウォール構成では、特定の下り(外向き)許可ルールを作成する必要があります。たとえば、すべての宛先(0.0.0.0)へのトラフィックをブロックする下り(外向き)拒否ルールを作成したとします。この場合、Google API とサービス用に、選択したドメインで使用される各 IP アドレス範囲の下り(外向き)拒否ルールよりも優先順位が高い下り(外向き)許可のファイアウォール ルールを 1 つ作成する必要があります。

ファイアウォール ルールを作成するには、ファイアウォール ルールの作成をご覧ください。各下り(外向き)許可ルールのターゲットを定義するときに、ファイアウォール ルールが適用される VM を制限できます。

デフォルト ドメインの IP アドレス

*.googleapis.com*.gcr.io など、デフォルトのドメインで使用される IP アドレス範囲を確認するには、次の手順を行います。

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

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

Google API とサービスのデフォルトのドメインで使用される IP アドレスは、goog.json の範囲から cloud.json のすべての範囲を除いて計算された範囲のリスト内に収まります。次の例では、Python を使用してこの範囲を取得しています。

Python

次の Python スクリプトを使用すると、Google API とサービスのデフォルト ドメインで使用される IP アドレス範囲のリストを作成できます。

macOS の場合、このスクリプトを使用するには、次の構成の Python 3 ランタイムが必要です。

  • macOS 用 Python 3 ランタイムの現在のバージョンをインストールします。
  • Applications フォルダの Python フォルダにある Install Certificates.command を実行し、Python ランタイムで使用する信頼できるルート証明書のリスト(cert.pem)をインストールします。VERSION は、インストールした Python のバージョン(3.8 など)で置き換えます。
    sudo "/Applications/Python VERSION/Install Certificates.command"
  • 次のコマンドを実行して netaddr モジュールをインストールします。
    sudo pip3 install netaddr
#!/usr/bin/env python3

import json
import netaddr
import urllib.request

goog_url="https://www.gstatic.com/ipranges/goog.json"
cloud_url="https://www.gstatic.com/ipranges/cloud.json"

def read_url(url):
   try:
      s = urllib.request.urlopen(url).read()
      return json.loads(s)
   except urllib.error.HTTPError:
      print("Invalid HTTP response from %s" % url)
      return {}
   except json.decoder.JSONDecodeError:
      print("Could not parse HTTP response from %s" % url)
      return {}

def main():
   goog_json=read_url(goog_url)
   cloud_json=read_url(cloud_url)

   if goog_json and cloud_json:
      print("{} published: {}".format(goog_url,goog_json.get('creationTime')))
      print("{} published: {}".format(cloud_url,cloud_json.get('creationTime')))
      goog_cidrs = netaddr.IPSet()
      for e in goog_json['prefixes']:
         if e.get('ipv4Prefix'):
            goog_cidrs.add(e.get('ipv4Prefix'))
      cloud_cidrs = netaddr.IPSet()
      for e in cloud_json['prefixes']:
         if e.get('ipv4Prefix'):
            cloud_cidrs.add(e.get('ipv4Prefix'))
      print("IP ranges for Google APIs and services default domains:")
      for i in goog_cidrs.difference(cloud_cidrs).iter_cidrs():
         print(i)

if __name__=='__main__':
   main()