簡単にチュートリアル感覚でやってみようと思って、めちゃくちゃハマって深夜までやってたので、忘れないようにメモしておきます。
最初に結論
CloudRunからプライベートIPのCloudSQLに接続するためには、VPCネットワークを作成して接続する必要があります。Dockerを使ったことがある人であればわかると思いますが、それぞれのサービスは同じプロジェクト上にあってもネットワークが異なるので、同じネットワークに入るように手動で設定する必要があります。
DefaultのネットワークはプライベートIPによる接続が使えない
私もしっかりと調べたわけではないのですが、CloudRunもCloudSQLもネットワークを特に指定しないとDefault
のネットワークに設定されます。しかし、Default
のネットワークではプライベートIPでの接続ができません。恐らくセキュリティの観点だとおもいますが、とりあえず、ネットワークをVPCネットワークで作成して設定する必要があると覚えておきましょう。
作成手順
手順を箇条書きで簡単に記載します。前提として、CloudRunにphpMyAdminをデプロイ済みで、CloudSQLにインスタンス作成済みとします。
VPCネットワークを作成
- サブネットは10.0.0.0/24で作成します。
- ファイアウォールは3306ポートが許可されてないとダメです。
- どれを選べばいいかはよく分かってなませんが、選ぶのは1つだけで大丈夫でした。
作成したVPCネットワークをCloudSQLのプライベートIPに設定
- Google Cloud サービスの承認にある「プライベート パスを有効にする」にチェックを入れておく
- チェック入れなくてもphpMyAdminからデータ挿入とかできたから、CloudServiceから直接アクセスすることがないならいらないのかも
- サブネットを新しく作る必要があるっぽいので、新しく作る
- サブネットは10.0.1.0/24で作成
CloudRunのネットワーキングで「アウトバウンド トラフィック用のVPCに接続する」を選択
- 「VPCに直接トラフィックを送信する」で作成したVPCを選択、サブネットは作成したものを選択する。
- トラフィックルーティングは「プライベート IP へのリクエストのみを VPC にルーティングする」を選んでおきます。
完成
Dockerネットワークと同じで、ネットワークを指定してあげないと、他のコンテナ(サービス)に接続できないようです。これがわかるまでにかなり苦労しました。
サービスアカウントにロールを付与
あと、サービスアカウントには恐らくSQLクライアントのロールが必要です。すでに作成済みのアカウントの場合は、コマンドで下記実行すればつけられます。CloudRunサービスのアカウントはセキュリティから変更できる。
gcloud projects add-iam-policy-binding [PROJECT_ID] \
--member="serviceAccount:[SERVICE_ACCOUNT_EMAIL]" \
--role="roles/cloudsql.client"