Dirección IP saliente estática

De forma predeterminada, las cargas de trabajo de Cloud Run se conectan a extremos externos en Internet con un grupo regional de direcciones IP dinámicas que se comparte entre todas las cargas de trabajo sin servidores. Debido a que otras cargas de trabajo comparten este grupo, no debes depender de él cuando necesites una dirección IP de origen predecible o una reputación de IP aislada.

Configura tus cargas de trabajo de Cloud Run para enrutar las solicitudes salientes con una dirección IP estática dedicada en las siguientes situaciones:

  • Te conectas a una base de datos o API externa que usa una lista de direcciones IP permitidas o un firewall.
  • Te conectas a extremos externos sensibles a la reputación, como puertas de enlace de pagos, bases de datos alojadas o APIs de socios protegidas por firewalls de aplicaciones web (WAF) de terceros. El tráfico ruidoso de otro usuario en el grupo de IP compartido predeterminado puede degradar la reputación de la IP y hacer que los WAF externos bloqueen o limiten tus solicitudes.
  • Ejecutas análisis de red autorizados, enumeración de puertos, creación de huellas digitales de hosts, sondeo de vulnerabilidades, extracción de datos web o cargas de trabajo de pruebas de carga.

Para enviar solicitudes salientes desde una dirección IP estática dedicada, configura tu servicio de Cloud Run para que use la salida de VPC directa. También tienes la opción de crear un conector.

Descripción general de la tarea

Para enrutar solicitudes con una dirección IP estática, configura la salida de VPC del servicio para que envíe todo el tráfico saliente (--vpc-egress=all-traffic) a través de una red de VPC. Conecta una puerta de enlace de Cloud NAT a esa red con tu dirección IP estática reservada.

En este instructivo, configurarás Cloud NAT en modo manual y le asignarás una sola dirección IP estática. Si tus cargas de trabajo escalan a muchas instancias de contenedor o abren muchas conexiones simultáneas, como durante el análisis de red autorizado, asigna varias direcciones IP estáticas a Cloud NAT. También puedes aumentar la cantidad mínima de puertos por instancia de contenedor o habilitar la asignación dinámica de puertos para evitar el agotamiento de puertos. Obtén más información sobre cómo las puertas de enlace de Cloud NAT usan direcciones IP y puertos.

Enrutar el tráfico a través de Cloud NAT no agrega un salto adicional en tu pila de red, ya que la puerta de enlace de Cloud NAT y el Cloud Router proporcionan solo un plano de control, y los paquetes no pasan por la puerta de enlace de NAT ni por el Cloud Router.

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

Si usas la salida de VPC directa o un conector de Acceso a VPC sin servidores, las solicitudes de tu servicio de Cloud Run llegan a tu red de VPC. Si quieres enrutar las solicitudes salientes a extremos externos con una IP estática, configura una puerta de enlace de Cloud NAT.

gcloud

  1. Crea un Cloud Router nuevo para programar una puerta de enlace de Cloud NAT:

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

    Reemplaza lo siguiente:

    • ROUTER_NAME: Es un nombre para el recurso de Cloud Router que quieres crear.
    • NETWORK_NAME: Es el nombre de la red de VPC que encontraste antes.
    • REGION: la región en la que deseas crear una puerta de enlace de Cloud NAT.
  2. Reserva una dirección IP estática. Un recurso de dirección IP reservada retiene la dirección IP subyacente cuando el recurso al que está asociado se borra y se vuelve a crear:

    gcloud compute addresses create ORIGIN_IP_NAME --region=REGION

    Reemplaza lo siguiente:

    • ORIGIN_IP_NAME: Es el nombre que deseas 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 costos de red.
  3. Crea una configuración de puerta de enlace de Cloud NAT en este router para enrutar el tráfico que se origina desde la red de VPC con la dirección IP estática que creaste:

    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

    Reemplaza lo siguiente:

    • NAT_NAME: Es un nombre para el recurso de puerta de enlace de Cloud NAT que deseas crear.
    • ROUTER_NAME: Es el nombre de tu Cloud Router.
    • REGION: la región en la que deseas crear una puerta de enlace de Cloud NAT.
    • SUBNET_NAME: el nombre de tu subred.
    • ORIGIN_IP_NAME: Es el nombre del recurso de dirección IP reservada que creaste en el paso anterior.

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

  1. Crea un Cloud Router nuevo para programar una puerta de enlace 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
    }

    Reemplaza cr-static-ip-router por el nombre de la subred.

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

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

    Reemplaza cr-static-ip-addr por el nombre de la subred.

  3. Crea una configuración de puerta de enlace de Cloud NAT en este router para enrutar el tráfico que se origina desde la red de VPC con la dirección IP estática que creaste:

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

    Reemplaza cr-static-nat por el nombre de la puerta de enlace de Cloud NAT.

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

Después de configurar Cloud NAT, implementa o actualiza tu servicio de Cloud Run con la salida de VPC directa o el conector de Acceso a VPC sin servidores, y configura la salida de VPC para enrutar todo el tráfico a través de la red de VPC:

gcloud

Salida de VPC directa

Para implementar o actualizar tu servicio de Cloud Run para usar la salida de VPC directa 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 \
--network=NETWORK \
--subnet=SUBNET \
--region=REGION \
--vpc-egress=all-traffic

Reemplaza lo siguiente:

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

Conector de Acceso a VPC sin servidores

Para implementar o actualizar tu servicio de Cloud Run para usar un conector de Acceso a VPC sin servidores 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

Reemplaza lo siguiente:

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

YAML

Salida de VPC directa

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Realiza actualizaciones según sea necesario.

    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

    Reemplaza lo siguiente:

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

    gcloud run services replace service.yaml

    El comando gcloud run services replace usa de forma predeterminada el archivo service.yaml si está presente.

Conector de Acceso a VPC sin servidores

  1. Si creas un servicio nuevo, omite este paso. Si actualizas un servicio existente, descarga su configuración de YAML:

    gcloud run services describe SERVICE --format export > service.yaml
  2. Realiza actualizaciones según sea necesario.

    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

    Reemplaza lo siguiente:

    • SERVICE: Es el nombre del servicio de Cloud Run.
    • CONNECTOR_NAME: Es el nombre de tu red de Acceso a VPC sin servidores.
    • IMAGE_URL: una referencia a la imagen de contenedor, por ejemplo, us-docker.pkg.dev/cloudrun/container/hello:latest. Si usas Artifact Registry, el repositorio REPO_NAME debe estar creado. La URL sigue el formato de 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

    El comando gcloud run services replace usa de forma predeterminada el archivo service.yaml si está presente.

Terraform

Si deseas obtener más información para aplicar o quitar una configuración de Terraform, consulta los comandos básicos de Terraform.

Salida de VPC directa

Este servicio de Cloud Run usa la salida de VPC directa y enruta todo el tráfico de salida a través de ella:

resource "google_cloud_run_v2_service" "default" {
  name     = "cloudrun-service"
  location = "us-central1"

  deletion_protection = false # set to "true" in production

  template {
    containers {
      image = "us-docker.pkg.dev/cloudrun/container/hello"
    }
    vpc_access {
      network_interfaces {
        network    = "default"
        subnetwork = "default"
        tags       = ["tag1", "tag2", "tag3"]
      }
    }
  }
}

Conector de Acceso a VPC sin servidores

Este servicio de Cloud Run usa un conector de VPC y enruta 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"

}

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

Verifica la dirección IP externa estática

Si completaste los pasos anteriores, configuraste Cloud NAT en tu red de VPC con una dirección IP estática predefinida y enrutaste todo el tráfico saliente de tu servicio de Cloud Run a tu red de VPC. Las solicitudes del servicio de Cloud Run viajan a través de tu red de VPC y llegan a extremos 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 realizar una solicitud a una API o a un sitio web como curlmyip.org, que muestra la dirección IP de origen.

Borra la dirección IP externa estática

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