Cloud Run にデプロイした phpMyAdmin から Cloud SQL に接続しようとしたところ、思った以上に手間取りました。備忘録として、正しい設定方法をチュートリアル形式でまとめておきます。
最初に結論
Cloud Run から プライベートIPで構成された Cloud SQL に接続するには、VPCネットワークと Serverless VPC アクセスコネクタを使ってネットワークをつなげる必要があります。Docker ネットワークと似たような考え方で、プロジェクト内にあってもそれぞれのサービスは独立しており、明示的にネットワークを共有させる設定が必要です。
DefaultのネットワークはプライベートIPによる接続が使えない
私もしっかりと調べたわけではないのですが、CloudRunもCloudSQLもネットワークを特に指定しないとDefault
のネットワークに設定されます。しかし、Default
のネットワークではプライベートIPでの接続ができません。恐らくセキュリティの観点だとおもいますが、とりあえず、ネットワークをVPCネットワークで作成して設定する必要があると覚えておきましょう。
前提条件
- Cloud SQL インスタンスは プライベートIPで作成済み
- Cloud Run に phpMyAdmin をデプロイ済み
作成手順
手順を箇条書きで簡単に記載します。前提として、CloudRunにphpMyAdminをデプロイ済みで、CloudSQLにインスタンス作成済みとします。
1. VPCネットワークとサブネットの作成
まず、Cloud SQL と Cloud Run が会話できる「町(ネットワーク)」を作ります。
- VPCネットワークを新規作成
- サブネットのIP範囲は例として
10.0.0.0/24
- 3306ポート(MySQL用)を許可するファイアウォールルールを作成
- ファイアウォールは
Cloud Runのサービスアカウント
または全体の出力トラフィックを許可する設定にする
補足:IPアドレスの範囲(10.0.0.0/24など)は例なので、他と被らなければOK。分からなければそのままで問題ありません。
2. Cloud SQL にプライベートIPを割り当て、VPCを接続
Cloud SQL に「この町(ネットワーク)上の住所(プライベートIP)」を与えてあげます。
- Cloud SQL の「接続」設定から、作成した VPC ネットワークを選択し、プライベートIP を有効化
- 必要に応じて、新しいサブネット(例:10.0.1.0/24)を作成
補足:「プライベート パスを有効にする」は今回の構成では チェック不要
この設定は GCP サービス同士の裏側通信に使うため、phpMyAdmin からの接続には必要ありません。
3. Cloud Run のネットワーク設定を変更
Cloud Run が外に出て Cloud SQL に会いに行くには、「橋(コネクタ)」を渡る必要があります。
- Cloud Run サービスの「ネットワーキング」設定で
- 「VPC 接続 → アウトバウンドトラフィック用のVPCに接続」を選択
- 「VPCコネクタ」に、先ほどの VPC サブネットを指定
- 「トラフィックルーティング」は「プライベートIP へのリクエストのみを VPC にルーティングする(Recommended)」を選択
4. サービスアカウントにCloud SQLクライアント権限を付与
Cloud Run サービスは「サービスアカウント」という名前の身分証を使って動いています。
Cloud SQL にアクセスできるようにするには、そのアカウントに「入室許可(ロール)」をつける必要があります。
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
--role="roles/cloudsql.client"
Cloud Run のサービスに設定されているサービスアカウントに対して roles/cloudsql.client
権限が必要です。
補足
Default
VPC でも接続自体は不可能ではありませんが、プライベートIPでの通信が制限されることがあります。
プライベートパスのチェックボックス(「Google Cloud サービスの承認」設定)は、GCP サービス側からのアクセスが必要な場合に有効化しますが、phpMyAdmin のような Cloud Run アプリ経由であれば不要なケースもあります。
完成
ここまで設定すれば、Cloud Run 上の phpMyAdmin から Cloud SQL に安全にアクセスできるようになります。ネットワーク構成の理解が深まる、良い練習になる構成です。