Cloud SQL Auth Proxyでローカル環境からインスタンスに接続する
前書き
テストや開発用でCloud SQLに接続したいケースはままある。Cloud SQLの接続方法はいくつかあり、その中で私がよく使ってたのは
$ gcloud sql connect instance_name
というgcloudコマンドを利用するものだった。これはインスタンスのパブリックIPアドレスに接続可能なホワイトリストにローカルのIPアドレスを追加して接続する方式を採用している
そしてCloud SQLインスタンスは現在IPv4までしか対応していない。そのためローカル環境がIPv6だと接続できない
最近までは在宅作業時は使えない問題があったが、とうとう会社のインターネットもIPv6になったらしい(特にアナウンスはなくオフィスから繋いだらIPv6は無理というエラーが出た)ので、いい加減IPv6から接続できるように手法を確立しておこうと思った
Cloud SQL Auth Proxyを使う
いくつか手段を考えたが、現状のインスタンスの設定に手を加えるのは影響が大きそうなので設定そのままで接続できそうなものとしてCloud SQL Auth Proxyを採用した
具体的な説明は公式のドキュメントを読んで欲しい。ざっくりいうと、クライアント側(ローカル側)でProxy Clientが起動し、Cloud SQL側でProxy Serverが起動する。Proxy Server/ClientはTCPでセキュアな接続を確立した上で、ローカル側ではDBのサーバとして、Cloud SQL側ではインスタンスのクライアントとして振る舞うことでデータベースを操作できるということらしい
これならローカルがIPv6だろうがIPv4だろうが関係なく接続できる
環境構築
上記の説明の通りまずはローカルで動くProxy Clientを入れる必要がある
各種環境に応じてダウンロードしていい感じにやって欲しい
起動
これもドキュメントの通りだが、接続時はシンプルにコマンドラインで叩いて起動する
$ cloud-sql-proxy --run-connection-test project-name:region:instance-name --port=12345
--run-connection-testは不要だが、どうせ一瞬で終わるのでつけておいた方がお得という認識である
起動確認はこのままコマンド上で把握した上で、バックグラウンドに移すなりなんなりしてmysqlで接続する
$ mysql -u user -p -h 127.0.0.1 -P 12345
これでパスワードを入力すると接続できる。当然だがユーザーとパスワードはCloud SQLで使えるようにしているユーザーとパスワードと一致させる必要がある
今回はmysqlコマンドで接続しているが、いい感じのGUIクライアントを使っている場合でもAuth Proxyの起動までできていれば同様にできる はず
ポートについて
上記コマンドではどちらもポートを指定している。ちなみに指定しない場合デフォルトのポート番号(MySQLは3306)が使われる。インスタンス側の設定に合わせられる様子(なのでPostgreSQLだったら5432)
ただ開発環境を考慮するとローカルはローカルですでにデータベースが動いている可能性が高いので意図的に適当なポート番号をつけている
プライベートIPアドレスで接続する
上記の方法はインスタンスのパブリックIPアドレスでの接続になる。もしパブリックIP接続を許可していないインスタンスだった場合はプライベートIPアドレスを利用した接続を使用することでアクセスできる
できるが、その場合同一のVPCネットワークに接続できる権限がないといけない。そのうえ、IAPの転送ルールの設定と、中間VMが必要になる
基本は上記リンクの通りにやってIAPを設定してあげる必要があり、その上で
上記リンクの通り、中間VMにCloud SQL Auth Proxyを入れてあげてそこで --private-ip
オプションをつけて起動させる
で、中間VMに外からアクセスする、という手順を取ることになる。インスタンスがひとつ必要になるのは若干のデメリットだが、たぶんめっちゃ小さなインスタンスで事足りるはず
一応調べての方法の記述で止まっているのは実行してないから。ここに書いたのは自分向けのメモ的な役割でもある
もし誰かやる必要があったらやったことをまとめて記事にして欲しい(他力本願
まとめ
ちなみにCloud SQL Auth Proxyは外部ネットワークからCloud SQLに接続するためのものなので、ローカルからの接続以外でもサイドカーコンテナで利用してDB接続の窓口にしたり、プロジェクトの外(オンプレサーバとか別プロジェクトとか)からのアクセス元にしたりといろんな使い道がある
上記の場合コンテナは最初から公式でイメージが提供されているほか、プロジェクト外からの接続だとVPCの設定を頑張る必要が薄くなったりするのでその点ではメリットだろうか
せっかくなので使いこなしたい
Discussion