Cloud SQLをローカルのDBeaver(クライアントツール)に接続する方法を紹介します。今回はクライアントツールとしてDBeaverを選択していますが、他のツールでも問題ありません。
参考:外部アプリケーションから Cloud SQL に接続する | Cloud SQL for MySQL
前提条件
Cloud SQLをローカルのクライアントツールに接続する前提として以下が当てはまっていることが条件です。
- Cloud SQL AdminAPIが有効化されていること
- Cloud SQLのインスタンスが作成されていること
- Cloud SQLにDB・ユーザが作成されていること
プロキシクライアントのインストール
ローカルから認証に必要なプロキシクライアントをインストールします。
Macの場合は以下のコマンドでダウンロードします。他のOSからのコマンドは以下の公式を参考にしてください。
参考:ローカルマシンにプロキシ クライアントをインストールする
1 | $ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64 |
プロキシの実行権限を付与します。
1 | $ chmod +x cloud_sql_proxy |
サービスアカウントの作成
次にローカルからCloud SQLに接続する際に、認証で必要となるサービスアカウントを作成します。
GCPの「IAMと管理」からサービスアカウントを選択します。「サービスアカウントを作成」を押下します。
以下の項目を入力し、作成を押下します。
- サービスアカウント名
- サービスアカウントID
- サービスアカウントの説明
役割は「Cloud SQL クライアント」を選択し、続行を押下します。
「キーを作成」を押下します。
キーのタイプは「JSON」を選択し、作成を押下します。すると認証ファイルがダウンロードされるので、保存します。今回は、sample-key.jsonというファイル名で保存します。
プロキシの起動
先ほどインストールしたプロキシを起動します。
- instances : インスタンス接続名
- tcp : 13306
- credential_file : 先ほど保存した認証ファイル
1 | $ ./cloud_sql_proxy -instances=<インスタンス接続名>=tcp:13306 -credential_file=sample-key.json |
起動し以下のように「Ready for new connections」が表示され、正常に起動できていることを確認します。
1 2 3 | 2020/03/10 19:56:57 using credential file for authentication; email=sample@<project_id>.iam.gserviceaccount.com 2020/03/10 19:56:58 Listening on 127.0.0.1:13306 for <インスタンス接続名> 2020/03/10 19:56:58 Ready for new connections |
DBeaverに接続
いよいよDBeaver(クライアントツール)に接続します。
以下を入力して接続完了です。
- Server Host : ローカルループバックアドレス
- Port : 先ほど指定したポート
- Database : Cloud SQLで作成したDB名
- User name : Cloud SQLで作成したユーザ名
- Password : Cloud SQLで作成したユーザのパスワード
接続時に「Communications link failure」エラー
最後のクライアントからの接続時に以下のエラーでハマりました。
1 2 3 | Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. |
ログを確認すると以下のエラーが表示されていました。調べてみるとどうやら接続の問題のようですが、特に問題なさそう。
1 | [Note] Aborted connection xxx to db: 'sample' user: 'sample' host: 'cloudsqlproxy~xxxxx' (Got an error reading communication packets) |
タイムアウトやbuffer_sizeを増やしたり、あれこれ設定を変更するが解決できず。。
結局、原因は会社で使用しているWiFiでした。試しにWiFiをオフにして、テザリングを使ってみると、問題なく接続できました。