Cloud Run(マネージド版)でCloud Memorystoreに接続する

# 本記事で言いたいこと
1. Cloud RunのマネージドからMemorystoreへの接続が可能になりさらに素晴らしいサービスへと進化
2. Cloud SQLを使用するよりはほんの1手間いるがそれでも接続は容易

# 本記事で説明しないこと
- VPCのネットワーク設計


# 事前準備

## Cloud Memorystore

まずは接続するCloud Memorystoreのインスタンスを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/4d1b9c53-635c-a3da-1150-af6c2280e7f5.png)

Cloud Runにてデプロイするリージョンに合わせて設定し、他は好みでよいと思いますが、本番環境で使用する場合は可用性を高くするために階層はスタンダードを選択するようにした方がいいです。
また容量により料金も高くなりますが、容量と同時にネットワークスループットも高くなります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/e75c33d6-13f6-12f8-b0f7-c92554bf80f0.png)

注意するのはネットワークの設定です。初期値はリージョンに基づくVPCネットワークのdefaultという値が使用されています。もし使用するVPCネットワークを変更する際はこちらを編集する必要があります。（本記事通りにdefautlで設定しても動作することは動作します）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/56704b67-14f5-2aa9-4bd1-376a39600040.png)

## Serverless VPC Access
https://cloud.google.com/vpc/docs/configure-serverless-vpc-access
次にCloud Runから作成したMemorystoreに繋ぐためのサーバーレスVPCアクセスコネクタを作成します。
GCPのコンソールからは以下のようなメニューから開くことができます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/38025c0e-4b16-8e98-6964-d08b2b47c10e.png)

初回はAPIを有効にする必要があるので、有効化します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/c6513b1a-2f53-edff-745e-e63b9f345e5e.png)

コンソール画面上部にある「コネクタ作成」からVPCへのアクセスするコネクタを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/de6a1126-b9be-c5ba-0a6a-9ec3b2b837f9.png)

ここで大事なのは指定するIP範囲です。コネクタにて使用するIPの範囲となるので、Cloud Memorystoreで作成したRedisインスタンスのIPもそうですが、 **予約されていないIPレンジ** を指定する必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/98394744-9d6f-fc9c-156b-932f9ae1ce6c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/70363/661ab92f-56e9-ce4d-56c0-b54647f70ea0.png)

# Cloud Run

ここからは実際にCloud RunにデプロイするアプリケーションからMemorystoreまでの接続の設定を説明します。

## Railsアプリケーション
まずは使用するアプリケーションの準備をします。今回は例としてRailsを使用するとして以下のアプリケーションを用意しました。
https://github.com/chimame/connection-memorystore-rails-from-cloudrun

READMEに記載はしているのですが、1つ1つ説明していきます。

## Cloud Build

まずはRailsを動かすためのコンテナを用意する必要がありますので、その前段階であるコンテナイメージを準備します。
コンテナのビルドは私が以前記載したKanikoを使用する方法でビルドすることができますのでそちらも興味あれば目を通してみて下さい。
https://qiita.com/chimame/items/e959843e86419f51e45a

この記事を書いている2020年5月17日現在はCloud RunからVPCへの接続設定はBeta版であるため使用できるようにBetaのインストールを実施します。

```sh
$ gcloud components install --quiet beta
```

次にKanikoを使用するためのオプションを有効にしておきます。

```sh
$ gcloud config set builds/use_kaniko True
```

最後にコンテナイメージをビルドするためにCloud Buildのコマンドを実行します。Cloud Buildの設定は `cloudbuild.yml` に固有の設定が必要なので必要に応じて修正して下さい。

```sh
$ gcloud builds submit --project <Google Cloud Platform Project ID> --config ./cloudbuild.yml
```

これでCloud Runにデプロイするためのコンテナイメージのビルドが完了です。簡単ですね。

## Cloud RunでMemorystoreを使用する
本記事の1番重要かつ伝えたい内容のコマンドであるCloud RunのデプロイとVPCへの接続です。

```sh
$ gcloud beta run deploy <your cloud run service name> \
  --image gcr.io/<Google Cloud Platform Project ID>/<Container Image Name>:latest \
  --vpc-connector <your serverless vpc access connector name> \
  --platform managed \
  --region asia-northeast1 \
  --allow-unauthenticated \
  --set-env-vars RAILS_ENV=production \
  --set-env-vars RAILS_MASTER_KEY=<your Rails master key> \
  --set-env-vars REDIS_HOST=<your Cloud Memorystore instance host ip> \
  --set-env-vars REDIS_PORT=6379
```

一番大事なオプションは `vpc-connector` です。これはBetaをインストールすることで使用することができます。ここの指定するのは作成したVPCアクセスコネクタの名称です。なので本記事内では 「cloudrun-connector」 として作成したのでそれを指定することになります。
更には接続するRedisのホスト名を指定します。これもCloud Memorystoreで作成したインスタンスのIPアドレスを指定すれば接続が可能なはずです。

# 最後に
ついにマネージド版のCloud RunもMemorystoreへの接続が来ました。Cloud SQL同様に接続まで結構楽に行うことができます。これが正式リリースされればCloud Runの死角はかなり少なるでしょう。
ただし、Serverless VPC Accessは使用することでCloud Memorystoreとは別に料金はかかるのでそこは使用に注意して下さい。
https://cloud.google.com/vpc/docs/configure-serverless-vpc-access#pricing

個人的に後はCloud Load Balancingからの接続が可能となると完璧なサーバレスになると思って期待しております。