使用CloudRun来使用Redis(Memorystore)
这篇文章概括了在Google Cloud Platform(GCP)的服务CloudRun上使用Redis的方法。
由于CloudRund也提供了无服务器VPC访问功能,因此可以使用CloudRun来使用Memorystore(Redis)。
看到CloudRun的功能不断增加,感到非常高兴。
积分
-
- フルマネージドなインメモリサービスであるMemorystore(Redis,Memcached)を利用する
-
- Memorystoreを利用するにはプライベートアドレスでの接続が必要
-
- GAEやCloudRunから接続する場合はサーバーレスVPCアクセスを利用する
- ※GAEやCloudRunはマネージドサービスなのでプライベートアドレスが付与されない
方法
-
- 创建无服务器VPC
-
- 创建MemoryStore
- 创建CloudRun
创建无服务器VPC
创建一个用于访问CloudRun的网络。
在GCP控制台上,前往VPC网络 > 无服务器VPC访问,然后创建连接器(首次需要启用API)。
“例如,可以按照以下方式进行设置。”

创建一个Memorystore(Redis)。
接下来,我们将根据以下几点注意事项创建Memorystore(Redis)。
-
- ロケーションを 1.で作成したコネクタと同じリージョンにする
-
- (今回はasia-northeast1)
-
- ネットワークを1.で作成したコネクタと同じネットワークにする
- (今回はdefault)
通过配置这些,可以通过第一部分的连接器访问VPC。
创建CloudRun
最后,将源代码部署到CloudRun上。
在变量设置中指定Redis的IP地址和端口号。
请将在第2步创建的Memorystore的IP地址和端口号设置为以下环境变量。

指定服务器无服务VPC连接器用于连接设置。
请按照以下图片的方式设置CloudRun连接器。

样本代码
通过访问网站来增加计数
// 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