オールアバウトTech Blog

株式会社オールアバウトのエンジニアブログです。

Cloud RunからCloud SQLやMemorystoreへの繋ぎ方

こんにちは!@y_hideshi です。

今回はCloud RunからCloud SQLやMemorystoreにつなぐ方法について紹介します。

  • Cloud SQLへの接続方法
  • Memorystoreへの接続方法

Cloud SQLへの接続方法

検証のため、phpMyAdminからCloud SQLにつなぐシンプルな構成のシステムを作ります。

f:id:allabout-techblog:20200629200338p:plain
Cloud Run - Cloud SQL

事前準備

phpMyAdminイメージの用意

イメージのダウンロード

docker pull phpmyadmin/phpmyadmin:latest

そのままだとCloud Runのサービス作成時に止まってしまいます。そのため、こちらのサイトを参考に修正します。

早い!簡単!30分でCloud Runを使ってphpMyAdmin環境構築!

詳細は上記ページをみていただけるとわかるので割愛しますが、下記のことを行いました

  • 000-default.confの修正
  • config.secret.inc.phpの修正
  • docker-entrypoint.shの修正
  • ports.confの修正
  • 上記のファイルをphpmyadminイメージに組み込むためのDockerfile用意

各種ファイルを用意できたらイメージをbuildして、GCRにpushしておきます

docker build -t cloudrun-phpmyadmin:latest .
docker tag cloudrun-phpmyadmin:latest asia.gcr.io/プロジェクト名/phpmyadmin:latest
docker push asia.gcr.io/プロジェクト名/phpmyadmin:latest

これでイメージの準備は終わりです。

Cloud SQLの用意

こちらはなんでもいいので、とりあえず適当に最小限の構成で作っておきます。

gcloud sql instances create cloud-runt-test \
  --database-version=MYSQL_5_7 \
  --region=asia-northeast1 \
  --storage-size=10 \
  --storage-type=HDD \
  --tier=db-f1-micro \
  --root-password=password123

Cloud SQL Admin APIの有効化

Cloud Run(フルマネージド)には、Cloud SQL Admin API を使用する Cloud SQL Proxy を使用して接続するメカニズムが用意されています。Cloud SQL Proxy には API 割り当て上限が適用されます。

公式ページにある通り、Cloud RunからCloud SQLに接続する際は Cloud SQL Admin API を使用するので有効化しておきます。

f:id:allabout-techblog:20200629165332p:plain
Cloud SQL Admin API

Cloud Runのサービスデプロイ

Cloud RunからCloud SQLへの接続は Cloud SQL Proxy を利用して接続するため、--add-cloudsql-instances オプションを追加してサービスデプロイを行います。 また、Cloud SQL Proxy を利用するにあたり、phpMyAdminからの接続はUnix Socketを利用するようになるため 環境変数---set-env-vars で追加しています。

指定している INSTANCE_CONNECTION_NAME は 下記のような書き方になっており、gcloudコマンドかCloud SQLの詳細ページで確認することができます。

PROJECT_ID:REGION:INSTANCE_ID

Cloud Run デプロイコマンド

$ gcloud run deploy phpmyadmin \
  --image asia.gcr.io/プロジェクト名/phpmyadmin:latest \
  --region asia-northeast1 \
  --platform=managed \
  --allow-unauthenticated \
  --add-cloudsql-instances [INSTANCE_CONNECTION_NAME] \
  --set-env-vars=PMA_HOST=/cloudsql/[INSTANCE_CONNECTION_NAME] \
  --set-env-vars=PMA_SOCKET=/cloudsql/[INSTANCE_CONNECTION_NAME]

サービスデプロイ後、生成されるURLにアクセスしてphpMyAdminからCloud SQLにアクセスできるか確認します。

f:id:allabout-techblog:20200629165204p:plain
phpMyAdminによる確認

まとめ

Cloud RunからCloud SQLに接続する際、下記の点に気をつけてさえいればDBにすぐに接続できると思いますのでぜひ試してみください。

  • Cloud RunからCloud SQLへの接続はUnixドメインソケットを使用して Cloud SQL Proxyで接続する
  • Cloud SQL Proxy を使用して接続する Cloud SQL Admin API を利用するので有効化しておく
  • Cloud Runで指定するサービスアカウントはCloud SQLのロールと権限を割り当てておく

Memorystoreへの接続方法

CloudSQL接続できるようになったので、今度はMemorystoreに接続してみます。 Cloud RunからMemorystoreに接続できることを検証するため、コンテナのイメージにはerikdubbelboer/phpredisadminを利用します。

また、Cloud RunからMemorystoreに接続するにはサーバーレス VPC アクセス コネクタが必要となってくるため、そちらも用意します。

f:id:allabout-techblog:20200629200315p:plain
Cloud Run - Memorystore

事前準備

  • Memorystoreの用意
  • サーバーレス VPC アクセス コネクタの用意

Memorystoreの用意

お金をあまりかけたくないので、最小構成でMemorystoreを構築します。

$ gcloud redis instances create cloudrun-test \
  --size=1 \
  --region=asia-northeast1 \
  --network=projects/プロジェクトID/global/networks/ネットワーク名
  --connect-mode=private-service-access

サーバーレス VPC アクセス コネクタの用意

Serverless VPC Access API 有効化

初めてサーバーレス VPC アクセス コネクタを作る場合は、こちらのAPIを有効化する必要があるので有効化します。

f:id:allabout-techblog:20200629165112p:plain
Serverless VPC Access API

VPCコネクタ作成

コネクタは、接続先のサーバーレス サービスと同じプロジェクトとリージョンに配置する必要があります

GCPの公式に従い、Memorystoreと同じリージョンにVPC コネクタを構築します。 今回はgcloudコマンドで構築していきます。画面からの構築する際もgcloudコマンドで構築する際もオプションが大切になってきますので、各オプションについて紹介していきます。

gcloudコマンドによる作成

$ gcloud compute networks vpc-access connectors create cloudrun-test \
--network [接続元VPCネットワーク] \
--region [VPCコネクタが配置されるリージョン] \
--range [予約されていない/28のIPレンジ]

オプション詳細

オプション 設定する概要 オプション
network 接続元になるVPCネットワーク 必須
region Cloud Runが所属するリージョン 必須
range GCPプロジェクト中で利用されていないネットワーク
(/28でなければならない)
必須
min-throughput VPCコネクタ経由時の最小スループット(default=200) 任意
max-throughput VPCコネクタ経由時の最大スループット(default=300) 任意

※ 設定のポイント VPCコネクタのスループットは指定範囲内でスケールアップするが、スケールダウンはしない点に注意します。

VPCコネクタの確認

describeコマンドでVPCコネクタの設定を確認できます。

$ gcloud compute networks vpc-access connectors describe cloudrun-test --region リージョン
ipCidrRange: 指定したIP範囲
maxThroughput: 300
minThroughput: 200
name: projects/プロジェクトID/locations/リージョン/connectors/VPCコネクタの名前
network: 指定したネットワーク名
state: READY

phpredisadminの用意

Cloud SQLの時と同様に使用するイメージをGCRに上げておきます。

docker pull erikdubbelboer/phpredisadmin:latest
docker tag erikdubbelboer/phpredisadmin:latest asia.gcr.io/プロジェクト名/phpredisadmin:latest
docker push asia.gcr.io/プロジェクト名/phpredisadmin:latest

Cloud Runにデプロイ

$ gcloud beta run deploy phpredisadmin \
  --image asia.gcr.io/プロジェクトID/phpredisadmin:latest \
  --port 80 \
  --vpc-connector cloudrun-test \
  --platform managed \
  --region リージョン \
  --allow-unauthenticated \
  --set-env-vars REDIS_1_HOST=[MeomorystoreのIPアドレス] \
  --set-env-vars REDIS_1_NAME=MemoryStore \
  --set-env-vars REDIS_1_PORT=6379 \
  --set-env-vars REDIS_1_DATABASES=1

※ データベースを指定しないと動作しなかったので指定しています。ソースコードをちゃんとおっていないので明確な原因は説明できませんが、 REDIS_1_DATABASES を指定していない、または、 REDIS_1_DATABASES0 の時は動作しませんでした。

f:id:allabout-techblog:20200629165458p:plain
phpredisadmin

まとめ

Cloud RunからMemorystoreに接続する際は下記の点を押さえておけば容易に接続できると思います。

  • VPCコネクタはMemorystoreと同じリージョンに配置する
  • VPCコネクタが所属するVPCネットワークは関連するサービスと同じVPCネットワークにする

全体のまとめ

今回は、Cloud RunからCloud SQLやMemorystoreに接続する方法を紹介しました。 phpmyadmin・phpredisadminイメージ周りの設定で時間がかかってしまいましたが、シンプルな構造でフルマネージメントなサーバレスシステムを構築できます。 少し問題の切り分けがしづらいと感じることもあるかもしれませんが、困ったときはStackdriver loggingなどを見ながら検証を行っていきましょう!

今度はCloud Runにカスタムドメインを割り当てる方法を実際の設定画面などを見せつつ紹介できていけたらと考えています!

今後ともよろしくお願いいたします。

参考サイト

Cloud SQLへの接続方法

Memorystoreへの接続方法