Esta página se ha traducido con Cloud Translation API.
Switch to English

Conéctate a una instancia de Redis desde Cloud Functions

Puedes conectarte a una instancia de Redis desde Cloud Functions mediante el acceso a VPC sin servidores. Tus funciones deben estar en la misma región que la instancia de Redis.

Configuración

Si ya instalaste el SDK de Cloud y creaste una instancia de Redis, puedes omitir estos pasos.

  1. Instala el SDK de Cloud y, luego, inicializa:

    gcloud init
    
  2. Sigue la Guía de inicio rápido para crear una instancia de Redis. Anota la zona, la dirección IP y el puerto de la instancia de Redis.

Configura el Acceso a VPC sin servidores

Para conectarte desde Cloud Functions a la red de VPC autorizada de tu instancia de Redis, debes configurar el acceso a VPC sin servidores.

  1. Encuentra la red autorizada de tu instancia de Redis mediante la ejecución del siguiente comando:

    gcloud beta redis instances describe [INSTANCE_ID] --region [REGION]
    
  2. Sigue las instrucciones para crear un conector a fin de crear un conector de Acceso a VPC sin servidores. Asegúrate de crear el conector en la misma región que tu función y tu instancia de Redis, y asegúrate de que el conector esté conectado a la red de VPC autorizada de la instancia de Redis. Recuerda el nombre del conector.

Función de muestra

Esta función de muestra establece una conexión a una instancia de Redis desde Cloud Functions.

Clona el repositorio de tu lenguaje de programación deseado y navega a la carpeta que contiene el código de muestra:

Go

git clone https://github.com/GoogleCloudPlatform/golang-samples
cd golang-samples/functions/memorystore/redis

Node.js

git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples
cd nodejs-docs-samples/functions/memorystore/redis

Python

git clone https://github.com/GoogleCloudPlatform/python-docs-samples
cd python-docs-samples/functions/memorystore/redis

El código de muestra genera un aumento en un contador de Redis cada vez que se activa la función.

Go

Esta función usa el cliente github.com/gomodule/redigo/redis.


// Package visitcount provides a Cloud Function that connects
// to a managed Redis instance.
package visitcount

import (
	"errors"
	"fmt"
	"log"
	"net/http"
	"os"

	"github.com/gomodule/redigo/redis"
)

var redisPool *redis.Pool

// initializeRedis initializes and returns a connection pool
func initializeRedis() (*redis.Pool, error) {
	redisHost := os.Getenv("REDISHOST")
	if redisHost == "" {
		return nil, errors.New("REDISHOST must be set")
	}
	redisPort := os.Getenv("REDISPORT")
	if redisPort == "" {
		return nil, errors.New("REDISPORT must be set")
	}
	redisAddr := fmt.Sprintf("%s:%s", redisHost, redisPort)

	const maxConnections = 10
	return &redis.Pool{
		MaxIdle: maxConnections,
		Dial: func() (redis.Conn, error) {
			c, err := redis.Dial("tcp", redisAddr)
			if err != nil {
				return nil, fmt.Errorf("redis.Dial: %v", err)
			}
			return c, err
		},
	}, nil
}

// VisitCount increments the visit count on the Redis instance
// and prints the current count in the HTTP response.
func VisitCount(w http.ResponseWriter, r *http.Request) {
	// Initialize connection pool on first invocation
	if redisPool == nil {
		// Pre-declare err to avoid shadowing redisPool
		var err error
		redisPool, err = initializeRedis()
		if err != nil {
			log.Printf("initializeRedis: %v", err)
			http.Error(w, "Error initializing connection pool", http.StatusInternalServerError)
			return
		}
	}

	conn := redisPool.Get()
	defer conn.Close()

	counter, err := redis.Int(conn.Do("INCR", "visits"))
	if err != nil {
		log.Printf("redis.Int: %v", err)
		http.Error(w, "Error incrementing visit count", http.StatusInternalServerError)
		return
	}
	fmt.Fprintf(w, "Visit count: %d", counter)
}

Node.js

Esta función usa el módulo redis.


const {promisify} = require('util');
const redis = require('redis');

const REDISHOST = process.env.REDISHOST || 'localhost';
const REDISPORT = process.env.REDISPORT || 6379;

const redisClient = redis.createClient(REDISPORT, REDISHOST);
redisClient.on('error', err => console.error('ERR:REDIS:', err));

const incrAsync = promisify(redisClient.incr).bind(redisClient);

exports.visitCount = async (req, res) => {
  try {
    const response = await incrAsync('visits');
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(`Visit count: ${response}`);
  } catch (err) {
    console.log(err);
    res.status(500).send(err.message);
  }
};

Python

Esta función usa el paquete redis-py.


import os

import redis

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)

def visit_count(request):
    value = redis_client.incr('visits', 1)
    return 'Visit count: {}'.format(value)

Implementa la muestra en Cloud Functions

Implementa la función mediante el uso de la herramienta de línea de comandos de gcloud:

Go

gcloud functions deploy VisitCount \
--runtime go111 \
--trigger-http \
--region [REGION] \
--vpc-connector projects/[PROJECT_ID]/locations/[REGION]/connectors/[CONNECTOR_NAME] \
--set-env-vars REDISHOST=[REDIS_IP],REDISPORT=[REDIS_PORT]

Node.js

gcloud functions deploy visitCount \
--runtime nodejs10 \
--trigger-http \
--region [REGION] \
--vpc-connector projects/[PROJECT_ID]/locations/[REGION]/connectors/[CONNECTOR_NAME] \
--set-env-vars REDISHOST=[REDIS_IP],REDISPORT=[REDIS_PORT]

Python

gcloud functions deploy visit_count \
--runtime python37 \
--trigger-http \
--region [REGION] \
--vpc-connector projects/[PROJECT_ID]/locations/[REGION]/connectors/[CONNECTOR_NAME] \
--set-env-vars REDISHOST=[REDIS_IP],REDISPORT=[REDIS_PORT]

Donde:

  • [PROJECT_ID] es el ID de tu proyecto de Google Cloud.
  • [REGION] es la misma región en la que se encuentran el conector de acceso a VPC sin servidores y la instancia de Redis.
  • [CONNECTOR_NAME] es el nombre del conector.
  • [REDIS_IP] y [REDIS_PORT] son la dirección IP y el número de puerto de tu instancia de Redis.

Una vez que finalice la implementación de la función, verifica el aumento de recuento de visitas mediante el envío de una solicitud GET a la URL de tu función:

Go

https://[REGION]-[PROJECT_ID].cloudfunctions.net/VisitCount

Node.js

https://[REGION]-[PROJECT_ID].cloudfunctions.net/visitCount

Python

https://[REGION]-[PROJECT_ID].cloudfunctions.net/visit_count