Dirección IP de salida estática

De forma predeterminada, un servicio de Cloud Run se conecta a puntos finales externos en Internet mediante un grupo de direcciones IP dinámicas. Si el servicio de Cloud Run se conecta a un endpoint externo que requiere una dirección IP estática, como una base de datos o una API que usa un cortafuegos basado en direcciones IP, debes configurar el servicio de Cloud Run para que enrute las solicitudes mediante una dirección IP estática.

En esta página se describe cómo habilitar un servicio de Cloud Run para que envíe solicitudes mediante una dirección IP estática.

Te recomendamos que configures Cloud Run para enviar tráfico a una red de VPC mediante la salida directa de VPC. Sin embargo, puedes crear un conector.

Resumen de la tarea

Para habilitar un servicio de Cloud Run para que enrute las solicitudes mediante una dirección IP estática, configura la salida de VPC del servicio de Cloud Run para que enrute todo el tráfico saliente a través de una red de VPC que tenga una pasarela Cloud NAT configurada con la dirección IP estática.

En este tutorial, configurarás Cloud NAT en modo manual y le asignarás una sola dirección IP estática. Si tus cargas de trabajo de Cloud Run se escalan a un número elevado, es posible que tengas que asignar varias direcciones IP estáticas a Cloud NAT. Consulta más información sobre cómo usan las direcciones IP y los puertos las pasarelas de Cloud NAT.

Si enrutas el tráfico a través de Cloud NAT, no se produce ningún salto adicional en tu pila de redes, ya que la pasarela de Cloud NAT y Cloud Router solo proporcionan un plano de control y los paquetes no pasan por la pasarela de NAT ni por Cloud Router.

Configurar la traducción de direcciones de red (NAT)

Si usas la salida de VPC directa o un conector de acceso a VPC sin servidor, las solicitudes de tu servicio de Cloud Run llegarán a tu red de VPC. Si quieres enrutar solicitudes salientes a endpoints externos mediante una IP estática, configura una pasarela Cloud NAT.

gcloud

  1. Crea un router de Cloud para programar una pasarela de Cloud NAT:

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

    Haz los cambios siguientes:

    • ROUTER_NAME: nombre del recurso de Cloud Router que quieras crear.
    • NETWORK_NAME: el nombre de la red VPC que has encontrado antes.
    • REGION: la región en la que quieres crear una pasarela de Cloud NAT.
  2. Reserva una dirección IP estática. Un recurso de dirección IP reservada conserva la dirección IP subyacente cuando se elimina y se vuelve a crear el recurso al que está asociado:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    Haz los cambios siguientes:

    • ORIGIN_IP_NAME: el nombre que quieras asignar al recurso de dirección IP.
    • REGION: la región en la que se ejecutará el router de Cloud NAT. Usa la misma región que tu servicio de Cloud Run para minimizar la latencia y los costes de red.
  3. Crea una configuración de pasarela Cloud NAT en este router para enrutar el tráfico procedente de la red de VPC mediante la dirección IP estática que has creado:

    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

    Haz los cambios siguientes:

    • NAT_NAME: nombre del recurso de pasarela Cloud NAT que quieras crear.
    • ROUTER_NAME: el nombre de tu Cloud Router.
    • REGION: la región en la que quieres crear una pasarela de Cloud NAT.
    • SUBNET_NAME: el nombre de tu subred.
    • ORIGIN_IP_NAME: el nombre del recurso de dirección IP reservada que has creado en el paso anterior.

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

  1. Crea un router de Cloud para programar una pasarela de Cloud NAT:

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

    Sustituye cr-static-ip-router por el nombre de tu subred.

  2. Reserva una dirección IP estática. Un recurso de dirección IP reservada conserva la dirección IP subyacente cuando se elimina y se vuelve a crear el recurso al que está asociado:

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

    Sustituye cr-static-ip-addr por el nombre de tu subred.

  3. Crea una configuración de pasarela Cloud NAT en este router para enrutar el tráfico procedente de la red de VPC mediante la dirección IP estática que has creado:

    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"]
      }
    }

    Sustituye cr-static-nat por el nombre de tu pasarela de Cloud NAT.

Dirigir el tráfico de Cloud Run a través de la red de VPC

Una vez que Cloud NAT esté configurado, implementa o actualiza tu servicio de Cloud Run con salida directa de VPC o el conector Acceso a VPC sin servidor y define la salida de VPC como enrutar todo el tráfico a través de la red de VPC:

gcloud

Salida de VPC directa

Para desplegar o actualizar tu servicio de Cloud Run para que use la salida de VPC directa y enrute todo el tráfico de salida a través de ella, ejecuta el siguiente comando:

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

Haz los cambios siguientes:

  • SERVICE_NAME: el nombre del servicio de Cloud Run que quieres desplegar.
  • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  • NETWORK: el nombre de tu red de VPC.
  • SUBNET: el nombre de tu subred.
  • REGION: una región para tu servicio.

Conector de Acceso a VPC sin servidor

Para implementar o actualizar tu servicio de Cloud Run para que use un conector de acceso a VPC sin servidor y enrutar todo el tráfico de salida a través de él, ejecuta el siguiente comando:

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

Haz los cambios siguientes:

  • SERVICE_NAME: el nombre del servicio de Cloud Run que quieres desplegar.
  • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  • CONNECTOR_NAME: el nombre de tu conector de acceso a VPC sin servidor.
  • REGION: una región para tu servicio.

YAML

Salida de VPC directa

  1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Haga los cambios necesarios.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/network-interfaces: '[{"network":"NETWORK","subnetwork":"SUBNET"}]'
            run.googleapis.com/vpc-access-egress: all-traffic
        spec:
          containers:
          - image: IMAGE_URL

    Haz los cambios siguientes:

    • SERVICE: nombre del servicio de Cloud Run.
    • NETWORK: el nombre de tu red de VPC.
    • SUBNET: el nombre de tu subred.
    • IMAGE_URL: la URL de la imagen del contenedor de tu servicio.
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

Conector de Acceso a VPC sin servidor

  1. Si va a crear un servicio, puede saltarse este paso. Si va a actualizar un servicio, descargue su configuración YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Haga los cambios necesarios.

    apiVersion: serving.knative.dev/v1
    kind: Service
    metadata:
      name: SERVICE
    spec:
      template:
        metadata:
          annotations:
            run.googleapis.com/vpc-access-connector: CONNECTOR_NAME
        spec:
          containers:
          - image: IMAGE_URL

    Haz los cambios siguientes:

    • SERVICE: nombre del servicio de Cloud Run.
    • CONNECTOR_NAME: el nombre de tu red de acceso a VPC sin servidor.
    • IMAGE_URL: una referencia a la imagen del contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME ya debe estar creado. La URL sigue el formato LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/PATH:TAG .
  3. Crea o actualiza el servicio con el siguiente comando:

    gcloud run services replace service.yaml

Terraform

Para saber cómo aplicar o quitar una configuración de Terraform, consulta Comandos básicos de Terraform.

Este servicio de Cloud Run usa un conector de VPC y dirige todo el tráfico de salida a través de él:

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"

}

Sustituye us-docker.pkg.dev/cloudrun/container/hello por una referencia a la imagen de tu contenedor.

Verificar la dirección IP externa estática

Después de completar los pasos anteriores, habrás configurado Cloud NAT en tu red VPC con una dirección IP estática predefinida y habrás enrutado todo el tráfico saliente de tu servicio de Cloud Run a tu red VPC. Las solicitudes de tu servicio de Cloud Run viajan a través de tu red VPC y llegan a los endpoints externos mediante la dirección IP estática.

Para verificar este comportamiento y confirmar la dirección IP de origen que usa tu servicio, puedes enviar una solicitud a una API o a un sitio web como curlmyip.org, que muestra la dirección IP de origen.

Eliminar la dirección IP externa estática

Si ya no necesitas una dirección IP externa estática, consulta Liberar una dirección IP externa estática.