Establecer la configuración de red

La configuración de red de Cloud Functions te permite controlar la entrada y la salida de red desde y hacia funciones individuales. Por ejemplo, puedes usar la configuración de red para los siguientes casos prácticos:

  • Proteger tus funciones mediante la implementación de un control de acceso basado en la red
  • Hacer que el tráfico de salida de una función se adhiera al firewall, al DNS y a las reglas de enrutamiento asociadas con tu red de VPC
  • Asociar el tráfico de salida de una función con una dirección IP estática

Para obtener más detalles sobre los casos de uso, consulta Casos de uso de ejemplo.

Configuración de ingreso

La configuración de entrada controla si los recursos fuera del proyecto de Google Cloud o el perímetro de servicio de los Controles del servicio de VPC pueden invocar una función.

Para estar sujeto a la política de un perímetro de Controles del servicio de VPC, un recurso debe pertenecer al servicio que se restringirá. Para Cloud Functions (1ª gen.), el servicio restringido es la API de Cloud Functions. Para Cloud Functions (2nd gen), es la API de Administrador de Cloud Run.

Limitaciones

Cloud Functions (1st gen): Solo las funciones de uso interno únicamente se invocan mediante solicitudes HTTP que se crean dentro de una red de VPC, como las de Kubernetes Engine, Compute Engine, el entorno flexible de App Engine o que realizan los recursos de Cloud Scheduler, Cloud Tasks, Workflows o BigQuery que están en el mismo proyecto o en el mismo perímetro de los Controles del servicio de VPC. 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 sin importar la configuración de entrada.

Configura la configuración de ingreso

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

  • Permitir todo el tráfico: Opción predeterminada. Se permiten todas las solicitudes entrantes a la función, de Internet y de los recursos dentro del mismo proyecto.
  • Permitir solo el tráfico interno: Solo está permitido el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery y redes de VPC en el mismo proyecto o el perímetro de los Controles del servicio de VPC. Todas las demás solicitudes se rechazan con un error 404.

    Para las solicitudes de una VPC compartida, ten en cuenta las siguientes consideraciones:

    • El tráfico se considera interno si la función está implementada en el proyecto host de VPC compartida.
    • El tráfico se considera interno si el host de la VPC compartida y todos los proyectos de servicio se ubican dentro del mismo perímetro de Controles del servicio de VPC.
    • El tráfico a una función de Cloud Functions (2nd gen) se considera interno si la función está conectada a la misma red de VPC compartida.
    • Se deniega todo el resto del tráfico de las redes de VPC compartida.
  • Permitir el tráfico interno y el proveniente de Cloud Load Balancing: Se permite el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows, BigQuery y redes de VPC en el mismo proyecto o perímetro de Controles del servicio de VPC. Se permite el tráfico desde Cloud Load Balancing.

Puedes especificar la configuración de entrada cuando implementas o actualizas tu función con la consola de Google Cloud, Google Cloud CLI o Terraform:

Consola

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

    Ir a la página Descripción general de Cloud Functions

  2. Haz clic en Crear función. Como alternativa, haz clic en una función existente para ir a la página de detalles y haz clic en Editar.

  3. Haz clic en Entorno de ejecución, compilación… para expandir la configuración avanzada.

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

gcloud

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

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

En el ejemplo anterior, se ilustra lo siguiente:

  • FUNCTION_NAME es el nombre de la función.
  • INGRESS_SETTINGS es uno de los valores admitidos para la configuración de entrada. Los siguientes son los valores posibles:

    • all
    • internal-only
    • internal-and-gclb: permite el tráfico interno y el tráfico enviado a una IP pública que expone Cloud Load Balancing. Bloquea el tráfico enviado a cloudfunctions.net o a cualquier dominio personalizado que se configura a través de Cloud Functions. Evita que los usuarios eludan los controles de acceso (Cloud Armor, IAP) que configuran a través de Cloud Load Balancing.
  • FLAGS... hace referencia a otras marcas que pasas 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 deseas implementar o actualizar. Cuando se realizan cambios en la configuración de entrada, se vuelve a crear la función.

  1. En tu archivo main.tf, ubica el recurso para el que deseas restringir la configuración de entrada y actualízalo a la configuración que desees, 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 la configuración de entrada. Los siguientes son los valores posibles:

    • ALLOW_ALL (predeterminado): Se permiten todas las solicitudes entrantes a la función, de Internet y de los recursos dentro del mismo proyecto.
    • ALLOW_INTERNAL_ONLY: Solo está permitido el tráfico de Cloud Scheduler, Cloud Tasks, Eventarc, Workflows y redes de VPC en el mismo proyecto o perímetro los controles del servicio de VPC.
    • ALLOW_INTERNAL_AND_GCLB: Permite el tráfico interno y el tráfico enviado a una IP pública que expone Cloud Load Balancing. Bloquea el tráfico enviado a cloudfunctions.net o a cualquier dominio personalizado que se configura a través de Cloud Functions. Evita que los usuarios eludan los controles de acceso (Cloud Armor, IAP) que configuran a través de Cloud Load Balancing.

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

Configuración de salida

La configuración de salida controla 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 servidores. La configuración de salida controla cuándo se enruta el tráfico a través del conector en la red de VPC.

Limitaciones

  • El Acceso a VPC sin servidores solo admite el enrutamiento de tráfico IPv4. El tráfico IPv6 no es compatible, incluso si tienes 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 del usuario que invocan funciones o servicios protegidos por una red de VPC deben enrutar esas invocaciones a través de un conector de VPC.

Establece la configuración de salida

Para la configuración de salida, puedes especificar lo siguiente:

  • Enrutar solo las solicitudes a las IP privadas mediante el conector de VPC: Opción predeterminada. El tráfico se enruta a través de la red de VPC solo si los paquetes que llevan el tráfico tienen destinos que coinciden con lo siguiente:

    Los paquetes a cualquier otro destino se enrutan desde Cloud Functions a Internet y no a través de cualquier red de VPC.

  • Enrutar todo el tráfico mediante el conector de VPC: El tráfico siempre se enruta a través de la red de VPC asociada con el conector para todos los destinos de paquetes. Debes usar esta opción en las siguientes circunstancias:

    • Si necesitas enviar tráfico a rangos de subredes de VPC con rangos de direcciones IP externas utilizados de forma privada. Para obtener más información sobre los rangos de subredes de VPC, consulta Rangos de IPv4 válidos en la descripción general de las subredes.
    • Si necesitas enviar tráfico a un extremo de Private Service Connect para las APIs de Google cuya dirección es una dirección IP externa de uso privado. Si deseas obtener más información sobre los extremos de Private Service Connect para las APIs de Google, consulta Accede a las APIs de Google a través de extremos.
    • Si necesitas enviar tráfico a cualquier otro destino de dirección IP externa de uso privado que se pueda enrutar dentro de la red de VPC del conector. Algunos ejemplos de otros destinos que abarcan direcciones IP externas usadas de forma privada son los rangos de subred de intercambio de tráfico, los rangos de subred de intercambio de tráfico creados a partir de rangos de direcciones IP asignadas para servicios y los destinos a los que se pueda acceder mediante rutas personalizadas en la red de VPC.

    Si tu red de VPC incluye una ruta predeterminada, los paquetes aún se pueden enrutar a Internet después de que el conector los procese si configuras una puerta de enlace de Cloud NAT para proporcionar servicios NAT a la subred que usa el conector. Estos paquetes están sujetos a las rutas de tu red de VPC y las reglas de firewall que se aplican a tu red de VPC. Puedes usar la configuración de la ruta y del firewall para controlar la salida de Internet de todas las solicitudes salientes que envía tu función a través de un conector de Acceso a VPC sin servidores.

Puedes especificar la configuración de salida cuando implementes o actualices tu función con la consola de Google Cloud o Google Cloud CLI:

Consola

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

    Ir a la página Descripción general de Cloud Functions

  2. Haz clic en Crear función. Como alternativa, haz clic en una función existente para ir a la página de detalles y haz clic en Editar.

  3. Haz clic en Entorno de ejecución, compilación… para expandir la configuración avanzada.

  4. En la sección Conexiones, en Configuración de salida, selecciona un conector de Acceso a VPC sin servidores.

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

gcloud

Usa el comando gcloud functions deploy para implementar 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...

En el ejemplo anterior, se ilustra lo siguiente:

  • FUNCTION_NAME es el nombre de la función.
  • CONNECTOR_NAME es el nombre del conector de Acceso a VPC sin servidores que se debe usar. Consulta la documentación sobre gcloud para obtener más información.

  • 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 pasas al comando deploy.

Casos prácticos de ejemplo

En los siguientes ejemplos, se muestra cómo configurar el acceso a la red en varias situaciones comunes.

Crea una función a la que los clientes externos no puedan acceder

Para proteger tus funciones de HTTP, puedes permitir que solo las llamen los recursos en el mismo proyecto de Cloud o el perímetro de servicio de los Controles del servicio de VPC.

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

    Consola

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

      Ir a la página Descripción general de Cloud Functions

    2. Haz clic en Crear función. Como alternativa, haz clic en una función existente para ir a la página de detalles y haz clic en Editar.

    3. Haz clic en Entorno de ejecución, compilación… para expandir la configuración avanzada.

    4. En la sección Conexiones, ve a Configuración de entrada y selecciona Solo se permite el tráfico interno.

    gcloud

    Usa el comando gcloud functions deploy:

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

Después de implementar la función, las solicitudes que se originan fuera de tu proyecto de Google Cloud no pueden alcanzar la función. Si usas los Controles del servicio de VPC, se bloquearán las solicitudes desde fuera del perímetro de servicio. Las instancias de VM que estén dentro del perímetro de servicio o del proyecto aún pueden llegar a tu función mediante solicitudes al extremo de HTTPS.

Si deseas llamar a esta función restringida desde otra función, la función que haga la llamada deberá enrutar la salida a través de tu red de VPC.

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

Puedes incorporar la entrada y salida a tus servicios para agregar una capa adicional de restricción.

  1. Clona el repositorio de 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 estás implementando:

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

  4. Sigue estos pasos para implementar 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 servidores.

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

    En el ejemplo anterior, SERVICE_REGION es una región para el conector; debe coincidir con la región del servicio sin servidores. Si tu servicio se encuentra en la región us-central o europe-west, usa us-central1 o europe-west1.

  6. Compila la imagen del contenedor:

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

    en la que PROJECT_ID es el ID del proyecto.

    Esto compila una imagen de contenedor que invoca get_hello_world cuando se implementa 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 implementar 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 para el conector, que debe coincidir con la región del servicio sin servidores. 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 restringida de la red.

Enruta una salida de función a través de la red de VPC

Las redes de VPC en Google Cloud admiten un amplio conjunto de opciones de configuración y funciones de red. Si enrutas el tráfico de salida de tu función a tu red de VPC, puedes asegurarte de que el tráfico de salida de Cloud Functions siga el firewall, el DNS, el enrutamiento y otras reglas de la red de VPC. También puedes usar productos como Cloud NAT.

  1. Configura una red de VPC. Configura una red de VPC existente o crea una nueva mediante la guía proporcionada en Usa redes de VPC.

  2. Configura un conector de Acceso a VPC sin servidores. Cloud Functions necesita un conector de Acceso a VPC sin servidores para enrutar el tráfico a tu red de VPC. Para crear un conector y configurar los permisos adecuados, sigue las instrucciones en Conéctate a una red de VPC.

  3. Implementa una función que use el conector y enrute toda la salida a través del conector. Usa la consola de Google Cloud o la herramienta de línea de comandos de gcloud:

    Consola

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

      Ir a la página Descripción general de Cloud Functions

    2. Haz clic en Crear función. Como alternativa, haz clic en una función existente para ir a la página de detalles y haz clic en Editar.

    3. Haz clic en Entorno de ejecución, compilación… para expandir la configuración avanzada.

    4. En la sección Conexiones, en Configuración de salida, selecciona el conector de Acceso a VPC sin servidores y Enrutar todo el tráfico a través del conector de VPC.

    gcloud

    Usa el comando gcloud functions deploy:

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

Después de implementar la función, todo el tráfico que provenga de esta se enrutará a través de la red de VPC y cumplirá con las reglas establecidas en la red de VPC. Ten en cuenta que tu función no puede acceder a la Internet pública, a menos que configures Cloud NAT. Además, considera que Cloud NAT debe mapear todos los rangos de IP principales y secundarios para todas las subredes a la puerta de enlace NAT, a fin de incluir la subred del conector en el mapeo.

Asocia una salida de función con una dirección IP estática

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

  1. Enruta la salida de tu función a través de la red de VPC. Consulta la sección anterior, Enruta una salida de función a través de la red de VPC.

  2. Configura Cloud NAT y especifica una dirección IP estática. Sigue las guías en Especifica los rangos de subred para NAT y Especifica direcciones IP para NAT a fin de configurar Cloud NAT para la subred asociada con el conector de Acceso a VPC sin servidores de tu función. Cloud NAT debe mapear todos los rangos de IP principales y secundarios para todas las subredes a la puerta de enlace NAT a fin de incluir la subred del conector en el mapeo.

Balanceo de cargas multirregión

Puedes implementar una función en diferentes regiones y permitir que se envíe la solicitud a la región en buen estado más cercana. A fin de lograrlo, debes configurar un grupo de extremos de red (NEG) sin servidores para la función y conectarlo a un balanceador de cargas, como se describe en Configura un balanceador de cargas HTTP(S) con NEG sin servidores