Configurar los ajustes de red (1.ª gen.)

La configuración de red de las funciones de Cloud Run te permite controlar la entrada y salida de red de funciones concretas. Por ejemplo, puedes usar network settings en los siguientes casos prácticos:

  • Protege tus funciones implementando el control de acceso basado en la red.
  • Hacer que el tráfico de salida de una función cumpla las reglas de cortafuegos, DNS y enrutamiento asociadas a tu red de VPC.
  • Asocia el tráfico de salida de una función a una dirección IP estática.

Para obtener más información sobre los casos prácticos, consulta la sección Ejemplos de casos prácticos.

Configuración de entrada

Los ajustes de entrada controlan si los recursos que están fuera de tu proyecto o del perímetro de servicio de Controles de Servicio de VPC pueden invocar una función. Google Cloud

Para estar sujeto a la política de un perímetro de Controles de Servicio de VPC, un recurso debe pertenecer al servicio que se va a restringir. En el caso de las funciones de Cloud Run (1.ª gen.), el servicio restringido es la API Cloud Functions.

Limitaciones

Las funciones activadas por HTTP que son solo internas solo se pueden invocar mediante solicitudes HTTP que se creen en una red de VPC, como las de Kubernetes Engine, Compute Engine o el entorno flexible de App Engine, o bien mediante recursos de Cloud Scheduler, Cloud Tasks, Workflows o BigQuery que estén en el mismo proyecto o perímetro de VPC Service Controls. Esto significa que las solicitudes HTTP creadas por o enrutadas a través de Pub/Sub o Eventarc no pueden activar estas funciones. Los activadores de eventos siempre se consideran "internos" y se permiten independientemente de la configuración de entrada.

Configurar los ajustes de Ingress

Para restringir el acceso a los recursos desde fuera de tu proyecto o perímetro, especifica uno de los siguientes valores de configuración de entrada:

  • Permitir todo el tráfico: es la opción predeterminada. Se permiten todas las solicitudes entrantes a la función, tanto desde Internet como desde recursos del mismo proyecto.
  • Permitir solo el tráfico interno: solo se permite el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery y las redes de VPC del mismo proyecto o perímetro de Controles de Servicio de VPC. El resto de las solicitudes se deniegan con un error 404.

    En el caso de las solicitudes de una VPC compartida, ten en cuenta lo siguiente:

    • El tráfico se considera interno si la función se implementa en el proyecto host de la VPC compartida.
    • El tráfico se considera interno si el host de la VPC compartida y todos los proyectos de servicio se encuentran dentro del mismo perímetro de Controles de Servicio de VPC.
    • Se deniega el resto del tráfico de las redes de VPC compartidas.
  • Permitir el tráfico interno y el de Cloud Load Balancing: se permite el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery y las redes de VPC del mismo proyecto o perímetro de Controles de Servicio de VPC. Se permite el tráfico de Cloud Load Balancing.

Puedes especificar los ajustes de entrada al desplegar o actualizar tu función mediante la Google Cloud consola, la CLI de Google Cloud o Terraform:

Consola

  1. Abre la página Información general de Functions en la Google Cloud consola:

    Ve a la página Vista general de Cloud Run Functions.

  2. Haz clic en Crear función. También puedes hacer clic en una función para ir a su página de detalles y, a continuación, en Editar.

  3. Despliega la configuración avanzada haciendo clic en Tiempo de ejecución, compilación ....

  4. En la sección Conexiones, selecciona un valor para Ajustes de entrada.

gcloud

Usa el comando gcloud functions deploy para desplegar o actualizar la función y especifica la marca --ingress-settings:

  gcloud functions deploy FUNCTION_NAME 
--trigger-http
--ingress-settings INGRESS_SETTINGS
FLAGS...

donde:

  • FUNCTION_NAME es el nombre de tu función.
  • INGRESS_SETTINGS es uno de los valores admitidos de los ajustes de entrada. A continuación se especifican los posibles valores.

    • all
    • internal-only
    • internal-and-gclb: permite el tráfico interno, así como el tráfico enviado a una IP pública expuesta por Cloud Load Balancing. Bloquea el tráfico enviado a cloudfunctions.net o a cualquier dominio personalizado configurado a través de funciones de Cloud Run. Impide que los usuarios eludan los controles de acceso (Cloud Armor e IAP) que hayan configurado a través de Cloud Load Balancing.
  • FLAGS... hace referencia a otras marcas que se transfieren al comando deploy.

Terraform

Opcional. Para actualizar el campo de configuración de entrada del archivo main.tf de tu recurso de Terraform, incluye el argumento ingress_settings que quieras implementar o actualizar. Si modificas los ajustes de entrada, se volverá a crear la función.

  1. En el archivo main.tf, busca el recurso para el que quieras restringir los ajustes de entrada y actualízalo al ajuste que quieras. Por ejemplo:

    resource "google_cloudfunctions_function" "function" {
      name             = "function"
      location         = "us-central1"
      description      = "Sample function"
      ingress_settings = "INGRESS_SETTINGS"
    }

    donde INGRESS_SETTINGS es uno de los valores admitidos para configuración de entrada. A continuación se especifican los posibles valores.

    • ALLOW_ALL (predeterminado): se permiten todas las solicitudes entrantes a la función, tanto desde Internet como desde recursos del mismo proyecto.
    • ALLOW_INTERNAL_ONLY: Solo se permite el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows y redes de VPC del mismo proyecto o del perímetro de los controles de servicio de VPC.
    • ALLOW_INTERNAL_AND_GCLB: permite el tráfico interno y el tráfico enviado a una IP pública expuesta por Cloud Load Balancing. Bloquea el tráfico enviado a cloudfunctions.net o a cualquier dominio personalizado configurado a través de las funciones de Cloud Run. Impide que los usuarios eludan los controles de acceso (Cloud Armor e IAP) que hayan configurado a través de Cloud Load Balancing.

Si usas Google Cloud Armor con Cloud Load Balancing, puedes crear políticas de seguridad que filtren el tráfico en función de condiciones como la dirección IP, el intervalo de IP, el código de región o los encabezados de solicitud de una solicitud entrante. Para obtener más información, consulta la información general sobre la política de seguridad de Google Cloud Armor.

Configuración de salida

Los ajustes de salida controlan el enrutamiento de las solicitudes HTTP salientes de una función. Para especificar la configuración de salida, debes conectar la función a una red de VPC mediante un conector de Acceso a VPC sin servidor. Los ajustes de salida controlan cuándo se enruta el tráfico a través del conector de tu red de VPC.

Limitaciones

  • Acceso a VPC sin servidor solo admite el enrutamiento del tráfico IPv4. No se admite el tráfico IPv6, aunque tengas rutas IPv6 en tu red de VPC.

  • Para mayor seguridad, Google Cloud bloquea los paquetes de salida a direcciones IP externas en el puerto de destino TCP 25.

  • Las funciones o los servicios de usuario que invoquen funciones o servicios protegidos por una red VPC deben enrutar esas invocaciones a través de un conector de VPC.

Configurar los ajustes de salida

En la configuración de salida, puede especificar lo siguiente:

  • La ruta solo realiza solicitudes a IP privadas mediante el conector VPC: es el valor predeterminado. El tráfico se enruta a través de la red VPC solo si los paquetes que lo transportan tienen destinos que coinciden con lo siguiente:

    Los paquetes que se envían a cualquier otro destino se enrutan desde las funciones de Cloud Run a Internet y no a través de ninguna red de VPC.

  • Dirigir todo el tráfico a través del conector VPC: el tráfico siempre se dirige a través de la red VPC asociada al conector, para todos los destinos de paquetes. Debes usar esta opción en las siguientes circunstancias:

    • Si necesitas enviar tráfico a intervalos de subredes de VPC con intervalos de direcciones IP externas usadas de forma privada. Para obtener más información sobre los intervalos de subredes de VPC, consulta Intervalos de IPv4 válidos en la descripción general de las subredes.
    • Si necesitas enviar tráfico a un punto final de Private Service Connect para APIs de Google cuya dirección sea una dirección IP externa de uso privado. Para obtener más información sobre los puntos finales de Private Service Connect para las APIs de Google, consulta el artículo Acceder a las APIs de Google a través de puntos finales.
    • Si necesitas enviar tráfico a cualquier otro destino de dirección IP externa utilizada de forma privada que se pueda enrutar en la red de VPC del conector. Otros destinos que abarcan direcciones IP externas usadas de forma privada pueden incluir intervalos de subredes de peering, intervalos de subredes de peering creados a partir de intervalos de direcciones IP asignados a servicios y aquellos destinos a los que se puede acceder mediante rutas personalizadas en la red de VPC.

    Si tu red de VPC incluye una ruta predeterminada, los paquetes se pueden seguir enrutando a Internet después de que los procese el conector si configuras una pasarela Cloud NAT para proporcionar servicios de NAT a la subred que usa el conector. Estos paquetes están sujetos a las rutas de tu red de VPC y a las reglas de cortafuegos que se aplican a tu red de VPC. Puedes usar la configuración de rutas y cortafuegos para controlar la salida a Internet de todas las solicitudes salientes enviadas por tu función a través de un conector de acceso a VPC sin servidor.

Puedes especificar la configuración de salida al desplegar o actualizar tu función mediante la Google Cloud consola o la CLI de Google Cloud.

Consola

  1. Abre la página Información general de Functions en la Google Cloud consola:

    Ve a la página Vista general de Cloud Run Functions.

  2. Haz clic en Crear función. También puedes hacer clic en una función para ir a su página de detalles y, a continuación, en Editar.

  3. Despliega la configuración avanzada haciendo clic en Tiempo de ejecución, compilación ....

  4. En la sección Conexiones, en Ajustes de salida, selecciona un conector de acceso a VPC sin servidor.

  5. Selecciona la opción de salida adecuada en función de cómo quieras enrutar el tráfico saliente a través del conector.

gcloud

Usa el comando gcloud functions deploy para desplegar o actualizar la función y especifica la marca --egress-settings:

  gcloud functions deploy FUNCTION_NAME 
--vpc-connector CONNECTOR_NAME
--egress-settings EGRESS_SETTINGS
FLAGS...

donde:

  • FUNCTION_NAME es el nombre de tu función.
  • CONNECTOR_NAME es el nombre del conector de acceso a VPC sin servidor que se va a usar. Para obtener más información, consulta la documentación de gcloud.

  • EGRESS_SETTINGS es uno de los valores admitidos para la configuración de salida. Consulta la documentación de gcloud.

  • FLAGS... hace referencia a otras marcas que se transfieren al comando deploy.

.

Ejemplos de casos prácticos

En los siguientes ejemplos se muestra cómo configurar el acceso a la red en varios casos habituales.

Crear una función a la que no puedan llamar clientes externos

Puedes proteger tus funciones HTTP permitiendo que solo las llamen los recursos del mismo Google Cloud proyecto o del perímetro de servicio de Controles de Servicio de VPC.

  1. Despliega tu función y permite solo el tráfico interno. Usa la Google Cloud consola o Google Cloud CLI:

    Consola

    1. Abre la página Información general de Functions en la Google Cloud consola:

      Ve a la página Vista general de Cloud Run Functions.

    2. Haz clic en Crear función. También puedes hacer clic en una función para ir a su página de detalles y, a continuación, en Editar.

    3. Despliega la configuración avanzada haciendo clic en Tiempo de ejecución, compilación ....

    4. En la sección Conexiones, en Configuración de entrada, selecciona Permitir solo el tráfico interno.

    gcloud

    Usa el comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --ingress-settings internal-only \
    FLAGS...
    

Después de desplegar la función, se bloquearán las solicitudes procedentes de fuera de tu proyectoGoogle Cloud para que no puedan acceder a la función. Si usas Controles de Servicio de VPC, las solicitudes que procedan de fuera del perímetro de servicio se bloquearán. Las instancias de VM de tu proyecto o perímetro de servicio pueden seguir accediendo a tu función enviando solicitudes a su endpoint HTTPS.

Si quieres llamar a esta función restringida desde otra función, la función que llama debe enrutar su salida a través de tu red de VPC.

Usar la configuración de entrada y salida para restringir el acceso

Puedes incorporar tanto el tráfico de entrada como el de salida a tus servicios para añadir una capa adicional de restricción.

  1. Clona el repositorio cloud-run-sample y cambia al directorio vpc-sample:

    git clone https://github.com/GoogleCloudPlatform/cloud-run-samples
    cd vpc-sample

  2. Instala las dependencias de Python:

    pip3 install -r requirements.txt

  3. Puedes abrir el archivo main.py en el directorio vpc-sample para ver la función que vas a implementar:

    def hello_world(request):
        return "Hello World!"

  4. Despliega la función:

    gcloud functions deploy restricted-function 
    --runtime=python38
    --trigger-http
    --no-allow-unauthenticated
    --ingress-settings=internal-only
    --entry-point=hello_world

  5. Configura un conector de Acceso a VPC sin servidor:

    gcloud compute networks vpc-access connectors create serverless-connector 
    --region=SERVICE_REGION
    --range=10.8.0.0/28

    donde SERVICE_REGION es una región de tu conector. Debe coincidir con la región de tu servicio sin servidor. Si tu servicio se encuentra en la región us-central o europe-west, usa us-central1 o europe-west1.

  6. Crea la imagen de contenedor:

    gcloud builds submit --tag=gcr.io/PROJECT_ID/restricted-function-caller .

    donde PROJECT_ID es el ID del proyecto.

    De esta forma, se crea una imagen de contenedor que invoca get_hello_world cuando se despliega desde el archivo main.py:

    import os
    import urllib
    
    import google.auth.transport.requests
    import google.oauth2.id_token
    
    
    def get_hello_world(request):
        try:
            url = os.environ.get("URL")
            req = urllib.request.Request(url)
    
            auth_req = google.auth.transport.requests.Request()
            id_token = google.oauth2.id_token.fetch_id_token(auth_req, url)
            req.add_header("Authorization", f"Bearer {id_token}")
    
            response = urllib.request.urlopen(req)
            return response.read()
    
        except Exception as e:
            print(e)
            return str(e)

  7. Usa el comando gcloud run deploy run-function para desplegar el contenedor de Cloud Run:

      gcloud run deploy run-function 
    --image gcr.io/PROJECT_ID/restricted-function-caller
    --no-allow-unauthenticated
    --update-env-vars=URL=https://SERVICE_REGION-PROJECT_ID.cloudfunctions.net/restricted-function-caller
    --vpc-egress=all
    --vpc-connector=serverless-connector
    --region=SERVICE_REGION

    donde:

    • PROJECT_ID es el ID del proyecto.
    • SERVICE_REGION es una región de tu conector. Debe coincidir con la región de tu servicio sin servidor. Si tu servicio se encuentra en la región us-central o europe-west, usa us-central1 o europe-west1.

    El servicio run-function de Cloud Run ahora está configurado para enviar una solicitud GET desde el conector de VPC a la función con restricciones de red.

Enrutar la salida de la función a través de tu red de VPC

Las redes de VPC Google Cloud admiten una gran variedad de configuraciones y funciones de red. Al enrutar el tráfico de salida de tu función a tu red de VPC, puedes asegurarte de que el tráfico de salida de las funciones de Cloud Run siga las reglas de cortafuegos, DNS, enrutamiento y otras reglas de tu red de VPC, así como usar productos como Cloud NAT.

  1. Configura una red de VPC. Configura una red VPC que ya tengas o crea una siguiendo las instrucciones de la guía Usar redes VPC.

  2. Configura un conector de Acceso a VPC sin servidor. Las funciones de Cloud Run necesitan un conector de acceso a VPC sin servidor para enrutar el tráfico a tu red de VPC. Crea un conector y configura los permisos adecuados siguiendo las instrucciones que se indican en el artículo Conectarse a una red VPC.

  3. Implementa una función que use el conector y enruta todo el tráfico de salida a través del conector. Usa la Google Cloud consolagcloud o la herramienta de línea de comandos:

    Consola

    1. Abre la página Información general de Functions en la Google Cloud consola:

      Ve a la página Vista general de Cloud Run Functions.

    2. Haz clic en Crear función. También puedes hacer clic en una función para ir a su página de detalles y, a continuación, en Editar.

    3. Despliega la configuración avanzada haciendo clic en Tiempo de ejecución, compilación ....

    4. En la sección Conexiones, vaya a Configuración de salida, seleccione su conector de acceso a VPC sin servidor y elija Dirigir todo el tráfico a través del conector VPC.

    gcloud

    Usa el comando gcloud functions deploy:

    gcloud functions deploy FUNCTION_NAME \
    --vpc-connector CONNECTOR_NAME \
    --egress-settings all \
    FLAGS...
    

Una vez que hayas desplegado tu función, todo el tráfico que se origine en ella se enrutará a través de tu red de VPC y se ajustará a las reglas definidas en ella. Ten en cuenta que tu función no podrá acceder a Internet público a menos que configures Cloud NAT. Además, debes configurar Cloud NAT para que asigne todos los intervalos de IP principales y secundarios de todas las subredes a la puerta de enlace NAT. De esta forma, podrás incluir la subred del conector en la asignación.

Asociar la salida de una función a una dirección IP estática

En algunos casos, es posible que quieras que el tráfico procedente de tu función se asocie a una dirección IP estática. Por ejemplo, esto resulta útil si llamas a un servicio externo que solo permite solicitudes de direcciones IP especificadas explícitamente.

  1. Dirige el tráfico de salida de tu función a través de tu red de VPC. Consulta la sección anterior, Salida de la función de enrutamiento a través de tu red de VPC.

  2. Configura Cloud NAT y especifica una dirección IP estática. Sigue las guías Especificar intervalos de subredes para NAT y Especificar direcciones IP para NAT para configurar Cloud NAT en la subred asociada al conector de acceso a VPC sin servidor de tu función. Tu Cloud NAT debe asignar todos los intervalos de IP principales y secundarios de todas las subredes a la pasarela de NAT para incluir la subred del conector en la asignación.

Balanceo de carga multirregional

Puedes implementar una función en diferentes regiones y permitir que la solicitud se envíe a la región operativa más cercana. Para ello, debes configurar un grupo de puntos finales de red (NEG) sin servidor para la función y conectarlo a un balanceador de carga, tal como se describe en el artículo Configurar un balanceador de carga HTTP(S) con NEGs sin servidor.