概要
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