LoginSignup
4
2

More than 5 years have passed since last update.

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

Posted at

概要

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アプリを利用していますが、なんでも良いです。
スクリーンショット 2018-10-11 13.21.28.png

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

ログを確認してみます。

> 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

改めて接続し直します。

スクリーンショット 2018-10-11 13.29.39.png

やったぜ。

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

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

4
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
2