Descripción general
Con Cloud Run Functions, puedes conectarte directamente a tu red de VPC, lo que permite que tus funciones accedan a instancias de VM de Compute Engine, instancias de Memorystore y otros recursos con una dirección IP interna.
En este lab, usarás el Acceso a VPC sin servidores para conectar una función a tu red de VPC y acceder a los datos de una instancia de Memorystore que se ejecuta en tu red.
También usarás el conector para acceder a un servidor web que se ejecute en una instancia de VM de tu red.
Objetivos
En este lab, aprenderás a hacer lo siguiente:
- Configurar una instancia de Memorystore para Redis
- Crear un conector de Acceso a VPC sin servidores para habilitar el Acceso a VPC sin servidores
- Escribir una función basada en eventos de Pub/Sub que use el conector para almacenar el contenido del mensaje en la base de datos de Redis
- Escribir una función de HTTP para recuperar datos de la base de datos de Redis con el conector y devolver los datos del mensaje en una respuesta HTTP
- Escribir una función de HTTP para acceder a un servidor web que se ejecute en una instancia de VM en tu red de VPC
Esta es una descripción general de los recursos que crearás en este lab:

Configuración y requisitos
Antes de hacer clic en el botón Comenzar lab
Nota: Lee estas instrucciones.
Los labs son cronometrados y no se pueden pausar. El cronómetro, que comienza a funcionar cuando haces clic en Comenzar lab, indica por cuánto tiempo tendrás a tu disposición los recursos de Google Cloud.
En este lab práctico de Qwiklabs, se te proporcionarán credenciales temporales nuevas para acceder a Google Cloud y realizar las actividades en un entorno de nube real, no en uno de simulación o demostración.
Requisitos
Para completar este lab, necesitarás lo siguiente:
- Acceso a un navegador de Internet estándar (se recomienda el navegador Chrome)
- Tiempo para completar el lab
Nota: Si ya tienes un proyecto o una cuenta personal de Google Cloud, no los uses para el lab.
Nota: Si usas una Pixelbook, abre una ventana de incógnito para ejecutar el lab.
Activa Google Cloud Shell
Google Cloud Shell es una máquina virtual que cuenta con herramientas para desarrolladores. Ofrece un directorio principal persistente de 5 GB y se ejecuta en Google Cloud.
Google Cloud Shell proporciona acceso de línea de comandos a tus recursos de Google Cloud.
-
En la consola de Cloud, en la barra de herramientas superior derecha, haz clic en el botón Abrir Cloud Shell.

-
Haz clic en Continuar.
El aprovisionamiento y la conexión al entorno demorarán unos minutos. Cuando te conectes, habrás completado la autenticación, y el proyecto estará configurado con tu PROJECT_ID. Por ejemplo:

gcloud es la herramienta de línea de comandos de Google Cloud. Viene preinstalada en Cloud Shell y es compatible con el completado de línea de comando.
- Puedes solicitar el nombre de la cuenta activa con este comando:
gcloud auth list
Resultado:
Credentialed accounts:
- @.com (active)
Resultado de ejemplo:
Credentialed accounts:
- google1623327_student@qwiklabs.net
- Puedes solicitar el ID del proyecto con este comando:
gcloud config list project
Resultado:
[core]
project =
Resultado de ejemplo:
[core]
project = qwiklabs-gcp-44776a13dea667a6
Nota:
La documentación completa de gcloud está disponible en la
guía de descripción general de gcloud CLI
.
Tarea 1: Habilita las APIs
Antes de crear Cloud Run Functions, debes habilitar las APIs correspondientes.
-
Para configurar el ID del proyecto
y las variables de entorno de la Región
, activa Cloud Shell y, luego, ejecuta los siguientes comandos:
PROJECT_ID=$(gcloud config get-value project)
REGION={{{project_0.default_region|set at lab start}}}
-
Ejecuta el siguiente comando para habilitar todos los servicios necesarios:
gcloud services enable \
artifactregistry.googleapis.com \
cloudfunctions.googleapis.com \
cloudbuild.googleapis.com \
eventarc.googleapis.com \
run.googleapis.com \
logging.googleapis.com \
pubsub.googleapis.com \
redis.googleapis.com \
vpcaccess.googleapis.com
Tarea 2: Configura una instancia de Memorystore para Redis
Memorystore es un servicio de Google Cloud que ofrece una solución de caché en memoria escalable, segura y con alta disponibilidad, completamente administrada para Redis y Memcached.
En esta tarea, configurarás una instancia de Memorystore para Redis en tu proyecto de Google Cloud. La Cloud Run Function usa esta instancia para almacenar datos que desarrollarás en una tarea posterior del lab.
Crea la instancia de Memorystore
-
Configura una variable de entorno para el nombre de la instancia de Memorystore:
REDIS_INSTANCE=customerdb
-
Para crear una instancia de Memorystore para Redis de 2 GiB, ejecuta el siguiente comando:
gcloud redis instances create $REDIS_INSTANCE \
--size=2 --region=$REGION \
--redis-version=redis_6_x
La creación de la instancia de Memorystore para Redis tardará unos minutos en concluirse. Puedes continuar y completar la Tarea 3 para configurar el Acceso a VPC sin servidores y, luego, volver para finalizar los pasos restantes de esta tarea una vez que se cree la instancia de Redis.
-
Para ver los detalles de la instancia después de que se cree correctamente, ejecuta el siguiente comando:
gcloud redis instances describe $REDIS_INSTANCE --region=$REGION
Crea variables de entorno
-
Guarda la dirección IP del host de la instancia de Memorystore en una variable de entorno:
REDIS_IP=$(gcloud redis instances describe $REDIS_INSTANCE --region=$REGION --format="value(host)"); echo $REDIS_IP
-
Guarda el puerto de la instancia de Memorystore en una variable de entorno:
REDIS_PORT=$(gcloud redis instances describe $REDIS_INSTANCE --region=$REGION --format="value(port)"); echo $REDIS_PORT
Usarás los valores de host y de puerto en una tarea posterior para conectarte a la instancia.
Haz clic en Revisar mi progreso para verificar el objetivo.
Configurar una instancia de Memorystore para Redis
Tarea 3: Configura el Acceso a VPC sin servidores
Para enviar solicitudes desde Cloud Run Functions a los recursos de tu red de VPC y recibir las respuestas correspondientes sin usar el Internet público, debes configurar el Acceso a VPC sin servidores.
Configura un conector de Acceso a VPC sin servidores
-
En el menú de navegación (
) de la consola de Google Cloud, en Redes, haz clic en Red de VPC y, luego, selecciona Acceso a VPC sin servidores.
-
Para crear un conector de Acceso a VPC sin servidores, haz clic en Crear conector.
-
En el Nombre del conector, escribe test-connector.
-
En Región, selecciona .
-
En Subred, selecciona Rango de IP personalizado.
-
En Rango de IP, escribe 10.8.0.0.
Nota: El rango de IP debe ser una subred interna /28 sin reservar especificada en notación CIDR. No debe superponerse con ninguna reserva de dirección IP existente en la red de VPC. Este rango se usa cuando se realiza un escalamiento para crear instancias de conectores adicionales.La región especificada para el conector debe ser la misma en la que se alojan tus Cloud Run Functions.
-
Deja el resto de los parámetros con la configuración predeterminada y haz clic en Crear.
Aparecerá una marca de verificación verde junto al nombre del conector cuando esté listo para usarse.
-
Para verificar los detalles del conector, ejecuta el siguiente comando en Cloud Shell:
gcloud compute networks vpc-access connectors \
describe test-connector \
--region $REGION
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear un conector de Acceso a VPC sin servidores
Si te saltaste la Tarea 2 para completar esta tarea mientras se creaba la instancia de Redis, debes volver a ella y completar los pasos restantes.
Tarea 4: Crea una función basada en eventos para Pub/Sub
Ahora que se creó el conector de Acceso a VPC sin servidores, puedes desarrollar una función para acceder a los datos en la instancia de Redis de Memorystore con el conector.
En esta tarea, crearás una función basada en eventos de Pub/Sub en Python para almacenar y recuperar datos de la instancia de Memorystore.
Crea un tema de Pub/Sub
-
Primero, debes crear un tema en el que la función escuchará los mensajes. Establece una variable de entorno para el nombre del tema:
TOPIC=add_redis
-
Para crear un tema, ejecuta el siguiente comando:
gcloud pubsub topics create $TOPIC
Escribe el código de la función
-
Ejecuta el siguiente comando para crear la carpeta y los archivos de la función y navegar a la carpeta:
mkdir ~/redis-pubsub && cd $_
touch main.py && touch requirements.txt
-
Haz clic en el botón Abrir editor en la barra de herramientas de Cloud Shell. Puedes cambiar entre Cloud Shell y el editor de código con los íconos Abrir editor y Abrir terminal según sea necesario.
-
En el editor de Cloud Shell, selecciona la carpeta redis-pubsub
.
-
En el editor, agrega el siguiente código al archivo redis-pubsub/main.py
:
import os
import base64
import json
import redis
import functions_framework
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)
# Triggered from a message on a Pub/Sub topic.
@functions_framework.cloud_event
def addToRedis(cloud_event):
# The Pub/Sub message data is stored as a base64-encoded string in the cloud_event.data property
# The expected value should be a JSON string.
json_data_str = base64.b64decode(cloud_event.data["message"]["data"]).decode()
json_payload = json.loads(json_data_str)
response_data = ""
if json_payload and 'id' in json_payload:
id = json_payload['id']
data = redis_client.set(id, json_data_str)
response_data = redis_client.get(id)
print(f"Added data to Redis: {response_data}")
else:
print("Message is invalid, or missing an 'id' attribute")
-
Para especificar las dependencias del código de la función, agrega el siguiente contenido al archivo redis-pubsub/requirements.txt
.
functions-framework==3.2.0
redis==4.3.4
Implementa y prueba la función
-
Para implementar la función, ejecuta el siguiente comando en Cloud Shell:
gcloud functions deploy python-pubsub-function \
--runtime=python310 \
--region=$REGION \
--source=. \
--entry-point=addToRedis \
--trigger-topic=$TOPIC \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector \
--set-env-vars REDISHOST=$REDIS_IP,REDISPORT=$REDIS_PORT
-
En la ventana emergente para vincular el rol a la cuenta de servicio, ingresa n
.
La función se implementa con un tema de activación de Pub/Sub, el conector de Acceso a VPC sin servidores y variables de entorno que proporcionan a la función la dirección IP y el puerto del host de la instancia de Redis de Memorystore.
Nota: Si ves un error de permisos, espera unos minutos y vuelve a intentar la implementación.
-
Para probar la función, publica un mensaje en el tema:
gcloud pubsub topics publish $TOPIC --message='{"id": 1234, "firstName": "Lucas" ,"lastName": "Sherman", "Phone": "555-555-5555"}'
Visualiza los registros de la función
-
En la consola de Google Cloud, navega a la página de resumen de Cloud Run Functions y haz clic en el nombre python-pubsub-function
.
-
Haz clic en Registros.
-
Verifica la entrada de registro en la que se indica que la carga útil de datos JSON enviada en el mensaje de Pub/Sub se agrega a Redis.

Haz clic en Revisar mi progreso para verificar el objetivo.
Crear una función basada en eventos para Pub/Sub
Tarea 5: Crea una función de HTTP
En esta tarea, crearás una función de HTTP en Python para consultar la instancia de Memorystore para Redis y devolver datos según un identificador que se pasa en la solicitud.
Escribe el código de la función
-
Ejecuta el siguiente comando para crear una carpeta y archivos para la función de HTTP y navegar a la carpeta:
mkdir ~/redis-http && cd $_
touch main.py && touch requirements.txt
-
En la barra de herramientas de Cloud Shell, haz clic en Abrir editor.
-
En el editor de Cloud Shell, selecciona la carpeta redis-http
.
-
En el editor, agrega el siguiente código al archivo redis-http/main.py
:
import os
import redis
from flask import request
import functions_framework
redis_host = os.environ.get('REDISHOST', 'localhost')
redis_port = int(os.environ.get('REDISPORT', 6379))
redis_client = redis.StrictRedis(host=redis_host, port=redis_port)
@functions_framework.http
def getFromRedis(request):
response_data = ""
if request.method == 'GET':
id = request.args.get('id')
try:
response_data = redis_client.get(id)
except RuntimeError:
response_data = ""
if response_data is None:
response_data = ""
return response_data
-
Para especificar las dependencias del código de la función, agrega las siguientes líneas al archivo redis-http/requirements.txt
:
functions-framework==3.2.0
redis==4.3.4
Se recomienda separar las dependencias de cada función para que solo se carguen los módulos necesarios cuando se inicie la instancia de la función. Esto reduce la latencia de la función durante los inicios en frío.
Implementa y prueba la función
-
Para implementar la función, ejecuta el siguiente comando en Cloud Shell:
gcloud functions deploy http-get-redis \
--gen2 \
--runtime python310 \
--entry-point getFromRedis \
--source . \
--region $REGION \
--trigger-http \
--timeout 600s \
--max-instances 1 \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector \
--set-env-vars REDISHOST=$REDIS_IP,REDISPORT=$REDIS_PORT \
--no-allow-unauthenticated
Nota: Si ves un error de permisos, espera unos minutos y vuelve a intentar la implementación.
-
Después de implementar la función, recupera el URI de HTTP de la función y almacénalo en una variable de entorno:
FUNCTION_URI=$(gcloud functions describe http-get-redis --gen2 --region $REGION --format "value(serviceConfig.uri)"); echo $FUNCTION_URI
-
Para probar la función, ejecuta el siguiente comando curl
:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?id=1234"
Nota: Pasa el mismo valor del parámetro id que se usó cuando probaste el activador de funciones de Pub/Sub en la tarea anterior.
-
Verifica que la respuesta de la función de HTTP coincida con los datos JSON que se almacenaron previamente en la instancia de Redis:
{"id": 1234, "firstName": "Lucas" ,"lastName": "Sherman", "Phone": "555-555-5555"}
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear una función de HTTP para conectarse a Redis
Tarea 6: Conéctate a una instancia de VM desde una función de HTTP
Para conectarte a los recursos de tu red de VPC desde Cloud Run Functions, se debe usar un conector de Acceso a VPC sin servidores.
En esta tarea, crearás una VM y una función de HTTP para conectarte a la instancia de VM.
Crea una secuencia de comandos de inicio de VM
-
Antes de crear una VM, en Cloud Shell, descarga una secuencia de comandos de inicio que instale y ejecute un servidor web sencillo:
gcloud storage cp gs://cloud-training/CBL492/startup.sh .
-
Para ver el contenido de la secuencia de comandos de inicio de la VM, ejecuta el siguiente comando:
cat startup.sh
Crea una VM
-
Configura una variable de entorno para la zona en la que se creará la VM:
ZONE={{{project_0.default_zone|set at lab start}}}
-
Para crear una VM con la secuencia de comandos de inicio, ejecuta el siguiente comando:
gcloud compute instances create webserver-vm \
--image-project=debian-cloud \
--image-family=debian-11 \
--metadata-from-file=startup-script=./startup.sh \
--machine-type e2-standard-2 \
--tags=http-server \
--scopes=https://www.googleapis.com/auth/cloud-platform \
--zone $ZONE
-
Agrega una regla de firewall a la red de VPC para permitir que el tráfico HTTP llegue a la VM:
gcloud compute --project=$PROJECT_ID \
firewall-rules create default-allow-http \
--direction=INGRESS \
--priority=1000 \
--network=default \
--action=ALLOW \
--rules=tcp:80 \
--source-ranges=0.0.0.0/0 \
--target-tags=http-server
-
Para verificar que la VM se creó y se está ejecutando, en la consola de Google Cloud, navega a Compute Engine y haz clic en Instancias de VM.
En la lista, debería haber una VM con una marca de verificación verde para indicar que se está ejecutando:

-
Guarda las direcciones IP internas y externas de la VM en variables de entorno. Estas variables se usarán más adelante cuando se pruebe la función.
VM_INT_IP=$(gcloud compute instances describe webserver-vm --format='get(networkInterfaces[0].networkIP)' --zone $ZONE); echo $VM_INT_IP
VM_EXT_IP=$(gcloud compute instances describe webserver-vm --format='get(networkInterfaces[0].accessConfigs[0].natIP)' --zone $ZONE); echo $VM_EXT_IP
Escribe el código de la función
En esta subtarea, escribirás la función de HTTP que, cuando se active, se conectará a la VM que creaste.
-
Ejecuta el siguiente comando para crear una carpeta y archivos para el código de la función de HTTP y navegar a la carpeta:
mkdir ~/vm-http && cd $_
touch main.py && touch requirements.txt
-
En la barra de herramientas de Cloud Shell, haz clic en Abrir editor.
-
En el editor de Cloud Shell, selecciona la carpeta vm-http
.
-
En el editor, agrega el siguiente código al archivo vm-http/main.py
:
import functions_framework
import requests
@functions_framework.http
def connectVM(request):
resp_text = ""
if request.method == 'GET':
ip = request.args.get('ip')
try:
response_data = requests.get(f"http://{ip}")
resp_text = response_data.text
except RuntimeError:
print ("Error while connecting to VM")
return resp_text
La función hace una solicitud HTTP GET al servidor web que se ejecuta en la VM. La dirección IP del extremo del servidor web se pasa a la función como un parámetro de consulta en la URL de la función.
-
En el editor, agrega lo siguiente al archivo vm-http/requirements.txt
:
functions-framework==3.2.0
Werkzeug==2.3.7
flask==2.1.3
requests==2.28.1
Implementa la función
-
Para implementar la función, ejecuta el siguiente comando en Cloud Shell:
gcloud functions deploy vm-connector \
--runtime python310 \
--entry-point connectVM \
--source . \
--region $REGION \
--trigger-http \
--timeout 10s \
--max-instances 1 \
--no-allow-unauthenticated
-
Después de que la función se haya implementado correctamente, ejecuta el siguiente comando para extraer su URL:
FUNCTION_URI=$(gcloud functions describe vm-connector --region $REGION --format='value(url)'); echo $FUNCTION_URI
Prueba la función
-
Prueba la función proporcionando la dirección IP externa de la VM en la URL de la función:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_EXT_IP"
El comando debería devolver la respuesta HTML del servidor web que se ejecuta en la VM:
<html><body><p>Linux startup script from a local file.</p></body></html>
De forma predeterminada, Cloud Run Functions puede acceder a IP o URLs públicas externas. Puedes cambiar este comportamiento modificando la configuración de salida de la función para enrutar el tráfico de tu función a través de tu red de VPC con un conector.
-
Repite la prueba proporcionando la dirección IP interna de la VM a la URL de la función:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_INT_IP"
El tiempo de espera de la función se agota después de aproximadamente 10 segundos, ya que, de forma predeterminada, tu función no puede acceder a la VM en su dirección IP interna.
Se informará un error:
upstream request timeout
Usa el conector de VPC
Para acceder a la VM o a otros recursos internos en tu red de VPC desde tu función, debes usar un conector de Acceso a VPC sin servidores.
-
Vuelve a habilitar la API de Cloud Functions:
gcloud services disable cloudfunctions.googleapis.com
gcloud services enable cloudfunctions.googleapis.com
-
Vuelve a implementar la función de HTTP con el conector de VPC que creaste anteriormente en este lab:
gcloud functions deploy vm-connector \
--runtime python310 \
--entry-point connectVM \
--source . \
--region $REGION \
--trigger-http \
--timeout 10s \
--max-instances 1 \
--no-allow-unauthenticated \
--vpc-connector projects/$PROJECT_ID/locations/$REGION/connectors/test-connector
Nota: Si ves un error de permisos, espera unos minutos y vuelve a intentar la implementación.
-
Después de volver a implementar la función, prueba la conexión interna a la VM:
curl -H "Authorization: bearer $(gcloud auth print-identity-token)" "${FUNCTION_URI}?ip=$VM_INT_IP"
Ahora, la función devuelve la respuesta HTML del servidor web que se ejecuta en la VM:
<html><body><p>Linux startup script from a local file.</p></body></html>
Haz clic en Revisar mi progreso para verificar el objetivo.
Crear una función de HTTP para conectarse a una VM
¡Felicitaciones!
En este lab, creaste una instancia de Memorystore para Redis y configuraste el Acceso a VPC sin servidores para conectar Cloud Run Functions a la instancia en tu red de VPC. Luego, creaste una función basada en eventos de Pub/Sub para conectarte a la instancia de Redis y almacenar el contenido del mensaje. También creaste una función de HTTP para conectarte a la instancia de Redis y recuperar los datos de la instancia según un identificador que se pasa en la solicitud a la función. Por último, creaste una VM y usaste un conector de Acceso a VPC sin servidores para conectar una función de HTTP a la VM a través de su dirección IP interna.
Próximos pasos/Más información
Para obtener más información sobre Memorystore, consulta la documentación:
Para obtener más información sobre el Acceso a VPC sin servidores, consulta la documentación:
Copyright 2020 Google LLC. All rights reserved. Google y el logotipo de Google son marcas de Google LLC. Los demás nombres de productos y empresas pueden ser marcas de las respectivas empresas a las que estén asociados.