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

## 概要

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がインストールされている前提です。

```sh
> 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


```yaml: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コンテナの立ち上げと接続

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

コンテナが立ち上がったら、DB接続します。ここではSequel Proアプリを利用していますが、なんでも良いです。
<img width="639" alt="スクリーンショット 2018-10-11 13.21.28.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/4565dcc0-a722-2846-fa3e-ac96c614efbd.png">

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

ログを確認してみます。

```sh
> 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/"``` を追加しています。
環境によってはパスが変わるかもしれませんので、ご注意ください。

```yaml: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"
```

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

```sh
> docker-compose down
> docker-compose up -d
```

改めて接続し直します。

<img width="614" alt="スクリーンショット 2018-10-11 13.29.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/48549/1863be73-f5dc-6d18-bdff-945dd2591049.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