⚡️

Cloud Run Integrations で Memorystore for Redis にかんたんに接続する + α

2023/12/15に公開

2023年は「Cloud Run を触って覚える」をテーマとした一人アドベントカレンダーを一人で開催しており、Cloud Run のさまざまな機能や、Cloud Run でよく使う構成などを実際の使い方と一緒にご紹介しています。

https://qiita.com/advent-calendar/2023/cloud-run

15日目は Cloud Run と Memorystore for Redis のインテグレーションについてご紹介します。

Cloud Run の概要は技術評論社さまのブログ「gihyo.jp」に寄稿した記事で解説していますのでこちらもぜひご覧ください。

https://gihyo.jp/article/2023/10/modern-app-development-on-google-cloud-03

Memorystore とは

Memorystore はインメモリ サービスのマネージド サービスです。キャッシュ エンジンを提供するスタンダードな OSS である Redis クラスタ、Redis、Memcached と 100% 互換性のあるインメモリ サービスを構築でき、アプリケーションのキャッシュ レイヤーなどに使用できます。

https://cloud.google.com/blog/ja/topics/developers-practitioners/what-memorystore?hl=ja

Memorystore とネットワーク

Memorystore は Cloud SQL と同様 Google 管理のプロジェクトの VPC 内に構築されるため、Cloud Run サービスからアクセスする場合の接続方法について考えなければいけません。

Memorystore への接続方法は「ダイレクト ピアリング」と「プライベート サービス アクセス」を提供しています。

ダイレクト ピアリングは Memorystore インスタンス作成時に、Google 管理のプロジェクトの VPC と自分が管理する VPC とのピアリングを自動的に作成します。デフォルトではこちらの方法を使って作成されます。

プライベート サービス アクセスは Google の各サービスをプライベート IP 経由でアクセスするための方法です。他の Google のサービスも一元管理したりオンプレと接続するなど拡張性があるため、こちらの接続方法が おすすめ です。

プライベート サービス アクセス
プライベート サービス アクセス

Cloud SQL とプライベート接続している場合はプライベート サービス アクセスが既に設定されていますので、Memorystore のプライベート サービス アクセスが既に使える状態になっていることが多いかと思います。

より詳しい機能の説明は、次のドキュメントを参照してください。

https://cloud.google.com/memorystore/docs/redis/networking?hl=ja

Memorystore for Redis を素早く立ち上げて接続する

Cloud Run サービスで Memorystore を使う場合はインスタンスを構築したり VPC への接続方法 (サーバーレス VPC アクセスなど) を設定する必要がありますが、Cloud Run Integrations では Memorystore for Redis が使える状態に簡単に設定できる機能をサポートしています。この機能は現在 (2023年12月) はプレビューで提供しています。

https://cloud.google.com/run/docs/integrate/redis-memorystore?hl=ja

この記事では、Cloud Run サービスからこの機能を使うための手順を紹介します。

Cloud Run サービスを作成する

シンプルな Redis のクライアントアプリが公開されているので、これを Cloud Run サービスとしてデプロイします。基本的には次のチュートリアルに沿って作成します。

https://cloud.google.com/memorystore/docs/redis/connect-redis-instance-cloud-run?hl=ja

今回は Node.js 版を使用しますが、Go や Python のサンプルも公開されています。

https://github.com/GoogleCloudPlatform/nodejs-docs-samples

まずは Cloud Shell を起動します。

Cloud Shell の起動
Cloud Shell の起動

Git リポジトリをクローンし、ディレクトリに移動します。

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

Cloud Run 用の Dockerfile は cloud_run_deployment の中にあるので、ルートに移動します。

cp cloud_run_deployment/Dockerfile .

Dockerfile は Node.js アプリケーションを起動するシンプルな構成です。

Dockerfile
# Use the official lightweight Node.js image.
# https://hub.docker.com/_/node
FROM node:18-slim

# Create and change to the app directory.
WORKDIR /usr/src/app

# Copy application dependency manifests to the container image.
# A wildcard is used to ensure both package.json AND package-lock.json are copied.
# Copying this separately prevents re-running npm install on every code change.
COPY package*.json ./

# Install production dependencies.
RUN npm install --only=production

# Copy local code to the container image.
COPY . ./

# Run the web service on container startup.
CMD [ "npm", "start" ]

gcloud builds submit コマンドを使って Cloud Build 経由でコンテナ イメージを登録します。PROJECT_ID はご自身の Google Cloud プロジェクトに置き換えてください。

gcloud builds submit --region asia-northeast1 --tag gcr.io/PROJECT_ID/visit-count

続いて Cloud Run サービスを作ります。Cloud Run コンソールを開きます。

https://console.cloud.google.com/run

[サービスを作成] をクリックします。

サービスの作成
サービスの作成

[既存のコンテナ イメージから 1 つのリビジョンをデプロイする] を選んだ状態で [選択] をクリックします。

デプロイ方法の選択
デプロイ方法の選択

先ほど登録したコンテナ イメージを選択します。

コンテナ イメージの選択
コンテナ イメージの選択

[リージョン] は asia-northeast1 (東京) を選択します。

リージョンの選択
リージョンの選択

[認証] は [未認証の呼び出しを許可] を選択します。

未認証の呼び出しを許可
未認証の呼び出しを許可

この状態で [作成] をクリックしてデプロイします。Redis の設定は後で行います。

Cloud Run サービスの作成
Cloud Run サービスの作成

Cloud Run サービスの作成が完了しました。

Cloud Run サービスの作成の完了
Cloud Run サービスの作成の完了

Cloud Run Integrations を設定する

次に Cloud Run サービスに対して Integration の設定を行います。[統合] タブを開き [インテグレーションを追加] をクリックします。

インテグレーションの追加
インテグレーションの追加

[Redis - Google Cloud Memorystore] をクリックします。

Memorystore の選択
Memorystore の選択

[名前] と [容量 (GB)] はデフォルト値のままにします。

名前と容量の設定
名前と容量の設定

Memorystore を構成する上で有効化が必要な API がある場合は表示されますので、確認し [有効にする] をクリックします。

必要な API の有効化
必要な API の有効化

作成されるリソースを確認し [SUBMIT] をクリックします。

作成されるリソースの確認
作成されるリソースの確認

Redis インスタンスとのインテグレーションが完了しました。

インテグレーションの完了
インテグレーションの完了

エンドポイントをブラウザで開くと、アクセスするたびにインクリメントされていることが確認できます。

アプリの確認
アプリの確認

アプリが正常に表示できない (Service Unavailable) になる場合は Redis モジュールのバージョンを下げると解消される可能性があります。もしうまく接続できなかったら試してみてください。

サンプルコードでは次のような指定になっています。

package.json
  "dependencies": {
    "redis": "^4.0.0"
  }

3.0.0 に変更し、コンテナ イメージのプッシュとリビジョンのデプロイを再度行います。

package.json
  "dependencies": {
    "redis": "^3.0.0"
  }

+ α (補足情報)

ダイレクト VPC 下り (外向き) に切り替える

Redis インテグレーションでは VPC への接続にサーバーレス VPC アクセスを使用していますが、ダイレクト VPC 下り (外向き) に変更することも可能です。

ダイレクト VPC 下り (外向き)
ダイレクト VPC 下り (外向き)

この 2 つのオプションはリビジョンの設定からワンクリックで切り替えることができます。

アプリの確認

ダイレクト VPC 下り (外向き) は現段階ではプレビューなので、本番環境向けにはサーバーレス VPC アクセスを使用しておき、後からダイレクト VPC 下り (外向き) が GA されたら切り替えるという方法がおすすめです。

Memorystore for Redis クラスタが GA

Memorystore で Redis クラスタが作成できる機能が今年 GA されました。Redis インスタンスに比べて 60 倍のスループット、10 倍のデータ量を処理できるようになり、ゼロ ダウンタイムのスケーリングと予測可能な超低レイテンシを実現しています。

https://cloud.google.com/blog/ja/products/databases/memorystore-for-redis-cluster-launched/?hl=ja

また、リードレプリカを有効にすることで SLA 99% の可用性を保証できるようになりました。

https://cloud.google.com/blog/ja/products/databases/memorystore-for-redis-cluster-is-ga

よりハードなワークロードが求められる場合は Memorystore for Redis クラスタの採用をぜひ検討してください。

詳細は次のドキュメントを参照してください。

https://cloud.google.com/memorystore/docs/cluster/overview?hl=ja

まとめ

Cloud Run サービスでキャッシュ レイヤーとして Memorystore for Redis を簡単に構築する方法を紹介しました。Cloud Run Integrations を使用するとクイックに構築することができるため、シンプルな構成を取りたい場合はおすすめの方法です。

Redis にも Redis インスタンスとして立てるのか Redis クラスタとして立てるのかの選択肢があります。安全性とコストのトレードオフではありますが、ユースケースと要件を前提にどちらを使うべきか選択するようにしましょう。

Google Cloud Japan

Discussion