使用CloudRun来使用Redis(Memorystore)

这篇文章概括了在Google Cloud Platform(GCP)的服务CloudRun上使用Redis的方法。

由于CloudRund也提供了无服务器VPC访问功能,因此可以使用CloudRun来使用Memorystore(Redis)。
看到CloudRun的功能不断增加,感到非常高兴。

积分

    • フルマネージドなインメモリサービスであるMemorystore(Redis,Memcached)を利用する

 

    • Memorystoreを利用するにはプライベートアドレスでの接続が必要

 

    • GAEやCloudRunから接続する場合はサーバーレスVPCアクセスを利用する

 

    ※GAEやCloudRunはマネージドサービスなのでプライベートアドレスが付与されない

方法

    1. 创建无服务器VPC

 

    1. 创建MemoryStore

 

    创建CloudRun

创建无服务器VPC

创建一个用于访问CloudRun的网络。

在GCP控制台上,前往VPC网络 > 无服务器VPC访问,然后创建连接器(首次需要启用API)。

“例如,可以按照以下方式进行设置。”

スクリーンショット 2020-06-30 12.49.43.png

创建一个Memorystore(Redis)。

接下来,我们将根据以下几点注意事项创建Memorystore(Redis)。

    • ロケーションを 1.で作成したコネクタと同じリージョンにする

 

    • (今回はasia-northeast1)

 

    • ネットワークを1.で作成したコネクタと同じネットワークにする

 

    (今回はdefault)

通过配置这些,可以通过第一部分的连接器访问VPC。

创建CloudRun

最后,将源代码部署到CloudRun上。

在变量设置中指定Redis的IP地址和端口号。

请将在第2步创建的Memorystore的IP地址和端口号设置为以下环境变量。

スクリーンショット 2020-06-30 12.45.50.png

指定服务器无服务VPC连接器用于连接设置。

请按照以下图片的方式设置CloudRun连接器。

スクリーンショット 2020-06-30 12.39.01.png

样本代码

通过访问网站来增加计数

// 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)
    }
}

Dockerfile相当随意…

FROM golang:1.13
RUN mkdir -p /app
WORKDIR /app
COPY . /app
RUN go build /app/main.go
ENTRYPOINT ["/app/main"]

如果能够设置到这一步,我认为已经部属了一个每次重新加载都会递增数值的网站。

请参考以下网站。

从GAE连接到无服务器VPC。
https://cloud.google.com/appengine/docs/standard/python/connecting-vpc?hl=ja#creating_a_connector

使用GAE/Go连接到Redis
https://cloud.google.com/appengine/docs/standard/go/using-memorystore?hl=ja

bannerAds