Verbindung zu einer Redis-Instanz über einen Cloud Run-Dienst (vollständig verwaltet) herstellen

Sie können über Cloud Run (vollständig verwaltet) eine Verbindung zu einer Redis-Instanz herstellen. Verwenden Sie dazu den serverlosen VPC-Zugriff. Der Cloud Run-Dienst muss sich in derselben Region wie die Redis-Instanz befinden.

Einrichtung

Wenn Sie das Cloud SDK bereits installiert und eine Redis-Instanz erstellt haben, können Sie diese Schritte überspringen.

  1. Installieren Sie das Cloud SDK und initialisieren Sie:

    gcloud init
    
  2. Folgen Sie der Schnellstartanleitung zum Erstellen einer Redis-Instanz. Notieren Sie sich die Zone, die IP-Adresse und den Port der Redis-Instanz.

Serverlosen VPC-Zugriff konfigurieren

Zum Herstellen einer Verbindung zu Ihrer Redis-Instanz benötigt Ihr Cloud Run-Dienst (vollständig verwaltet) Zugriff auf das autorisierte VPC-Netzwerk der Redis-Instanz. Sie benötigen einen Connector für serverlosen VPC-Zugriff, um diesen Zugriff zu aktivieren:

  1. Suchen Sie mit folgendem Befehl den Namen des autorisierten Netzwerks Ihrer Redis-Instanz:

    gcloud redis instances describe INSTANCE_ID --region REGION --format "value(authorizedNetwork)"
    
  2. Folgen Sie der Anleitung unter Connector erstellen, um einen Connector für serverlosen VPC-Zugriff zu erstellen. Achten Sie darauf, dass Sie den Connector in derselben Region wie Ihre Anwendung und Ihre Redis-Instanz erstellen und dass der Connector mit dem autorisierten VPC-Netzwerk der Redis-Instanz verbunden ist. Merken Sie sich den Namen des Connectors.

Beispielanwendung

Diese HTTP-Server-Beispielanwendung stellt eine Verbindung zu einer Redis-Instanz über einen Cloud Run-Dienst (vollständig verwaltet) her.

Klonen Sie das Repository für die gewünschte Programmiersprache und rufen Sie den Ordner auf, der den Beispielcode enthält:

Go

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

Node.js

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

Python

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

Diese Beispielanwendung erhöht einen Redis-Zähler jedes Mal, wenn auf den Endpunkt / zugegriffen wird.

Go

Diese Anwendung verwendet den github.com/gomodule/redigo/redis-Client. Installieren Sie diesen mit dem folgenden Befehl:

go get github.com/gomodule/redigo/redis

// Command redis is a basic app that connects to a managed Redis instance.
package main

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

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

var redisPool *redis.Pool

func incrementHandler(w http.ResponseWriter, r *http.Request) {
	conn := redisPool.Get()
	defer conn.Close()

	counter, err := redis.Int(conn.Do("INCR", "visits"))
	if err != nil {
		http.Error(w, "Error incrementing visitor counter", http.StatusInternalServerError)
		return
	}
	fmt.Fprintf(w, "Visitor number: %d", counter)
}

func main() {
	redisHost := os.Getenv("REDISHOST")
	redisPort := os.Getenv("REDISPORT")
	redisAddr := fmt.Sprintf("%s:%s", redisHost, redisPort)

	const maxConnections = 10
	redisPool = redis.NewPool(func() (redis.Conn, error) {
		return redis.Dial("tcp", redisAddr)
	}, maxConnections)

	http.HandleFunc("/", incrementHandler)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8080"
	}
	log.Printf("Listening on port %s", port)
	if err := http.ListenAndServe(":"+port, nil); err != nil {
		log.Fatal(err)
	}
}

Node.js

Diese Anwendung verwendet das Modul redis.

{
  "name": "memorystore-redis",
  "description": "An example of using Memorystore(Redis) with Node.js",
  "version": "0.0.1",
  "private": true,
  "license": "Apache Version 2.0",
  "author": "Google Inc.",
  "engines": {
    "node": ">=8.0.0"
  },
  "dependencies": {
    "redis": "^3.0.0"
  }
}

'use strict';
const http = require('http');
const redis = require('redis');

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

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

// create a server
http
  .createServer((req, res) => {
    // increment the visit counter
    client.incr('visits', (err, reply) => {
      if (err) {
        console.log(err);
        res.status(500).send(err.message);
        return;
      }
      res.writeHead(200, {'Content-Type': 'text/plain'});
      res.end(`Visitor number: ${reply}\n`);
    });
  })
  .listen(8080);

Python

Diese Anwendung verwendet Flask für das Web-Serving und das redis-py-Paket für die Kommunikation mit der Redis-Instanz.

Flask==1.1.2
gunicorn==20.0.4
redis==3.5.3
import logging
import os

from flask import Flask
import redis

app = Flask(__name__)

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)

@app.route('/')
def index():
    value = redis_client.incr('counter', 1)
    return 'Visitor number: {}'.format(value)

@app.errorhandler(500)
def server_error(e):
    logging.exception('An error occurred during a request.')
    return """
    An internal error occurred: <pre>{}</pre>
    See logs for full stacktrace.
    """.format(e), 500

if __name__ == '__main__':
    # This is used when running locally. Gunicorn is used to run the
    # application on Google App Engine and Cloud Run.
    # See entrypoint in app.yaml or Dockerfile.
    app.run(host='127.0.0.1', port=8080, debug=True)

Anwendung in Cloud Run (vollständig verwaltet) bereitstellen

So stellen Sie die Anwendung bereit:

  1. Kopieren Sie die Datei Dockerfile in das Quellverzeichnis:

    cp cloud_run_deployment/Dockerfile .
    
  2. Erstellen Sie mit Cloud Build ein Container-Image mit folgendem Befehl:

    gcloud builds submit --tag gcr.io/PROJECT_ID/visit-count
    
  3. Stellen Sie den Container in Cloud Run (vollständig verwaltet) bereit:

    gcloud run deploy \
    --image gcr.io/PROJECT_ID/visit-count \
    --platform managed \
    --allow-unauthenticated \
    --region REGION \
    --vpc-connector CONNECTOR_NAME \
    --set-env-vars REDISHOST=REDIS_IP,REDISPORT=REDIS_PORT
    

    wobei

    • PROJECT_ID ist die ID Ihres Google Cloud-Projekts.
    • REGION ist die Region, in der sich der Connector für serverlosen VPC-Zugriff und die Redis-Instanz befinden.
    • CONNECTOR_NAME ist der Name Ihres Connectors.
    • REDIS_IP und REDIS_PORT sind die IP-Adresse und die Portnummer Ihrer Redis-Instanz.

Nach erfolgreichem Abschluss der Bereitstellung wird in der Befehlszeile die URL Ihres Cloud Run-Dienstes angezeigt. Rufen Sie diese URL in einem Webbrowser auf oder verwenden Sie ein Tool wie curl. Die Anzahl der Redis-Instanzen steigt mit den Dienstaufrufen.