Configura la salida de VPC directa para funciones de 2ª gen.

La salida de VPC directa te permite enrutar el tráfico desde tu función de Cloud Run Functions (2ª gen.) directamente a tu red de VPC.

Limitaciones

Antes de comenzar

  • Habilita la API de Cloud Functions.
  • Instala Google Cloud CLI y, luego, inicialízala ejecutando gcloud init.
  • Actualiza los componentes de gcloud a la versión 545.0.0 o posterior:

    gcloud components update
    

  • Si aún no tienes una red de VPC en tu proyecto, crea una.

  • Opcional: Si tu función necesita acceder a las APIs y los servicios de Google con sus direcciones IP internas, habilita el Acceso privado a Google en la subred que usas para la salida directa de VPC.

Configura los permisos de IAM

Para autorizar la salida directa de VPC, pídele a tu administrador que otorgue el rol de Invocador de Cloud Run (roles/run.invoker) a la cuenta de servicio de tu función.

Asegúrate de que Cloud Run tenga acceso a la red de VPC mediante uno de los siguientes métodos:

  • Rol Agente de servicio de Cloud Run: De forma predeterminada, el agente de servicio de Cloud Run tiene el rol Agente de servicio de Cloud Run (roles/run.serviceAgent) que contiene los permisos necesarios.

  • Permisos personalizados: Para obtener un control más detallado, otorga al agente de servicio de Cloud Run los siguientes permisos adicionales en el proyecto:

    • compute.networks.get
    • compute.subnetworks.get
    • compute.subnetworks.use en el proyecto host o en la subred específica
    • compute.addresses.get
    • compute.addresses.list
    • compute.addresses.create (obligatorio solo para las subredes de pila doble con IPv6 externa)
    • compute.addresses.delete (solo se requiere para las subredes de pila doble con IPv6 externa)
    • compute.addresses.createInternal
    • compute.addresses.deleteInternal
    • compute.regionOperations.get
  • Rol Usuario de red de Compute: Si no usas el rol predeterminado Agente de servicio de Cloud Run o los permisos personalizados, otorga el rol Usuario de red de Compute (roles/compute.networkUser) en la cuenta de servicio del Agente de servicio de Cloud Run. Las subredes con IPv6 externa también requieren el rol de administrador de IP públicas de Compute (roles/compute.publicIpAdmin).

    Por ejemplo, para otorgar el rol de usuario de red de Compute, ejecuta el siguiente comando:

    gcloud projects add-iam-policy-binding PROJECT_ID \
    --member "serviceAccount:service-PROJECT_NUMBER@serverless-robot-prod.iam.gserviceaccount.com" \
    --role "roles/compute.networkUser"

    Reemplaza lo siguiente:

    • PROJECT_ID: el ID de tu proyecto.
    • PROJECT_NUMBER: El número de proyecto en el que implementas tu función de Cloud Run.

Configura la salida de VPC directa

Configura la salida de VPC directa para funciones de 2ª gen. nuevas o existentes.

gcloud

  1. Para configurar la salida de VPC directa cuando implementes una función, usa el comando gcloud beta functions deploy con marcas para la configuración de tu red.

    gcloud beta functions deploy FUNCTION_NAME \
        --source . \
        --runtime RUNTIME \
        --trigger-http \
        --region REGION \
        --network=NETWORK \
        --subnet=SUBNET \
        --network-tags=NETWORK_TAG_NAMES \
        --direct-vpc-egress=EGRESS_SETTING
    

    Reemplaza lo siguiente:

    • FUNCTION_NAME: Es el nombre de la función.
    • RUNTIME: Es el entorno de ejecución de tu función, por ejemplo, nodejs20.
    • REGION: Es la región en la que implementas la función.
    • Opcional: NETWORK por el nombre de tu red de VPC. Especifica una red de VPC o una subred, o ambas. Si solo especificas una red, la subred usará el mismo nombre que la red.
    • Opcional: SUBNET con el nombre de tu subred Especifica una red de VPC o una subred, o ambas. Si solo especificas una red, la subred usará el mismo nombre que la red. Puedes implementar o ejecutar varias funciones en la misma subred.
    • Opcional: NETWORK_TAG_NAMES por los nombres separados por comas de las etiquetas de red que deseas asociar con una función. Cada función puede tener diferentes etiquetas de red, como network-tag-2.
    • EGRESS_SETTING por un valor de configuración de salida:
      • all: Predeterminado. Envía todo el tráfico saliente a través de la red de VPC.
      • private-ranges-only: Envía solo el tráfico a direcciones internas por medio de la red de VPC.
  2. Opcional: Para quitar todos los parámetros de configuración de salida de VPC directa de una función, vuelve a implementar la función con las marcas --clear-network y --clear-network-tags.

Terraform

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

Para configurar la salida de VPC directa, usa el proveedor de Terraform google-beta.

Usa el ejemplo de salida de VPC directa de Cloud Run Functions (2ª gen.) como punto de partida y actualiza los siguientes campos:

  • service_config.network: Es el nombre de tu red de VPC.
  • service_config.subnetwork: Es el nombre de tu subred de VPC.
  • service_config.direct_vpc_egress: Qué tráfico se enviará a la red de VPC. VPC_EGRESS_ALL_TRAFFIC envía todo el tráfico saliente a través de la red de VPC. VPC_EGRESS_PRIVATE_RANGES_ONLY solo envía tráfico a rangos de direcciones IP privadas a la red de VPC.

Ejemplo: Llama a un servicio interno desde una función

En este ejemplo, se muestra cómo crear un servicio interno de Cloud Run y, luego, llamarlo desde una función de Cloud Run Functions (2ª gen.) que usa la salida directa de VPC.

Crea el servicio de backend interno

  1. Crea un directorio nuevo para el servicio de backend y cámbiate a él:

    mkdir backend-service
    cd backend-service
    
  2. Crea un archivo package.json con el siguiente contenido:

    {
        "name": "backend-service",
        "version": "1.0.0",
        "description": "",
        "scripts": {
            "start": "node index.js"
        },
        "dependencies": {
            "express": "^4.18.1"
        }
    }
    
  3. Crea un archivo index.js con el siguiente contenido:

    const express = require('express');
    const app = express();
    
    app.get('/', (req, res) => {
        res.send("hello world");
    });
    
    const port = parseInt(process.env.PORT) || 8080;
    app.listen(port, () => {
        console.log(`helloworld: listening on port ${port}`);
    });
    
  4. Implementa el servicio en Cloud Run con la entrada interna:

    gcloud run deploy backend \
        --source . \
        --no-allow-unauthenticated \
        --region=REGION \
        --ingress internal
    

    Reemplaza REGION por tu región, por ejemplo, us-west1.

  5. Guarda la URL del nuevo servicio. La necesitarás en la siguiente sección.

Crea y, luego, implementa la función

  1. Crea un directorio nuevo para la función y cámbiate a él:

    cd ..
    mkdir dvpc-function
    cd dvpc-function
    
  2. Crea un archivo package.json con el siguiente contenido:

    {
      "name": "sample-http",
      "version": "0.0.1",
      "dependencies": {
        "axios": "0.21.1",
        "@google-cloud/functions-framework": "^3.0.0"
      }
    }
    
  3. Crea un archivo index.js con el siguiente contenido. Este código realiza una solicitud autenticada al servicio de backend interno.

    const axios = require('axios');
    const functions = require('@google-cloud/functions-framework');
    
    const callVPCService = async (req, res) => {
      const backendUrl = process.env.BACKEND_URL;
    
      if (!backendUrl) {
        console.error('BACKEND_URL environment variable not set.');
        res.status(500).send('BACKEND_URL not configured.');
        return;
      }
    
      try {
        const metadataServerURL = 'http://metadata.google.internal/computeMetadata/v1/instance/service-accounts/default/identity?audience=';
        const tokenUrl = metadataServerURL + backendUrl;
    
        const tokenResponse = await axios.get(tokenUrl, {
          headers: {
            'Metadata-Flavor': 'Google',
          },
        });
        const token = tokenResponse.data;
    
        const response = await axios.get(backendUrl, {
          headers: {
            Authorization: `bearer ${token}`,
          },
    });
    
    res.status(200).send(`Response from backend: ${response.data}`);
      } catch (error) {
        console.error(`Error calling backend service: ${error.message}`);
        res.status(500).send(`Error calling backend: ${error.message}`);
      }
    };
    
    functions.http('callVPCService', callVPCService);
    
  4. Implementa la función con la salida de VPC directa configurada para enrutar todo el tráfico a tu red de VPC predeterminada:

    gcloud beta functions deploy my-2ndgen-function \
      --source . \
      --runtime nodejs20 \
      --trigger-http \
      --entry-point callVPCService \
      --network=default \
      --subnet=default \
      --direct-vpc-egress=all \
      --region=REGION \
      --allow-unauthenticated \
      --set-env-vars BACKEND_URL=BACKEND_URL
    

    Reemplaza lo siguiente:

    • REGION: Es la región en la que implementaste el servicio de backend.
    • BACKEND_URL: Es la URL del servicio de backend que creaste.
  5. Después de implementar la función, invócala visitando su URL. La función llama al servicio de backend interno y devuelve su respuesta.

¿Qué sigue?