概要

GCPのCloud SQLを利用する場合、Cloud SQL Proxyを利用すると安全に接続できるとのことです。

Cloud SQL Proxy について
https://cloud.google.com/sql/docs/sql-proxy?hl=ja

Dockerイメージも用意されているので、下記記事を参考にしたのですが、私の環境だとエラーがでてハマったけど、なんとか解決できたって話です。

docker-composeGoogle Cloud SQLに開発環境から接続する
https://qiita.com/wasanx25/items/0e888f656c101dd90853

再現方法

前提条件

MacでDockerがインストールされている前提です。

> docker --version
Docker version 18.06.1-ce, build e68fc7a

> docker-compose --version
docker-compose version 1.22.0, build f46880f

GCPプロジェクトが利用可能で、Cloud SQLでインスタンスが作成済み。
Cloud SQLへ接続できるサービスアカウントを作成して、キーファイル(JSON)が手元にある前提です。

詳しくは下記をご参考ください。

Cloud SQL for MySQL の使用
https://cloud.google.com/appengine/docs/flexible/python/using-cloud-sql

外部アプリケーションから Cloud SQL に接続する
https://cloud.google.com/sql/docs/mysql/connect-external-app?hl=ja

docker-compose.yamlの定義

Docker Composeを利用したかったので、以下のように定義しました。

定義に関しては下記を参考にさせてもらいました。

docker-composeでGoogle Cloud SQLに開発環境から接続する
https://qiita.com/wasanx25/items/0e888f656c101dd90853

docker-compose.yaml

version: '3'

services:
  db:
    image: "gcr.io/cloudsql-docker/gce-proxy:1.13"
    command:
      ["/cloud_sql_proxy",
      "-instances=[Cloud SQLのインスタンス名]=tcp:0.0.0.0:3306",
      "-credential_file=/config/[サービスアカウントのJOSNファイル名]"]
    volumes:
      - "[サービスアカウントのJOSNファイルパス]:/config/[サービスアカウントのJOSNファイル名]"
    ports:
      - "3306:3306"

Dockerコンテナの立ち上げと接続

> docker-compose up -d
Recreating [Dockerコンテナ名] ... done

コンテナが立ち上がったら、DB接続します。ここではSequel Proアプリを利用していますが、なんでも良いです。

接続エラーになってしまいました。

ログを確認してみます。

> docker-compose logs db

Attaching to [Dockerコンテナ名]
db_1  | 2018/10/11 03:12:45 current FDs rlimit set to 1048576, wanted limit is 8500. Nothing to do here.
db_1  | 2018/10/11 03:12:45 using credential file for authentication; email=xxx@xxx.xx
db_1  | 2018/10/11 03:12:45 Listening on 0.0.0.0:3306 for [Cloud SQLのインスタンス名]
db_1  | 2018/10/11 03:12:45 Ready for new connections
db_1  | 2018/10/11 04:21:25 New connection for "[Cloud SQLのインスタンス名]"
db_1  | 2018/10/11 04:21:26 couldn't connect to "[Cloud SQLのインスタンス名]":
 Post https://www.googleapis.com/sql/v1beta4/projects/[GCPのプロジェクトID]/instances/[Cloud SQLのインスタンス名]/createEphemeral?alt=json&prettyPrint=false:
 oauth2: cannot fetch token:
 Post https://oauth2.googleapis.com/token:
 x509: certificate signed by unknown authority

x509: certificate signed by unknown authority とありますので、おそらくは、SSL証明書関連のエラーみたいです。

解決策

エラーを頼りにググってみましたが、これといった情報がなく、最終的に下記のドキュメントからヒントを得ました。

Cloud SQL Proxy Docker イメージを使用して MySQL クライアントに接続する
https://cloud.google.com/sql/docs/mysql-connect-docker?hl=ja

Linux または Compute Engine の Linux インスタンスを実行するクライアント マシン

向けの記事でしたが、

ローカル証明書ファイルの場所を決定します。
一般的な場所を次に示します。

って説明から、Macの証明書ファイルの場所をDockerコンテナからも参照できるようにしてみたら、エラーを回避することができました。

volumes-"/etc/ssl/:/etc/ssl/" を追加しています。
環境によってはパスが変わるかもしれませんので、ご注意ください。

docker-compose.yaml(エラー回避版)

version: '3'

services:
  db:
    image: "gcr.io/cloudsql-docker/gce-proxy:1.13"
    command:
      ["/cloud_sql_proxy",
      "-instances=[Cloud SQLのインスタンス名]=tcp:0.0.0.0:3306",
      "-credential_file=/config/[サービスアカウントのJOSNファイル名]"]
    volumes:
      - "/etc/ssl/:/etc/ssl/"
      - "[サービスアカウントのJOSNファイルパス]:/config/[サービスアカウントのJOSNファイル名]"
    ports:
      - "3306:3306"

コンテナを立ち上げ直します。

> docker-compose down
> docker-compose up -d

改めて接続し直します。

やったぜ。

同じ内容のドキュメントが複数あり、今回参考にしたドキュメント以外には「ローカル証明書ファイルの場所」に関する説明がなく、危うくドハマリするところでした。
どっちが最新なのだろう。。。

Cloud SQL Proxy Docker イメージを使用して MySQL クライアントを接続する
https://cloud.google.com/sql/docs/mysql/connect-docker?hl=ja

Connecting MySQL Client Using the Cloud SQL Proxy Docker Image
https://cloud.google.com/sql/docs/mysql/connect-docker

参考

Cloud SQL Proxy について
https://cloud.google.com/sql/docs/sql-proxy?hl=ja

docker-composeでGoogle Cloud SQLに開発環境から接続する
https://qiita.com/wasanx25/items/0e888f656c101dd90853

Cloud SQL for MySQL の使用
https://cloud.google.com/appengine/docs/flexible/python/using-cloud-sql

外部アプリケーションから Cloud SQL に接続する
https://cloud.google.com/sql/docs/mysql/connect-external-app?hl=ja

(こっちが正?)Cloud SQL Proxy Docker イメージを使用して MySQL クライアントに接続する
https://cloud.google.com/sql/docs/mysql-connect-docker?hl=ja

Cloud SQL Proxy Docker イメージを使用して MySQL クライアントを接続する
https://cloud.google.com/sql/docs/mysql/connect-docker?hl=ja

Connecting MySQL Client Using the Cloud SQL Proxy Docker Image
https://cloud.google.com/sql/docs/mysql/connect-docker

元記事はこちら

MacでCloud SQL Proxy Dockerイメージを利用して接続するとき'''x509: certificate signed by unknown authority'''エラーが出たときの対応