Cloud Run と Memorystore for Redis の統合機能を試してみた
こんにちは、クラウドエースの佐久間です。2022 年 10 月 7 日に、Cloud Run の統合機能 (プレビュー版) を用いて Memorystore for Redis と接続できるようになりました (リリースノート)。この記事では、実際にその機能を試してみるとともに、従来の接続方法と比較して、どのようなメリットがあるのかを解説します。なお、Cloud Run や Memorystore for Redis の基本的な使い方については扱いませんので、あらかじめご了承ください。
接続方法の新旧比較
まず、従来の接続方法と新しい接続方法の大まかな流れを確認しておきましょう。
従来の接続方法
- Memorystore for Redis インスタンスを作成し、インスタンスのゾーン、IP アドレス、ポート番号をメモする
- サーバーレス VPC アクセス コネクタを作成する
- Cloud Build でコンテナ イメージを構築する
- Cloud Run にコンテナをデプロイする (Memorystore for Redis インスタンスのリージョンと VPC コネクタ名を指定、メモした IP アドレス、ポート番号を環境変数として渡す)
新しい接続方法
- Cloud Build でコンテナ イメージを構築する
- Cloud Run にコンテナをデプロイする
- Cloud Run サービスの 「統合」 タブから、Memorystore for Redis との接続を設定する (必要なリソースは自動で作成される)
従来の接続方法では、手動で Memorystore for Redis インスタンスやサーバーレス VPC アクセス コネクタの作成をしたり、Memorystore for Redis インスタンスの情報を REDISHOST
や REDISPORT
といった環境変数として Cloud Run に渡したりする必要がありました。これに対して、新しい接続方法では、それらの作業を自動で行ってくれます。つまり、従来の接続方法の手順を半分以上スキップできるということになります。さらに、Cloud Run サービスの 「統合」 タブから、作成された Memorystore for Redis インスタンスの情報を確認できるようにもなりました。
使用例
それでは、実際に新しい接続方法を試してみましょう。今回は、Google Cloud が配布しているサンプル アプリケーション (Go) を Cloud Run にデプロイし、Memorystore for Redis と接続してみます。なお、Go の環境構築は事前に行われているものとします。
サンプル アプリケーションの準備
- リポジトリのクローンを作成し、フォルダを移動する
git clone https://github.com/GoogleCloudPlatform/golang-samples
cd golang-samples/memorystore/redis
- 使用するクライアント ライブラリをインストールする
go get github.com/gomodule/redigo/redis
サンプル アプリケーションのソースコード
このアプリケーションは HTTP サーバーです。/
エンドポイントにアクセスされるたびに、Memorystore for Redis に保存した visits
キーのインクリメントし、その結果をクライアントに返します。
// 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.Pool{
MaxIdle: maxConnections,
Dial: func() (redis.Conn, error) { return redis.Dial("tcp", redisAddr) },
}
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
やgo.mod
等をソース ディレクトリにコピーする
cp cloud_run_deployment/Dockerfile .
cp ../go.* .
- Cloud Build を用いてコンテナ イメージを構築する (
<PROJECT_ID>
は適宜置き換えてください)
gcloud builds submit --tag gcr.io/<PROJECT_ID>/visit-count
- Cloud Run にコンテナをデプロイする (
<PROJECT_ID>
と<REGION>
は適宜置き換えてください)
gcloud run deploy visit-count \
--image gcr.io/<PROJECT_ID>/visit-count \
--platform managed \
--allow-unauthenticated \
--region <REGION>
Memorystore for Redis との接続
- Cloud Run のページに移動し、接続したいサービスを選択する
- [統合] タブを選択し、[インテグレーションを追加] をクリックする
- [Redis - Google Cloud Memorystore] を選択する
- Memorystore for Redis インスタンスの名前と容量を適宜設定する (VPC コネクタ名は自動設定)
- [SUBMIT] をクリックする
接続後
接続が完了すると、[統合] タブに自動作成された Memorystore for Redis インスタンスの情報が表示されます。
右上のペンマークをクリックすることで、インスタンスの容量のみ、あとから変更できます。
アプリケーションへのアクセス
それでは早速、デプロイしたアプリケーションにアクセスしてみましょう。作成した Cloud Run サービスのページにある、[URL] をクリックしてください。
アプリケーションに遷移し、画面に Visitor number: 1
と表示されていれば成功です。
/
エンドポイントに何度かアクセスすると、数字が増えていくことが確認できます。
メリットとデメリット
ここまで、Cloud Run と Memorystore for Redis の統合機能を試してきました。最後に、この機能のメリットとデメリットをこれまでの方法と比較してまとめます。
メリット
- 接続に必要な Memorystore for Redis インスタンスやサーバーレス VPC アクセス コネクタの作成を省略できる
- Memorystore for Redis インスタンスの情報をメモし、環境変数として Cloud Run に渡す必要がない
- 接続した Memorystore for Redis インスタンスの情報を Cloud Run サービスのページから確認・編集できる
デメリット
- 使えるリージョンが限定されている
- 既存の Memorystore for Redis インスタンスには接続できない (従来の方法では接続可能)
- 自動作成されるサーバーレス VPC アクセス コネクタの名前は指定できない
まとめ
今回は、Cloud Run と Memorystore for Redis の新しい接続方法について紹介しました。従来の接続方法と比較して、手順が大幅に簡略化され、より簡単に Memorystore for Redis と接続できるようになったことが分かりました。今後、Cloud Run と Memorystore for Redis を用いることがあれば、ぜひこの統合機能を活用してみてください。
Discussion