【CloudRun+CloudSQL】CloudRunに作成したphpMyAdminからCloudSQLにアクセスする方法

簡単にチュートリアル感覚でやってみようと思って、めちゃくちゃハマって深夜までやってたので、忘れないようにメモしておきます。 最初に結論 CloudRunからプライベートIPのCloudSQLに接続するためには、VPCネッ […]

簡単にチュートリアル感覚でやってみようと思って、めちゃくちゃハマって深夜までやってたので、忘れないようにメモしておきます。

最初に結論

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"