Statische ausgehende IP-Adresse

Standardmäßig stellt ein Cloud Run-Dienst über einen dynamischen IP-Adresspool eine Verbindung zu externen Endpunkten im Internet her. Diese Standardeinstellung eignet sich nicht, wenn der Cloud Run-Dienst eine Verbindung zu einem externen Endpunkt herstellt, der Verbindungen von einer statischen IP-Adresse erfordert, z. B. eine Datenbank oder API mithilfe einer IP-Adressen-basierten Firewall. Für diese Verbindungen müssen Sie Ihren Cloud Run-Dienst so konfigurieren, dass Anfragen über eine statische IP-Adresse weitergeleitet werden.

In dieser Anleitung wird beschrieben, wie Sie einen Cloud Run-Dienst aktivieren, um Anfragen über eine statische IP-Adresse zu senden.

Aufgabenübersicht

Damit ein Cloud Run-Dienst Anfragen über eine statische IP-Adresse weiterleiten kann, müssen Sie den ausgehenden VPC-Traffic des Cloud Run-Dienstes so konfigurieren, dass der gesamte ausgehende Traffic über ein VPC-Netzwerk mit einem Cloud NAT-Gateway mit der statischen IP-Adresse weitergeleitet wird.

Wenn Sie den Traffic über Cloud NAT weiterleiten, wird kein zusätzlicher Hop im Netzwerk-Stack verursacht, da das Cloud NAT-Gateway und der Cloud Router nur eine Steuerungsebene bieten und die Pakete nicht durch das NAT-Gateway oder den Cloud Router weitergeleitet werden.

Beachten Sie, dass alle Cloud Run-Dienste, die mit demselben VPC-Netzwerk verbunden sind, dieselbe IP-Adresse für ausgehenden Traffic verwenden. Um verschiedene ausgehende IP-Adressen für separate Cloud Run-Dienste zu verwenden, erstellen Sie separate Subnetze und optional Connectors für serverlosen VPC-Zugriff.

Subnetz erstellen

Sie müssen ein dediziertes /28-Subnetz erstellen, um einen Connector zu hosten. Wenn Sie ausgehenden Direct VPC-Traffic nutzen, verwenden Sie ein vorhandenes Subnetz oder erstellen Sie ein anderes. Wenn Sie einen Connector verwenden, verhindert das dedizierte Subnetz, dass andere Rechenressourcen in Ihrer VPC, wie Compute Engine-VMs oder Google Kubernetes Engine-Cluster, versehentlich die statische IP verwenden, wenn Sie Serverless VPC Access für den Zugriff auf das Internet konfiguriert haben.

gcloud

  1. Suchen Sie den Namen Ihres VPC-Netzwerks:

    gcloud compute networks list

    Die Ausgabe sollte in etwa so aussehen:

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    Ermitteln Sie das Netzwerk, das Sie an Ihren Connector für serverlosen VPC-Zugriff anhängen.

  2. Erstellen Sie in der VPC ein Subnetz für den Connector für serverlosen VPC-Zugriff.

    gcloud compute networks subnets create SUBNET_NAME \
    --range=RANGE --network=NETWORK_NAME --region=REGION

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • SUBNET_NAME durch einen Namen, den Sie dem Subnetz geben möchten
    • RANGE durch den IP-Bereich im CIDR-Format, den Sie diesem Subnetz zuweisen möchten (z. B. 10.124.0.0/28).
    • NETWORK_NAME: durch den Namen des VPC-Netzwerks
    • REGION durch die Region, in der Sie einen Connector für serverlosen VPC-Zugriff erstellen möchten.

Terraform

  1. Erstellen Sie das VPC-Netzwerk, das verwendet werden soll.

    resource "google_compute_network" "default" {
      provider = google-beta
      name     = "cr-static-ip-network"
    }

    Ersetzen Sie cr-static-ip-network durch den Subnetznamen.

  2. Erstellen Sie in der VPC ein Subnetz für den Connector für serverlosen VPC-Zugriff.

    resource "google_compute_subnetwork" "default" {
      provider      = google-beta
      name          = "cr-static-ip"
      ip_cidr_range = "10.124.0.0/28"
      network       = google_compute_network.default.id
      region        = "us-central1"
    }

    Ersetzen

    • cr-static-ip durch Ihren Subnetznamen
    • 10.124.0.0/28 durch Ihren CIDR-Bereich
    • us-central1 durch Ihre Google Cloud-Region

Erstellen eines Connectors für Serverless VPC Access

Sie müssen keinen Connector erstellen, wenn Sie die Integration von ausgehendem Direct VPC-Traffic verwenden. Wenn Sie keinen Direct VPC-Traffic verwenden, benötigen Sie einen Connector für serverlosen VPC-Zugriff, um ausgehenden Traffic des Cloud Run-Dienstes an ein VPC-Netzwerk weiterzuleiten.

Erstellen Sie einen Connector für serverlosen VPC-Zugriff.

gcloud

  1. Erstellen Sie einen Connector für serverlosen VPC-Zugriff mit einem vordefinierten Subnetz.

    gcloud compute networks vpc-access connectors create CONNECTOR_NAME \
      --region=REGION \
      --subnet-project=PROJECT_ID \
      --subnet=SUBNET_NAME
    

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • CONNECTOR durch einen Namen, den Sie dieser Ressource zuweisen möchten.
    • PROJECT_ID durch einen Namen, der das Subnetz hostet.
    • SUBNET_NAME: der Name des von Ihnen erstellten Subnetzes.
    • REGION durch die Region, in der Sie ein NAT-Gateway erstellen möchten.

Terraform

  1. Erstellen eines Connectors für Serverless VPC Access

    resource "google_project_service" "vpc" {
      provider           = google-beta
      service            = "vpcaccess.googleapis.com"
      disable_on_destroy = false
    }
    
    resource "google_vpc_access_connector" "default" {
      provider = google-beta
      name     = "cr-conn"
      region   = "us-central1"
    
      subnet {
        name = google_compute_subnetwork.default.name
      }
    
      # Wait for VPC API enablement
      # before creating this resource
      depends_on = [
        google_project_service.vpc
      ]
    }

    cr-conn durch den Namen Ihres Connectors für serverlosen VPC-Zugriff.

Network Address Translation (NAT) konfigurieren

Wenn Sie ausgehenden Direct VPC-Traffic oder einen Connector für serverlosen VPC-Zugriff verwenden, kommen Anfragen Ihres Cloud Run-Dienstes in Ihrem VPC-Netzwerk an. Wenn Sie ausgehende Anfragen an externe Endpunkte über eine statische IP-Adresse weiterleiten möchten, konfigurieren Sie ein Cloud NAT-Gateway.

gcloud

  1. Erstellen Sie einen neuen Cloud Router, um ein NAT-Gateway zu programmieren:

    gcloud compute routers create ROUTER_NAME \
      --network=NETWORK_NAME \
      --region=REGION

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • ROUTER_NAME durch einen Namen für die Cloud Router-Ressource, die Sie erstellen möchten.
    • NETWORK_NAME durch den Namen des zuvor ermittelten VPC-Netzwerks.
    • REGION durch die Region, in der Sie ein NAT-Gateway erstellen möchten.
  2. Reservieren Sie eine statische IP-Adresse. Eine reservierte IP-Adressressource behält die zugrunde liegende IP-Adresse bei, wenn die ihr zugeordnete Ressource gelöscht und neu erstellt wird:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • ORIGIN_IP_NAME durch den Namen, den Sie der IP-Adressressource zuweisen möchten.
    • REGION durch die Region, in der der Cloud NAT-Router ausgeführt wird. Idealerweise sollten Sie dieselbe Region wie der Cloud Run-Dienst verwenden, um Latenz und Netzwerkkosten zu minimieren.
  3. Erstellen Sie eine Cloud NAT-Gateway-Konfiguration auf diesem Router, um den Traffic, der vom VPC-Netzwerk stammt, mit der von Ihnen erstellten statischen IP-Adresse weiterzuleiten:

    gcloud compute routers nats create NAT_NAME \
      --router=ROUTER_NAME \
      --region=REGION \
      --nat-custom-subnet-ip-ranges=SUBNET_NAME \
      --nat-external-ip-pool=ORIGIN_IP_NAME
    

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • NAT_NAME durch einen Namen für die Cloud NAT-Gateway-Ressource, die Sie erstellen möchten.
    • ROUTER_NAME durch den Namen Ihres Cloud Routers.
    • REGION durch die Region, in der Sie ein NAT-Gateway erstellen möchten.
    • ORIGIN_IP_NAME durch den Namen der reservierten IP-Adressressource, die Sie im vorherigen Schritt erstellt haben.

Terraform

  1. Erstellen Sie einen neuen Cloud Router, um ein NAT-Gateway zu programmieren:

    resource "google_compute_router" "default" {
      provider = google-beta
      name     = "cr-static-ip-router"
      network  = google_compute_network.default.name
      region   = google_compute_subnetwork.default.region
    }

    Ersetzen Sie cr-static-ip-router durch Ihren Subnetznamen.

  2. Reservieren Sie eine statische IP-Adresse. Eine reservierte IP-Adressressource behält die zugrunde liegende IP-Adresse bei, wenn die ihr zugeordnete Ressource gelöscht und neu erstellt wird:

    resource "google_compute_address" "default" {
      provider = google-beta
      name     = "cr-static-ip-addr"
      region   = google_compute_subnetwork.default.region
    }

    Ersetzen Sie cr-static-ip-addr durch Ihren Subnetznamen.

  3. Erstellen Sie eine Cloud NAT-Gateway-Konfiguration auf diesem Router, um den Traffic, der vom VPC-Netzwerk stammt, mit der von Ihnen erstellten statischen IP-Adresse weiterzuleiten:

    resource "google_compute_router_nat" "default" {
      provider = google-beta
      name     = "cr-static-nat"
      router   = google_compute_router.default.name
      region   = google_compute_subnetwork.default.region
    
      nat_ip_allocate_option = "MANUAL_ONLY"
      nat_ips                = [google_compute_address.default.self_link]
    
      source_subnetwork_ip_ranges_to_nat = "LIST_OF_SUBNETWORKS"
      subnetwork {
        name                    = google_compute_subnetwork.default.id
        source_ip_ranges_to_nat = ["ALL_IP_RANGES"]
      }
    }

    Ersetzen Sie cr-static-nat durch den Namen des Cloud NAT-Gateways.

Cloud Run-Traffic über das VPC-Netzwerk weiterleiten

Nachdem NAT konfiguriert wurde, stellen Sie Ihren Cloud Run-Dienst mit direktem VPC-Ausgang oder dem Connector für serverlosen VPC-Zugriff bereit oder aktualisieren Sie ihn und stellen den VPC Egress so ein, dass er den gesamten Traffic durch das VPC-Netzwerk leitet:

gcloud

  • Ausgehender Direct VPC-Traffic

    Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst bereitzustellen oder zu aktualisieren, um ausgehenden Direct VPC-Traffic zu verwenden und den gesamten ausgehenden Traffic über diesen weiterzuleiten:

    gcloud run deploy SERVICE_NAME \
    --image=IMAGE_URL \
    --network=NETWORK \
    --subnet=SUBNET \
    --region=REGION \
    --vpc-egress=all-traffic

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • SERVICE_NAME durch den Namen des Cloud Run-Dienstes, den Sie bereitstellen möchten.
    • IMAGE_URL durch einen Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest. Wenn Sie Artifact Registry verwenden, muss das Repository REPO_NAME bereits erstellt sein. Die URL hat die Form LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
    • NETWORK durch den Namen Ihres VPC-Netzwerks.
    • SUBNET durch den Namen Ihres Subnetzes.
    • REGION durch eine Region für Ihren Dienst.
  • Connector für serverlosen VPC-Zugriff

    Führen Sie den folgenden Befehl aus, um Ihren Cloud Run-Dienst für die Verwendung eines Connectors für serverlosen VPC-Zugriff bereitzustellen oder zu aktualisieren und den gesamten ausgehenden Traffic über diesen weiterzuleiten:

    gcloud run deploy SERVICE_NAME \
    --image=IMAGE_URL \
    --vpc-connector=CONNECTOR_NAME \
    --region=REGION \
    --vpc-egress=all-traffic

    Ersetzen Sie die folgenden Werte in diesem Befehl:

    • SERVICE_NAME durch den Namen des Cloud Run-Dienstes, den Sie bereitstellen möchten.
    • IMAGE_URL durch einen Verweis auf das Container-Image, z. B. us-docker.pkg.dev/cloudrun/container/hello:latest. Wenn Sie Artifact Registry verwenden, muss das Repository REPO_NAME bereits erstellt sein. Die URL hat die Form LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG.
    • CONNECTOR_NAME durch den Namen Ihres Connectors für serverlosen VPC-Zugriff.
    • REGION durch eine Region für Ihren Dienst.

Terraform

Dieser Cloud Run-Dienst verwendet einen VPC-Connector und leitet den gesamten ausgehenden Traffic über ihn weiter:

resource "google_cloud_run_v2_service" "default" {
  provider = google-beta
  name     = "cr-static-ip-service"
  location = google_compute_subnetwork.default.region

  template {
    containers {
      # Replace with the URL of your container
      #   gcr.io/<YOUR_GCP_PROJECT_ID>/<YOUR_CONTAINER_NAME>
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    scaling {
      max_instance_count = 5
    }
    vpc_access {
      connector = google_vpc_access_connector.default.id
      egress    = "ALL_TRAFFIC"
    }
  }
  ingress = "INGRESS_TRAFFIC_ALL"

}

Ersetzen Sie us-docker.pkg.dev/cloudrun/container/hello durch einen Verweis auf Ihr Container-Image.

Statische externe IP-Adresse prüfen

Nachdem Sie die oben genannten Schritte ausgeführt haben, haben Sie Cloud NAT in Ihrem VPC-Netzwerk mit einer vordefinierten statischen IP-Adresse eingerichtet und den gesamten ausgehenden Traffic Ihres Cloud Run-Dienstes an Ihr VPC-Netzwerk weitergeleitet. Anfragen Ihres Cloud Run-Dienstes werden durch Ihr VPC-Netzwerk geleitet und erreichen externe Endpunkte über die statische IP-Adresse.

Um dieses Verhalten zu bestätigen und die ursprüngliche IP-Adresse zu prüfen, die Ihr Dienst verwendet, können Sie eine Anfrage an eine API oder eine Website wie curlmyip.org senden, die die ursprüngliche IP-Adresse anzeigt.

Statische externe IP-Adresse löschen

Wenn Sie eine statische externe IP-Adresse nicht mehr benötigen, lesen Sie den Artikel Statische externe IP-Adresse freigeben.