외부 IP 주소를 사용하여 VM에서 API에 액세스

네트워크 인터페이스에 할당된 외부 IP 주소가 있는 가상 머신(VM) 인스턴스는 이 페이지에 설명된 네트워크 요구사항이 충족되면 Google API 및 서비스에 연결할 수 있습니다. VM의 외부 IP 주소에서 연결이 생성되더라도 트래픽은 Google Cloud 내에 유지되며 공개 인터넷을 통해 전송되지 않습니다.

네트워크 요구사항

외부 IP 주소를 사용하여 VM에서 Google API 및 서비스에 액세스하려면 다음 요구사항을 충족해야 합니다.

  • IPv6를 사용하여 Google API 및 서비스에 연결하려면 다음 요구사항을 모두 충족해야 합니다.

    • VM은 외부 /96 IPv6 주소 범위로 구성해야 합니다.

    • VM에서 실행되는 소프트웨어가 전송하는 패킷의 소스가 해당 범위의 IPv6 주소 중 하나와 일치해야 합니다.

  • 선택한 구성에 따라 DNS 항목, 경로, 방화벽 규칙을 업데이트해야 할 수 있습니다. 자세한 내용은 구성 옵션 요약을 참조하세요.

구성 옵션 요약

다음 표에서는 비공개 Google 액세스를 구성할 수 있는 여러 방법을 요약해서 보여줍니다. 자세한 구성 정보는 네트워크 구성을 참조하세요.

도메인 옵션 DNS 구성 라우팅 구성 방화벽 구성
기본 도메인 특별한 DNS 구성은 필요하지 않습니다.

VPC 네트워크가 Google API 및 서비스에 사용되는 IP 주소 범위로 트래픽을 라우팅할 수 있는지 확인합니다.

  • 기본 구성: 다음 홉이 default-internet-gateway이고 대상 범위가 0.0.0.0/0(IPv4 트래픽의 경우) 및 ::/0(필요에 따라 IPv6 트래픽의 경우)인 기본 경로가 있는지 확인합니다. 경로가 누락되었으면 해당 경로를 만듭니다.
  • 커스텀 구성: Google API 및 서비스에 사용된 IP 주소 범위에 대해 경로를 만듭니다.

방화벽 규칙에 따라 Google API 및 서비스에 사용되는 IP 주소 범위에 대한 이그레스가 허용되는지 확인합니다.

기본값을 선택하면 트래픽을 차단하는 상위 우선순위 규칙이 없는 경우 이그레스 방화벽 규칙이 이 트래픽을 허용합니다.

private.googleapis.com

비공개 DNS 영역에서 다음 IP 주소로 요청을 전송하도록 DNS 레코드를 구성합니다.

IPv4 트래픽의 경우:

  • 199.36.153.8/30

IPv6 트래픽의 경우:

  • 2600:2d00:0002:2000::/64

VPC 네트워크에 다음 IP 범위에 대한 경로가 있는지 확인합니다.

IPv4 트래픽의 경우:

  • 199.36.153.8/30
  • 34.126.0.0/18

IPv6 트래픽의 경우:

  • 2600:2d00:0002:2000::/64
  • 2001:4860:8040::/42

방화벽 규칙에 따라 다음 IP 범위에 대해 이그레스가 허용되는지 확인합니다.

IPv4 트래픽의 경우:

  • 199.36.153.8/30
  • 34.126.0.0/18

IPv6 트래픽의 경우:

  • 2600:2d00:0002:2000::/64
  • 2001:4860:8040::/42
restricted.googleapis.com

다음 IP 주소로 요청을 전송하도록 DNS 레코드를 구성합니다.

IPv4 트래픽의 경우:

  • 199.36.153.4/30

IPv6 트래픽의 경우:

  • 2600:2d00:0002:1000::/64

VPC 네트워크에 다음 IP 범위에 대한 경로가 있는지 확인합니다.

IPv4 트래픽의 경우:

  • 199.36.153.4/30
  • 34.126.0.0/18

IPv6 트래픽의 경우:

  • 2600:2d00:0002:1000::/64
  • 2001:4860:8040::/42

방화벽 규칙에 따라 다음 IP 범위에 대해 이그레스가 허용되는지 확인합니다.

IPv4 트래픽의 경우:

  • 199.36.153.4/30
  • 34.126.0.0/18

IPv6 트래픽의 경우:

  • 2600:2d00:0002:1000::/64
  • 2001:4860:8040::/42

네트워크 구성

이 섹션에서는 VPC 네트워크의 VM이 Google API 및 서비스에 액세스하기 위해 충족해야 하는 기본 네트워크 요구사항을 설명합니다.

도메인 옵션

Google API 및 서비스에 액세스하는 데 사용할 도메인을 선택합니다.

private.googleapis.comrestricted.googleapis.com 가상 IP 주소(VIP)는 TCP를 통한 HTTP 기반 프로토콜(HTTP, HTTPS, HTTP/2)만 지원합니다. MQTT, ICMP를 비롯한 다른 모든 프로토콜은 지원되지 않습니다.

도메인 및 IP 주소 범위 지원되는 서비스 사용 예시

기본 도메인

private.googleapis.comrestricted.googleapis.com제외한 Google API 및 서비스의 모든 도메인 이름

다양한 IP 주소 범위—기본 도메인의 IP 주소를 참조하여 기본 도메인에서 사용 가능한 주소가 포함된 IP 범위 집합을 확인할 수 있습니다.

VPC 서비스 제어에서 지원하는지 여부에 관계없이 대부분의 Google API 및 서비스에 대한 API 액세스를 사용 설정합니다. Google 지도, Google Ads, Google Cloud에 대한 API 액세스 권한이 포함됩니다. Gmail 및 Google Docs와 같은 Google Workspace 웹 애플리케이션과 기타 웹 애플리케이션이 포함됩니다.

private.googleapis.comrestricted.googleapis.com의 DNS 레코드를 구성하지 않은 경우 기본 도메인이 사용됩니다.

private.googleapis.com

199.36.153.8/30

2600:2d00:0002:2000::/64

VPC 서비스 제어에서 지원하는지 여부에 관계없이 대부분의 Google API 및 서비스에 대한 API 액세스를 사용 설정합니다. 다음 목록을 포함하여 Google 지도, Google Ads, Google Cloud 및 다른 대부분의 Google API에 대한 API 액세스가 포함됩니다. Gmail 및 Google Docs와 같은 Google Workspace 웹 애플리케이션을 지원하지 않습니다. 대화형 웹사이트를 지원하지 않습니다.

일치하는 도메인 이름:

  • accounts.google.com(OAuth 인증에 필요한 경로만)
  • *.aiplatform-notebook.cloud.google.com
  • *.aiplatform-notebook.googleusercontent.com
  • appengine.google.com
  • *.appspot.com
  • *.backupdr.cloud.google.com
  • backupdr.cloud.google.com
  • *.backupdr.googleusercontent.com
  • backupdr.googleusercontent.com
  • *.cloudfunctions.net
  • *.cloudproxy.app
  • *.composer.cloud.google.com
  • *.composer.googleusercontent.com
  • *.datafusion.cloud.google.com
  • *.datafusion.googleusercontent.com
  • *.dataproc.cloud.google.com
  • dataproc.cloud.google.com
  • *.dataproc.googleusercontent.com
  • dataproc.googleusercontent.com
  • dl.google.com
  • gcr.io 또는 *.gcr.io
  • *.googleapis.com
  • *.gstatic.com
  • *.kernels.googleusercontent.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
  • storage.cloud.google.com

private.googleapis.com에서 Google Cloud 내에서만 라우팅할 수 있는 IP 주소 집합을 사용하여 Google API 및 서비스에 액세스합니다.

다음과 같은 상황에서 private.googleapis.com을 선택합니다.

  • VPC 서비스 제어를 사용하지 않는 경우
  • VPC 서비스 제어를 사용하지만 VPC 서비스 제어에서 지원하지 않는 Google API 및 서비스에도 액세스해야 하는 경우1

restricted.googleapis.com

199.36.153.4/30

2600:2d00:0002:1000::/64

VPC 서비스 제어가 지원하는 Google API 및 서비스에 대한 API 액세스를 사용 설정합니다.

VPC 서비스 제어를 지원하지 않는 Google API 및 서비스에 대한 액세스를 차단합니다. Google Workspace API 또는 Google Workspace 웹 애플리케이션(예: Gmail 및 Google Docs)을 지원하지 않습니다.

restricted.googleapis.com에서 Google Cloud 내에서만 라우팅할 수 있는 IP 주소 집합을 사용하여 Google API 및 서비스에 액세스합니다.

VPC 서비스 제어에서 지원하는 Google API 및 서비스에 액세스해야 하는 경우에만 restricted.googleapis.com을 선택합니다.

restricted.googleapis.com 도메인은 VPC 서비스 제어를 지원하지 않는 Google API 및 서비스에 대한 액세스를 허용하지 않습니다.1

1 VPC 서비스 제어를 지원하는 Google API와 서비스로만 사용자를 제한해야 할 경우 데이터 무단 반출을 위해 추가 위험 완화를 제공하므로 restricted.googleapis.com을 사용합니다. restricted.googleapis.com을 사용하면 VPC 서비스 제어에서 지원하지 않는 Google API 및 서비스에 대한 액세스가 거부됩니다. 자세한 내용은 VPC 서비스 제어 문서의 비공개 연결 설정을 참조하세요.

private.googleapis.comrestricted.googleapis.com에 대한 IPv6 지원

다음 IPv6 주소 범위를 사용하여 IPv6 클라이언트에서 Google API 및 서비스로 트래픽을 전달할 수 있습니다.

  • private.googleapis.com: 2600:2d00:0002:2000::/64
  • restricted.googleapis.com: 2600:2d00:0002:1000::/64

private.googleapis.com 또는 restricted.googleapis.com 도메인을 사용하고 IPv6 주소를 사용하는 클라이언트가 있는 경우 IPv6 주소를 구성하는 것이 좋습니다. IPv4 주소도 구성된 IPv6 클라이언트는 IPv4 주소를 사용하여 Google API 및 서비스에 연결할 수 있습니다. 일부 서비스는 IPv6 클라이언트의 트래픽을 허용하지 않습니다.

DNS 구성

Google API 및 서비스에 대한 연결의 경우 private.googleapis.com 또는 restricted.googleapis.com VIP와 연결된 IP 주소로 패킷을 전송하도록 선택할 수 있습니다. VIP를 사용하려면 공개 IP 주소 대신 VIP 주소를 사용하여 VPC 네트워크의 VM이 서비스에 도달하도록 DNS를 구성해야 합니다.

다음 섹션에서는 DNS 영역을 사용하여 선택한 VIP와 연관된 IP 주소로 패킷을 전송하는 방법을 설명합니다. 자신에게 적용되는 모든 시나리오에 대해 해당 안내를 따르세요.

VIP에 대해 DNS 레코드를 구성할 때는 다음 단계에 설명된 IP 주소만 사용합니다. private.googleapis.comrestricted.googleapis.com VIP의 주소를 혼합하지 마세요. 이로 인해 제공되는 서비스가 패킷의 대상에 따라 달라지므로 간헐적인 장애가 발생할 수 있습니다.

googleapis.com의 DNS 구성

googleapis.com의 DNS 영역 및 레코드를 만드세요.

  1. googleapis.com의 비공개 DNS 영역을 만듭니다. 이 경우에는 Cloud DNS 비공개 영역 만들기를 참조하세요.
  2. googleapis.com 영역에서 선택한 도메인에 따라 private.googleapis.com 또는 restricted.googleapis.com의 다음 비공개 DNS 레코드를 만듭니다.

    • private.googleapis.com의 경우:

      1. 199.36.153.8, 199.36.153.9, 199.36.153.10, 199.36.153.11 IP 주소를 가리키는 private.googleapis.comA 레코드를 만듭니다.

      2. IPv6 주소를 사용하여 API에 연결하려면 2600:2d00:0002:2000::을 가리키는 private.googleapis.comAAAA 레코드도 구성합니다.

    • restricted.googleapis.com의 경우:

      1. 199.36.153.4, 199.36.153.5, 199.36.153.6, 199.36.153.7 IP 주소를 가리키는 restricted.googleapis.comA 레코드를 만듭니다.

      2. IPv6 주소를 사용하여 API에 연결하려면 2600:2d00:0002:1000::을 가리키는 restricted.googleapis.comAAAA 레코드도 만듭니다.

    Cloud DNS에서 비공개 DNS 레코드를 만들려면 레코드 추가를 참조하세요.

  3. googleapis.com 영역에서 구성한 도메인(private.googleapis.com 또는 restricted.googleapis.com)을 가리키는 *.googleapis.comCNAME 레코드를 만듭니다.

다른 도메인의 DNS 구성

일부 Google API 및 서비스는 *.gcr.io, *.gstatic.com, *.pkg.dev, pki.goog, *.run.app 등의 추가 도메인 이름을 사용하여 제공됩니다. private.googleapis.com 또는 restricted.googleapis.com을 사용하여 추가 도메인의 서비스에 액세스할 수 있는지 확인하려면 도메인 옵션도메인 및 IP 주소 범위 표를 참조하세요. 그런 다음 각 추가 도메인에 대해 다음을 수행하세요.

  1. DOMAIN의 DNS 영역(예: gcr.io)을 만듭니다. Cloud DNS를 사용하는 경우 이 영역이 googleapis.com 비공개 영역과 동일한 프로젝트에 있는지 확인합니다.

  2. 이 DNS 영역에서 선택한 도메인에 따라 private.googleapis.com 또는 restricted.googleapis.com에 대한 다음 DNS 레코드를 만듭니다.

    • private.googleapis.com의 경우:

      1. 199.36.153.8, 199.36.153.9, 199.36.153.10, 199.36.153.11 IP 주소를 가리키는 DOMAINA 레코드를 만듭니다.

      2. IPv6 주소를 사용하여 API에 연결하려면 2600:2d00:0002:2000::을 가리키는 DOMAINAAAA 레코드도 만듭니다.

    • restricted.googleapis.com의 경우:

      1. 199.36.153.4, 199.36.153.5, 199.36.153.6, 199.36.153.7 IP 주소를 가리키는 DOMAINA 레코드를 만듭니다.

      2. IPv6 주소를 사용하여 API에 연결하려면 2600:2d00:0002:1000::을 가리키는 restricted.googleapis.comAAAA 레코드도 만듭니다.

  3. DOMAIN 영역에서 DOMAIN을 가리키는 *.DOMAINCNAME 레코드를 만듭니다. 예를 들어 gcr.io를 가리키는 *.gcr.ioCNAME 레코드를 만듭니다.

Cloud Storage 커스텀 도메인 이름의 DNS 구성

Cloud Storage 버킷을 사용 중이고 Cloud Storage 커스텀 도메인 이름에 요청을 보내는 경우 커스텀 Cloud Storage 도메인 이름의 DNS 레코드가 private.googleapis.com 또는 restricted.googleapis.com의 IP 주소를 가리키도록 구성하면 Cloud Storage 버킷에 액세스할 수 없습니다.

Cloud Storage 커스텀 도메인 이름으로 요청을 보내려면 HTTP 요청의 호스트 헤더와 TLS SNI도 명시적으로 storage.googleapis.com으로 설정해야 합니다. private.googleapis.comrestricted.googleapis.com의 IP 주소는 HTTP 요청 호스트 헤더 및 TLS SNI에서 커스텀 Cloud Storage 호스트 이름을 지원하지 않습니다.

라우팅 옵션

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 네트워크 또는 VPC 네트워크에 연결된 온프레미스 시스템의 VM에서만 액세스할 수 있습니다.

VPC 네트워크에 다음 홉이 기본 인터넷 게이트웨이인 기본 경로가 있으면 커스텀 경로를 만들지 않고도 해당 경로를 사용하여 Google API 및 서비스에 액세스할 수 있습니다. 자세한 내용은 기본 경로를 사용한 라우팅을 참조하세요.

기본 경로(대상 0.0.0.0/0 또는 ::0/0)를 다음 홉이 기본 인터넷 게이트웨이가 아닌 커스텀 경로로 바꿨으면 대신 커스텀 라우팅을 사용하여 Google API 및 서비스에 대한 라우팅 요구사항을 충족할 수 있습니다.

VPC 네트워크에 IPv6 기본 경로가 없으면 Google API 및 서비스에 대해 IPv6로 연결할 수 없습니다. IPv6 연결을 허용하도록 IPv6 기본 경로를 추가합니다.

기본 경로를 사용한 라우팅

각 VPC 네트워크에는 생성 시 IPv4 기본 경로(0.0.0.0/0)가 포함됩니다. 서브넷에 외부 IPv6 주소를 사용 설정하면 시스템 생성 IPv6 기본 경로(::/0)가 해당 VPC 네트워크에 추가됩니다.

기본 경로는 다음 대상의 IP 주소 경로를 제공합니다.

  • 기본 도메인

  • private.googleapis.com: 199.36.153.8/302600:2d00:0002:2000::/64

  • restricted.googleapis.com: 199.36.153.4/302600:2d00:0002:1000::/64

특정 네트워크에서 기본 경로의 구성을 확인하려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  2. 경로 목록을 필터링하여 확인해야 하는 네트워크의 경로만 표시합니다.

  3. 대상이 IPv4 트래픽의 경우 0.0.0.0/0 또는 IPv6 트래픽의 경우 ::/0이고 다음 홉이 기본 인터넷 게이트웨이인 경로를 찾습니다.

gcloud

다음 gcloud 명령어를 사용하되, NETWORK_NAME을 검사할 네트워크의 이름으로 바꾸고

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

다른 기본 IPv4 경로를 만들어야 하는 경우 정적 경로 추가를 참조하세요.

다른 기본 IPv6 경로를 만들어야 하는 경우 IPv6 기본 경로 추가를 참조하세요.

커스텀 라우팅

기본 경로 대신 커스텀 정적 경로를 사용할 수 있습니다. 이때 각 경로에는 보다 구체적인 대상이 있으며 각각 기본 인터넷 게이트웨이 다음 홉을 사용합니다. 필요한 경로 수와 대상 IP 주소는 선택한 도메인에 따라 다릅니다.

  • 기본 도메인: Google API 및 서비스의 IP 주소 범위에 대한 경로가 있어야 합니다.
  • private.googleapis.com: 199.36.153.8/302600:2d00:0002:2000::/64
  • restricted.googleapis.com: 199.36.153.4/302600:2d00:0002:1000::/64

또한 34.126.0.0/182001:4860:8040::/42에 대해 경로를 추가하는 것이 좋습니다. 자세한 내용은 구성 옵션 요약을 참조하세요.

특정 네트워크의 Google API 및 서비스에 대한 커스텀 경로 구성을 확인하려면 다음 안내를 따르세요.

콘솔

  1. Google Cloud 콘솔에서 경로 페이지로 이동합니다.

    경로로 이동

  2. 필터 테이블 텍스트 필드를 사용하여 다음 기준을 사용하는 경로 목록을 필터링합니다. 여기서 NETWORK_NAME을 VPC 네트워크의 이름으로 바꿉니다.

    • 네트워크: NETWORK_NAME
    • 다음 홉 유형: default internet gateway
  3. 각 경로의 대상 IP 범위 열을 확인합니다. 기본 도메인을 선택한 경우 기본 도메인에서 사용하는 각 IP 주소 범위별로 하나씩, 여러 개의 커스텀 정적 경로를 확인합니다. 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 주소 범위별로 하나씩, 여러 개의 커스텀 정적 경로를 확인합니다. private.googleapis.com 또는 restricted.googleapis.com을 선택한 경우에는 해당 도메인의 IP 범위를 찾습니다.

경로를 만들어야 하는 경우 정적 경로 추가를 참조하세요.

방화벽 구성

VPC 네트워크 방화벽은 VM에서 Google API 및 서비스에서 사용되는 IP 주소로의 액세스를 허용하도록 구성해야 합니다. 묵시적인 allow egress 규칙은 이러한 요구사항을 충족합니다.

일부 방화벽 구성에서는 특정 이그레스 허용 규칙을 만들어야 합니다. 예를 들어 모든 대상(IPv4의 경우 0.0.0.0, IPv6의 경우 ::/0)에 대한 트래픽을 차단하는 이그레스 거부 규칙을 만들었다고 가정해 보겠습니다. 이 경우 Google API 및 서비스에 선택한 도메인에서 사용되는 각 IP 주소 범위에 대해서 이그레스 거부 규칙보다 우선순위가 높은 이그레스 허용 방화벽 규칙을 하나씩 만들어야 합니다.

또한 이그레스 허용 방화벽 규칙에 34.126.0.0/182001:4860:8040::/42를 포함하는 것이 좋습니다. 자세한 내용은 구성 옵션 요약을 참조하세요.

방화벽 규칙을 만들려면 방화벽 규칙 만들기를 참조하세요. 각 이그레스 허용 규칙의 대상을 정의할 때 방화벽 규칙이 적용되는 VM을 제한할 수 있습니다.

기본 도메인의 IP 주소

이 섹션에서는 *.googleapis.com*.gcr.io와 같은 Google API 및 서비스에서 사용되는 기본 도메인 IP 범위 목록을 만드는 방법을 설명합니다. 이러한 범위는 동적으로 할당되고 자주 변경되므로 개별 서비스 또는 API에 특정 IP 범위를 정의할 수 없습니다. 정확한 목록을 유지하려면 매일 스크립트를 실행하도록 자동화를 설정하세요. IP 주소 범위 목록을 유지하는 대신 private.googleapis.com VIP 또는 Private Service Connect를 사용하는 것이 좋습니다.

  • Google은 인터넷 사용자에게 제공되는 IP 범위의 전체 목록을 goog.json에 게시합니다.

  • 또한 Google은 고객이 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()