Indirizzo IP in uscita statico

Per impostazione predefinita, un servizio Cloud Run si connette a endpoint esterni su internet utilizzando un pool di indirizzi IP dinamici. Se il servizio Cloud Run si connette a un endpoint esterno che richiede un indirizzo IP statico, ad esempio un database o un'API, utilizzando un firewall basato su indirizzo IP, devi configurare il servizio Cloud Run in modo da inoltrare le richieste utilizzando un indirizzo IP statico.

Questa pagina descrive come consentire a un servizio Cloud Run di inviare richieste utilizzando un indirizzo IP statico.

Panoramica delle attività

Per consentire a un servizio Cloud Run di inoltrare le richieste utilizzando un indirizzo IP statico, configura il traffico in uscita VPC del servizio Cloud Run in modo che inoltri tutto il traffico in uscita tramite una rete VPC con un gateway Cloud NAT configurato con l'indirizzo IP statico.

L'indirizzamento del traffico tramite Cloud NAT non causa un ulteriore hop nello stack di rete, poiché il gateway Cloud NAT e il router Cloud forniscono solo un piano di controllo e i pacchetti non passano attraverso il gateway NAT o il router Cloud.

Tutti i servizi Cloud Run connessi alla stessa rete VPC condividono lo stesso indirizzo IP di uscita. Per utilizzare indirizzi IP di uscita diversi per servizi Cloud Run separati, consulta questa pagina per creare subnet separate e, facoltativamente, connettori di accesso VPC serverless.

Crea una subnet

Devi creare una subnet /28 dedicata per ospitare un connettore. Se utilizzi l'uscita VPC diretto, utilizza una subnet esistente o creane un'altra. Se utilizzi un connettore, la subnet dedicata impedisce ad altre risorse di calcolo nella rete VPC, ad esempio le VM Compute Engine o i cluster Google Kubernetes Engine, di utilizzare accidentalmente l'indirizzo IP statico se hai configurato l'accesso VPC serverless per accedere a internet.

gcloud

  1. Trova il nome della tua rete VPC:

    gcloud compute networks list

    Dovresti vedere un output simile al seguente:

    NAME     SUBNET_MODE  BGP_ROUTING_MODE
    default  AUTO         REGIONAL

    Identifica la rete da collegare al connettore di accesso VPC serverless.

  2. Crea una subnet nel VPC per il connettore di accesso VPC serverless.

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

    Sostituisci i seguenti valori in questo comando:

    • SUBNET_NAME con il nome che vuoi assegnare alla sottorete.
    • RANGE con l'intervallo IP in formato CIDR che vuoi assegnare a questa subnet (ad esempio 10.124.0.0/28).
    • NETWORK_NAME con il nome della rete VPC.
    • REGION con la regione in cui vuoi creare un connettore di accesso VPC serverless.

Terraform

  1. Crea la rete VPC da utilizzare.

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

    Sostituisci cr-static-ip-network con il nome della subnet.

  2. Crea una subnet nel VPC per il connettore di accesso VPC serverless.

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

    Sostituisci quanto segue:

    • cr-static-ip con il nome della subnet.
    • 10.124.0.0/28 con il tuo intervallo CIDR.
    • us-central1 con la tua regione Google Cloud.

Crea un connettore di accesso VPC serverless

Non è necessario creare un connettore se utilizzi l'uscita VPC diretta. Se non utilizzi il traffico VPC diretto in uscita, hai bisogno di un connettore di accesso VPC serverless per instradare il traffico in uscita del servizio Cloud Run a una rete VPC.

Per creare un connettore di accesso VPC serverless:

gcloud

  1. Crea un connettore di accesso VPC serverless con una sottorete precreata.

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

    Sostituisci i seguenti valori in questo comando:

    • CONNECTOR con il nome che vuoi assegnare a questa risorsa.
    • PROJECT_ID con un nome che ospita la subnet.
    • SUBNET_NAME con il nome della subnet che hai creato.
    • REGION con la regione in cui vuoi creare un gateway Cloud NAT.

Terraform

  1. Crea un connettore di accesso VPC serverless.

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

    Sostituisci cr-conn con il nome del connettore di accesso VPC serverless.

Configura la Network Address Translation (NAT)

Se utilizzi il traffico VPC diretto in uscita o un connettore di accesso VPC serverless, le richieste del servizio Cloud Run arrivano alla rete VPC. Se vuoi inoltrare le richieste in uscita agli endpoint esterni utilizzando un indirizzo IP statico, configura un gateway Cloud NAT.

gcloud

  1. Crea un nuovo router Cloud per programmare un gateway Cloud NAT:

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

    Sostituisci i seguenti valori in questo comando:

    • ROUTER_NAME con un nome per la risorsa router Cloud che vuoi creare.
    • NETWORK_NAME con il nome della rete VPC che hai trovato in precedenza.
    • REGION con la regione in cui vuoi creare un gateway Cloud NAT.
  2. Prenota un indirizzo IP statico. Una risorsa indirizzo IP riservato mantiene l'indirizzo IP sottostante quando la risorsa a cui è associata viene eliminata e ricreata:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    Sostituisci i seguenti valori in questo comando:

    • ORIGIN_IP_NAME con il nome da assegnare alla risorsa indirizzo IP.
    • REGION con la regione in cui verrà eseguito il router Cloud NAT. Utilizza la stessa regione del servizio Cloud Run per ridurre al minimo la latenza e i costi di rete.
  3. Crea una configurazione del gateway Cloud NAT su questo router per indirizzare il traffico proveniente dalla rete VPC utilizzando l'indirizzo IP statico che hai creato:

    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

    Sostituisci i seguenti valori in questo comando:

    • NAT_NAME con un nome per la risorsa gateway Cloud NAT che vuoi creare.
    • ROUTER_NAME con il nome del tuo router Cloud.
    • REGION con la regione in cui vuoi creare un gateway Cloud NAT.
    • SUBNET_NAME con il nome della subnet.
    • ORIGIN_IP_NAME con il nome della risorsa indirizzo IP riservato che hai creato nel passaggio precedente.

Terraform

  1. Crea un nuovo router Cloud per programmare un gateway Cloud NAT:

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

    Sostituisci cr-static-ip-router con il nome della subnet.

  2. Prenota un indirizzo IP statico. Una risorsa indirizzo IP riservato mantiene l'indirizzo IP sottostante quando la risorsa a cui è associata viene eliminata e ricreata:

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

    Sostituisci cr-static-ip-addr con il nome della subnet.

  3. Crea una configurazione del gateway Cloud NAT su questo router per indirizzare il traffico proveniente dalla rete VPC utilizzando l'indirizzo IP statico che hai creato:

    resource "google_compute_router_nat" "default" {
      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"]
      }
    }

    Sostituisci cr-static-nat con il nome del gateway Cloud NAT.

Instrada il traffico di Cloud Run attraverso la rete VPC

Dopo aver configurato Cloud NAT, esegui il deployment o l'aggiornamento del servizio Cloud Run con il traffico VPC diretto in uscita o il connettore Accesso VPC serverless e imposta il traffico VPC in uscita in modo da instradare tutto il traffico attraverso la rete VPC:

gcloud

  • Uscita diretta VPC

    Per eseguire il deployment o l'aggiornamento del servizio Cloud Run in modo che utilizzi l'egress VPC diretto e instrada tutto il traffico in uscita, esegui il seguente comando:

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

    Sostituisci i seguenti valori in questo comando:

    • SERVICE_NAME con il nome del servizio Cloud Run che vuoi eseguire.
    • IMAGE_URL con un riferimento all'immagine del container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
    • NETWORK con il nome della rete VPC.
    • SUBNET con il nome della subnet.
    • REGION con una regione per il tuo servizio.
  • Connettore di accesso VPC serverless

    Per eseguire il deployment o l'aggiornamento del servizio Cloud Run in modo che utilizzi un connettore di accesso VPC serverless e indirizzi tutto il traffico in uscita, esegui il seguente comando:

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

    Sostituisci i seguenti valori in questo comando:

    • SERVICE_NAME con il nome del servizio Cloud Run che vuoi eseguire.
    • IMAGE_URL con un riferimento all'immagine del container, ad esempio us-docker.pkg.dev/cloudrun/container/hello:latest. Se utilizzi Artifact Registry, il repository REPO_NAME deve essere già stato creato. L'URL ha la forma LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
    • CONNECTOR_NAME con il nome del connettore di accesso VPC serverless.
    • REGION con una regione per il tuo servizio.

Terraform

Questo servizio Cloud Run utilizza un connettore VPC e instrada tutto il traffico in uscita tramite questo connettore:

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

  deletion_protection = false # set to "true" in production

  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"

}

Sostituisci us-docker.pkg.dev/cloudrun/container/hello con un riferimento all'immagine del contenitore.

Verifica l'indirizzo IP esterno statico

Dopo aver completato i passaggi precedenti, hai configurato Cloud NAT sulla tua rete VPC con un indirizzo IP statico predefinito e hai inoltrato tutto il traffico in uscita del servizio Cloud Run alla tua rete VPC. Le richieste del servizio Cloud Run passano per la rete VPC e raggiungono gli endpoint esterni utilizzando l'indirizzo IP statico.

Per verificare questo comportamento e confermare l'indirizzo IP di origine utilizzato dal tuo servizio, puoi inviare una richiesta a un'API o a un sito web come curlmyip.org che mostri l'indirizzo IP di origine.

Eliminazione dell'indirizzo IP esterno statico

Se non hai più bisogno di un indirizzo IP esterno statico, consulta Rilasciare un indirizzo IP esterno statico.