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
- La salida de VPC directa no está disponible para las funciones de 1ª gen.
- No puedes usar la salida de VPC directa y los conectores de Acceso a VPC sin servidores al mismo tiempo. Consulta Comparar la salida de VPC directa y los conectores de VPC para obtener más información.
Antes de comenzar
- Habilita la API de Cloud Functions.
- Instala Google Cloud CLI y, luego, inicialízala ejecutando
gcloud init. Actualiza los componentes de
gclouda 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.getcompute.subnetworks.getcompute.subnetworks.useen el proyecto host o en la subred específicacompute.addresses.getcompute.addresses.listcompute.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.createInternalcompute.addresses.deleteInternalcompute.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
Para configurar la salida de VPC directa cuando implementes una función, usa el comando
gcloud beta functions deploycon 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_SETTINGReemplaza 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.
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-networky--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_TRAFFICenvía todo el tráfico saliente a través de la red de VPC.VPC_EGRESS_PRIVATE_RANGES_ONLYsolo 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
Crea un directorio nuevo para el servicio de backend y cámbiate a él:
mkdir backend-service cd backend-serviceCrea un archivo
package.jsoncon el siguiente contenido:{ "name": "backend-service", "version": "1.0.0", "description": "", "scripts": { "start": "node index.js" }, "dependencies": { "express": "^4.18.1" } }Crea un archivo
index.jscon 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}`); });Implementa el servicio en Cloud Run con la entrada interna:
gcloud run deploy backend \ --source . \ --no-allow-unauthenticated \ --region=REGION \ --ingress internalReemplaza
REGIONpor tu región, por ejemplo,us-west1.Guarda la URL del nuevo servicio. La necesitarás en la siguiente sección.
Crea y, luego, implementa la función
Crea un directorio nuevo para la función y cámbiate a él:
cd .. mkdir dvpc-function cd dvpc-functionCrea un archivo
package.jsoncon el siguiente contenido:{ "name": "sample-http", "version": "0.0.1", "dependencies": { "axios": "0.21.1", "@google-cloud/functions-framework": "^3.0.0" } }Crea un archivo
index.jscon 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);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_URLReemplaza 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.
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?
- Obtén información sobre la salida de VPC directa y la asignación de IP.
- Consulta las sugerencias para solucionar problemas.
- Compara los métodos de salida en Conéctate a una red de VPC.
- Consulta la referencia del comando
gcloud beta functions deploy.