Cloud SQLのデータベースにローカルから接続する方法

CloudSQLに作成したデータベースにローカル環境から接続して、データの内容を確認したいケースがあると思います。
実現するには、それなりの手順が必要になるので、自分の備忘録も兼ねて書き残しておきたいと思います。

# CloudSQLインスタンスを作成
この記事の主題は「接続すること」なので、作成方法については簡単に記載しておきます。
既に作成済みの場合は読み飛ばして構いません。

### GCPコンソールから作成する場合
１．GCPにログイン後、ナビゲーションメニューで、[SQL]を選択
２．上部の「インスタンスを作成」をクリックして、その後は必要項目を入力、クリックしていく

### gcloudコマンドラインツールを使用して作成する場合
ローカルにgcloudコマンドラインツールをインストールしている、又は[Google Cloud Shell ](https://cloud.google.com/shell/docs/quickstart)で作成する場合は、以下のコマンドで作成可能です。

```sh
$ gcloud sql instances create --gce-zone asia-northeast1-a --database-version MYSQL_5_7 --memory 4 --cpu 2 インスタンス名
```
この例では、MySQL5.7のインスタンスを作成しています。ゾーンやメモリ、CPU数は任意でOKです。
Postgres SQLのインスタンスを作成したい場合は、"MySQL5.7"の部分を"POSTGRES_9_6"などとします。

# CloudSQLにデータベースを作成
こちらも簡単に。
こちらも作成済みの場合は読み飛ばしてOKです。

### GCPコンソールから作成する場合
１．GCPにログイン後、ナビゲーションメニューで、[SQL]を選択
２．インスタンスの一覧が表示されるので、データベースを作成したいインスタンスをクリック
３．「データベース」タブを選択し、「データベースを作成」をクリック
４．データベース名を入力し、その他項目は任意で入力して「作成」をクリック

### gcloudコマンドラインツールを使用して作成する場合
```sh
$ gcloud sql databases create DB名 --instance=インスタンス名
```
# DBユーザーを作成する
こちらも作成済みの場合は読み飛ばしてOKです。

### GCPコンソールから作成する場合
使用するインスタンスを表示するまでは、上記データベース作成手順と同じ。
その後「ユーザー」タブをクリック。
「ユーザーアカウントを作成」をクリックする。
「ユーザー名」と「パスワード」を入力して「作成」をクリックします。

### gcloudコマンドラインツールを使用して作成する場合
```sh
$ gcloud sql users set-password DBユーザー名 \
--instance=インスタンス名 --password=DBパスワード
```
# プロキシのインストール
CloudSQLにプロキシ経由で接続するため、プロキシをインストールします。

### プロキシをダウンロード
```sh
# Macの場合
$ curl -o cloud_sql_proxy https://dl.google.com/cloudsql/cloud_sql_proxy.darwin.amd64

# Linuxなどwgetが使用できる場合
$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64 -O cloud_sql_proxy
```
実行権限を付与しておく。

```sh
$ chmod +x cloud_sql_proxy
```
### サービスアカウント作成
ここでは、例として[sample-user]という名前のアカウントを作成しています。名前は任意の名前で問題ないです。

#### ●GCPコンソールから作成する手順
１．GCPにログイン後、ナビゲーションメニューで、「IAMと管理」の中から「サービスアカウント」を選択する
２．上部の「サービスアカウントを作成」をクリック
３．以下のようにサービスアカウント名などを入力して、「作成」をクリック
※塗りつぶし部分はGCPのプロジェクトID
![スクリーンショット 2018-11-29 11.04.30.png](https://qiita-image-store.s3.amazonaws.com/0/279050/dcd807f2-2509-8bc2-b8bd-6bc137fcff91.png)
４．役割に「Cloud SQL クライアント」を設定して「続行」をクリック
![スクリーンショット 2018-11-29 12.18.03.png](https://qiita-image-store.s3.amazonaws.com/0/279050/1f7ce257-806e-02d2-55df-1a3a3025c24d.png)
５．「キーを作成」をクリック
![スクリーンショット 2018-11-29 12.18.40.png](https://qiita-image-store.s3.amazonaws.com/0/279050/fb437a42-c3c4-94db-4ae6-6145f6d1a7cd.png)
６．キーのタイプにて「JSON」を選択して「作成」をクリックと認証ファイルがダウンロードされます
![スクリーンショット 2018-11-29 12.19.00.png](https://qiita-image-store.s3.amazonaws.com/0/279050/02fa3d3c-8593-12e0-2fca-ab8011219e1e.png)
７．キーが表示されていることを確認して、「完了」をクリック
![スクリーンショット 2018-11-29 12.19.48.png](https://qiita-image-store.s3.amazonaws.com/0/279050/342057e8-6f15-1a0a-7b72-c0b5ef0ed9b7.png)
８．サービスアカウントの一覧に戻るので、作成したアカウントが存在することを確認する

#### ●gcloudコマンドラインツールを使用して作成する手順
１．サービスアカウントを作成

```sh
$ gcloud iam service-accounts create sample-user --display-name "sample-user"
```

２．アカウントのメールアドレスを確認
サービスアカウントが作成されると、以下コマンドでメールアドレスを確認できる。

```sh
$ gcloud iam service-accounts list

NAME               EMAIL
sample-user          sample-user@プロジェクトID.iam.gserviceaccount.com
```

３．アカウントにCloudSQLClientロールを付与する

```sh
# メールアドレスは上記で確認したアドレスにする
$ gcloud projects add-iam-policy-binding プロジェクトID --member serviceAccount:sample-user@プロジェクトID.iam.gserviceaccount.com --role roles/cloudsql.client
```

４． 認証ファイル作成
認証ファイル名は「key.json」としている。メールアドレスは上記で確認したプロキシアカウントのアドレスにする。

```sh
$ gcloud iam service-accounts keys create key.json --iam-account sample-user@プロジェクトID.iam.gserviceaccount.com
```

# CloudSQLのインスタンス接続名を確認
既にCloudSQLのインスタンスは作成済みだと思います。
そのインスタンスのインスタンス接続名を確認しておきます。

GCPコンソールのナビゲーションメニューから「SQL」をクリックします。
インスタンスの一覧が表示されるので、使用するインスタンスをクリックします。

遷移した画面に以下のような項目があり、赤枠で囲った部分がインスタンス接続名になります。
![スクリーンショット 2018-11-29 15.42.52.png](https://qiita-image-store.s3.amazonaws.com/0/279050/cd90e70c-6485-d494-e510-f6549f6414af.png)

# プロキシを起動
上記でインストールしたプロキシを起動します。

コマンドは以下です。パラメータは指定する値は以下の通りです。
instances:上記で確認したインスタンス接続名
tcp:接続ポートを指定します。ここでは13306としています。
credential_file:上記でサービスアカウント作成時に作成した認証ファイルを指定します

```sh
$ ./cloud_sql_proxy -instances=インスタンス接続名=tcp:13306 -credential_file=key.json
```

これでローカルからCloudSQLに接続できるようになりました。
Sequel Proでの接続例は以下になります。
<img width="484" alt="スクリーンショット 2018-11-29 15.57.24.png" src="https://qiita-image-store.s3.amazonaws.com/0/279050/7e5ddfef-61ee-b303-8fef-4227b074cc31.png">