Cloud RunからCloud SQLやMemorystoreへの繋ぎ方
こんにちは!@y_hideshi です。
今回はCloud RunからCloud SQLやMemorystoreにつなぐ方法について紹介します。
- Cloud SQLへの接続方法
- Memorystoreへの接続方法
Cloud SQLへの接続方法
検証のため、phpMyAdminからCloud SQLにつなぐシンプルな構成のシステムを作ります。
事前準備
- phpMyAdminイメージの用意
- Cloud SQLの用意
- Cloud SQL Admin APIの有効化
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
を使用するので有効化しておきます。
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にアクセスできるか確認します。
まとめ
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 アクセス コネクタが必要となってくるため、そちらも用意します。
事前準備
- 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を有効化する必要があるので有効化します。
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_DATABASES
が 0
の時は動作しませんでした。
まとめ
Cloud RunからMemorystoreに接続する際は下記の点を押さえておけば容易に接続できると思います。
全体のまとめ
今回は、Cloud RunからCloud SQLやMemorystoreに接続する方法を紹介しました。 phpmyadmin・phpredisadminイメージ周りの設定で時間がかかってしまいましたが、シンプルな構造でフルマネージメントなサーバレスシステムを構築できます。 少し問題の切り分けがしづらいと感じることもあるかもしれませんが、困ったときはStackdriver loggingなどを見ながら検証を行っていきましょう!
今度はCloud Runにカスタムドメインを割り当てる方法を実際の設定画面などを見せつつ紹介できていけたらと考えています!
今後ともよろしくお願いいたします。
参考サイト
Cloud SQLへの接続方法
- phpMyAdminのイメージ
- Cloud Run(フルマネージド)から Cloud SQL に接続する
- 早い!簡単!30分でCloud Runを使ってphpMyAdmin環境構築!
- gcloud run deploy
- gcloud sql instances create