業務じゃ使わないけどGCP使ってみた話２


（白目）
この記事は、[福岡若手Sier_bc Advent Calendar 2019 の 1４ 日目](https://qiita.com/ECOHOHOHOO/items/99f90ddea796792aa4d7)の続きです。

続きで、Cloud SQLを使ってデータベースを利用してみます。

##Cloud SQLとは
GCPで利用できるMySQLのマネージドサービスで、データベースサーバの冗長化やバックアップ設定など、構築に関わる手間を始め、定期的なバックアップ取得など、運用による必要な手間を減らせるようです。

もちろん、前回説明した仮想マシンのなかにMySQLをインストールしてもいいけど、その場合はバックアップはどうやってとるか考えて自分で設定しなきゃいけないけど、Cloud SQL使えば、そこらへんいい感じにしてくれるよ的な話らしいけど、詳しくはここじゃ触れません。

ザックリ以下。
まず概念図。
専用のプロキシサーバを経由して接続する感じらしい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/35bce034-ca6a-9666-9168-b021156641fd.png)


メリットは以下で、暗号化されるよ！静的IP不要！のとこ

- 安全な接続: プロキシは、TLS 1.2 と 128 ビット AES 暗号を使用して、データベースとの間で送受信されるトラフィックを自動的に暗号化します。クライアントとサーバーの ID の確認には、SSL 証明書が使用されます。
- 簡単な接続管理: プロキシが Cloud SQL との認証を処理するので、静的な IP アドレスを提供する必要がなくなります。
＊Cloud SQL の第 2 世代インスタンスなら使用可能
（参考：https://cloud.google.com/sql/docs/mysql/sql-proxy?hl=ja）



##Cloud SQLのインスタンス作成
Cloud consoleのメニューから「SQL」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/26714439-8771-847e-9e60-eb05bd74be63.png)

Cloud SQLのインスタンス作成画面が表示されるので、「インスタンスを作成」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/455d5708-a02c-2903-20c7-1ef800657c7d.png)

「データベースエンジンの選択画面」が表示されるので、「MySQL」を選択します。
MySQLだけじゃなくて、「PostgreSQL」、「SQL Server」も選べるみたいですね。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/486bc6fb-b2b2-f981-9333-5d2d4ff69726.png)

「インスタンスの情報」画面が表示されるので以下の詳細を設定します。
ちなみに各設定は、全て任意でよいですが、パフォーマンスを向上させるには、利用するサービスに近い場所（今回の場合、前回WebServerを作成したのと同じリージョン）を設定するのがよいとのこと。

- インスタンスID
- rootのパスワード
- リージョン/ゾーン
- データベースのバージョン

次へを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/8b7e9311-c6c4-675d-bfdb-f6fe19459350.png)

これで、Cloud SQLインスタンスの作成は完了

##WebServerから繋いでみる
繋ぎ方はチュートリアルレベルだと２つあるっぽい。
なお、手元の書籍と公式のドキュメントが微妙に違っていて手順が混在しているのはご愛嬌。

- そのままつなぐ(特定のIPからの接続を許可）
- Cloud SQL Proxyを使ってつなぐ

(参考：https://cloud.google.com/sql/docs/mysql/connect-admin-proxy?hl=ja#start-mysql）

そのまま繋ぐ場合は、CloudSQL側で接続可能なIPアドレスを指定するとのこと。
ちょっと注意点があって、WebServer側は静的IPをつける必要があるし、動的になる可能性があるならセキュリティ的に問題だよとのこと。

今回は以下の手順で、`「Cloud SQL Proxy」`を使ってつなぐことを試してみる。

###事前準備
Cloud SQL Proxyは内部でCloud SQL APIを使用するとのことで、有効化が必要です。
Cloud Consoleのメニューから「APIとサービス」-「ライブラリ」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/cf5cae71-d611-e5cc-89a8-865ba85f4f77.png)


表示された画面で「SQL」と検索する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/ba6f04a6-f422-482a-59d9-d7676a88d48e.png)

赤枠らへんに「有効化」ボタンが出るはずなので有効化する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/56eda6a5-2674-ab84-9fc9-bfcf715b9f24.png)

###Cloud SQL Proxyのインストール
この作業は`WebServer側`でやります。

```
$ wget https://dl.google.com/cloudsql/cloud_sql_proxy.linux.amd64

$ mv cloud_sql_proxy.linux.amd64 cloud_sql_proxy
$ chmod 733 cloud_sql_proxy

$ mkdir /opt/cloudsqlproxy
$ mv cloud_sql_proxy /opt/cloudsqlproxy/

#proxyが利用するUNIXソケット格納ディレクトリ
$ mkdir /cloudsql
$ chmod 777 /cloudsql
```

###Cloud SQL Proxyの起動
この作業は`WebServer側`でやります。
権限で怒られる場合、sudoつけてね。

```
$ cd /
$ /opt/cloud_sql_proxy -dir=cloudsql -instances=gcp-computeXXXXX:XXXX
```
なお、上記の`-instances=gcp-computeXXXXX:XXXX`はインスタンスの指定をしており
`-instances=<プロジェクトID>:<リージョン>:<データベースのインスタンスID>`
の書式で行います。適宜書き換えてください。
これは、SQLの画面で確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/159147/c3d48c6a-c177-2b46-9428-eb116ec56544.png)


###Cloud SQL Proxy経由でWebServer側からCloud SQLのインスタンスに接続。

```
#myswlクライアントで接続
$ mysql -u root -p -S /opt/cloudsqlproxy/cloudsql/gcp-computeXXXXXXXX:XXXXXXX
```


###DB作成

```
#create database
mysql> create database message_db;
Query OK, 1 row affected (0.04 sec)

#show database
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| message_db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.04 sec)

#user create
#ここではappuserとしました。
CREATE USER '＜ユーザ＞'@'%' IDENTIFIED BY '＜パスワード＞';
Query OK, 0 rows affected (0.04 sec)

#show user
mysql> select user,host from mysql.user;
+-----------+-----------+
| user | host |
+-----------+-----------+
| appuser | % |
| root | % |
| mysql.sys | localhost |
+-----------+-----------+
3 rows in set (0.03 sec)
```


うーんここまで来るのに実作業は２時間くらい

以上！。


#参考
https://qiita.com/cognitom/items/c6b2ccb6e6b0f731850a

#最後に
最後に今年はAdvent Calendarに初挑戦してみましたが、どうでしたか。
皆さんの協力でなんとか２５日分埋められてとても良かったなと思います。
ありがとうございます。（白目）

読んでくれた若手が少しでも楽しいと思える技術や分野が見つかっていたら幸いです。
また、Sierは比較的既存の技術でどうにかしていくところが多いですが、会社で誰も使えないスキルを持っていると自信にもなりますし、上司から教えて欲しいと言われることもあります。

個人的にはもうちょっと新しいとこに踏み込みたかったのですが、それは来年の反省に生かしたいと思います。

以上。