Google Cloud SQLにCloud SQL Proxyを使って接続する方法

Google Cloud開発関連

CloudSQLに外部から接続する方法としてはpublic ipを公開する方法とCloudProxyツールを使って接続する方法と2つあります。

https://cloud.google.com/sql/docs/sql-proxy?hl=ja

■Cloud SQLのpublic ipを公開して接続
IP制限(必須)したりSSLの設定(任意)をしたりと少し手間がかかります。
またIP制限だけで公開もできてしまうので事故りやすいのとクライアント側が固定IPを持ってないと、とても広いレンジでの設定が必要になります。

■CloudSQLProxy経由で接続
自動的に暗号化してくれるのとCloudPlatformと認証してから接続となるのでより一層セキュアとなります。

今回はCloudSQLProxyを使っての接続についてまとめます。また、Proxyを使う方が断然オススメです。またCloudSQLProxyを利用する手順は大きく2つあります。
毎回手動で起動・停止でいい場合はProxyツールをダウンロードして実行すればよいです。サービス化したい場合はProxy Dockerを使うのがお手軽です。

スポンサーリンク

事前準備

Cloud SQL APIを有効にする

ENABLE THE APIをクリックしてAPIの管理画面を表示した後、プロジェクトを選択します。

その後、認証情報を追加し、jsonファイルをダウンロードします。その際の役割は「Cloud SQLクライアント」を設定します。

※jsonファイルには認証情報が入っている為、外部に公開しないよう気をつけてください。

ダッシュボードの左メニューの「APIとサービス⇛認証情報」に追加されていることを確認してください。

Cloud SQL Proxyツールを直接使う

Macにインストールする前提で書きます。他のOSにインストールしたい場合は後述する参考リンクをみてください。

プロキシのインストール

ターミナルから以下を実行します。

$cd ツールを起きたい場所
$curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64
$chmod +x cloud_sql_proxy
$sudo mkdir ./cloudsql; sudo chmod 777 ./cloudsql
$mv ダウンロードした秘密鍵.json ./

プロキシを開始する

UNIXソケットを使います。(Windowsの場合はTCP)
インスタンス接続名はダッシュボードからDBの詳細「概要タブ→このインスタンスに接続→インスタンス接続名」を使います。

$./cloud_sql_proxy -dir=./cloudsql -instances=インスタンス接続名 -credential_file=./ダウンロードした秘密鍵.json &

↓のログが出れば起動成功です
2019/03/16 17:30:39 Ready for new connections

MySQL Workbenchで接続する

MySQL Workbenchはここからダウンロードしてください。インストール方法は省略します。

以下、補足です。

  • ConnectionMethod:Local Soket/Pipeを選択
  • Socket/Pipe Path:cloudsqlディレクトリの下にファイルができているのでそれを指定

Proxy Dockerを使う(サービス化)

cloudsql-dockerイメージがあるのでそれを使います。以下docker-composeの例です。

version: "3"
services:
  dev-db:
    restart: always
    image: gcr.io/cloudsql-docker/gce-proxy:latest
    container_name: dev-db
    expose:
      - "3306"
    environment:
      TZ: Asia/Tokyo
    volumes:
      - ./cloudsql:/cloudsql
      - ./ダウンロードした秘密鍵.json:/root/ダウンロードした秘密鍵.json:ro
    logging:
      options:
        max-size: 5m
    command:
      ["/cloud_sql_proxy",
       "-credential_file=/root/ダウンロードした秘密鍵.json",
       "-instances=インスタンス接続名=tcp:0.0.0.0:3306"]
    networks:
      - db_nw
 
networks:
  db_nw:
    external:
      name: shared-db

networkは明示的に分けておいたほうがよりセキュアです。事前にブリッジなりで作成しておいてください。また、JDBCで繋ぎたかったのでTCPソケット通信にしています。

おまけ

プロキシ用のMySQLユーザを作る

プロキシ用のIP制限の設定例です。

'[USER_NAME}'@'cloudsqlproxy~%'
または
'[USER_NAME}'@'cloudsqlproxy~固定IP'

コピーして作ったDocker版のcloudsqlproxyで認証エラー

GCPのイメージを使って別リージョンに同スペックのマシン立てた時に発生。。。

2019/07/15 13:02:48 couldn't connect to "xxxxxx:asia-northeast1:xxxx-db-01": Post https://www.googleapis.com/sql/v1beta4/projects/xxxxxx/instances/xxxx-db-01/createEphemeral?alt=json: oauth2: cannot fetch token: Post https://oauth2.googleapis.com/token: dial tcp: i/o timeout

docker infoすると以下の警告が・・・

WARNING: IPv4 forwarding is disabled
WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled

「/etc/sysctl.conf」に以下を追加して「sysctl -p」を実行したらなおりました

net.ipv4.ip_forward=1
net.bridge.bridge-nf-call-iptables = 1
net.bridge.bridge-nf-call-ip6tables = 1

参考

その他のOSにインストールする場合等は以下を参照してください。

©2018 LLC Shimer-System.
image/svg+xml