3. Webモジュールからアクセスするデータベースを作成

# はじめに
本記事は以下2の続きです。
1. [Google Kubernetes Engine（GKE）でJavaのWebモジュールをサッと動かしてみる](https://qiita.com/Turtle-child-No2/items/a5260ed94f01ccd5cfec)
2. [Dockerイメージの作成とRegistry登録](https://qiita.com/Turtle-child-No2/items/b8c307eb652e42420f7a)
3. [Webモジュールからアクセスするデータベースを作成](https://qiita.com/Turtle-child-No2/items/0fd09117beb74e848146)
4. [マニフェストの作成とWebモジュールの実行](https://qiita.com/Turtle-child-No2/items/23982059d188e44618df)
## 3-1. データベースの作成
### 手順3-1.1
Webモジュールからアクセスするデータベースを作成します。
サイドメニューで「SQL」をクリックします。
詳細画面がでたら「インスタンス作成」をクリックします。
![020.png](https://qiita-image-store.s3.amazonaws.com/0/263269/9aeadd40-853c-19ed-14fd-d38b4489f9dc.png)
![021.png](https://qiita-image-store.s3.amazonaws.com/0/263269/ef243de3-38e0-a883-e29c-114d5fd8ab33.png)
### 手順3-1.2
続いて「PostgreSQL」をクリックします。
![022.png](https://qiita-image-store.s3.amazonaws.com/0/263269/90ec30f5-c81a-ad4a-cf17-9e46223d23ff.png)
### 手順3-1.3
詳細画面でインスタンスIDに「sample-app-ist」とデフォルトユーザーのパスワードに「123456」を入力します。
![023.png](https://qiita-image-store.s3.amazonaws.com/0/263269/ddee2225-d549-80c0-e711-86d007bcf1d9.png)
### 手順3-1.4
さらに「設定オプションを表示」をクリックします。
![024.png](https://qiita-image-store.s3.amazonaws.com/0/263269/4c984f03-7a4d-5743-9a7b-7172da90f783.png)
### 手順3-1.5
プライベートIPをチェックします。
![025.png](https://qiita-image-store.s3.amazonaws.com/0/263269/b1e99e8b-f5a2-80f9-9ada-b32151ebfe2d.png)
### 手順3-1.6
詳細画面が表示された場合は「APIを有効にする」をクリックします。
![026.png](https://qiita-image-store.s3.amazonaws.com/0/263269/4b6a9f72-6bf0-0890-5bc2-a0f108340781.png)
### 手順3-1.7
「作成」をクリックします。
![027.png](https://qiita-image-store.s3.amazonaws.com/0/263269/b9da6b64-067c-4724-3afc-6a3ccbbcdf2e.png)
### 手順3-1.8
しばらくしてデータベースインスタンスの作成が終わりました。
![028.png](https://qiita-image-store.s3.amazonaws.com/0/263269/0ac3ead8-1676-4aba-6030-40116a932d27.png)
### 手順3-1.9
続けてデータベースインスタンスをクリックし詳細画面でデータベースをクリックします。さらに「データベースを作成」をクリックします。
![029.png](https://qiita-image-store.s3.amazonaws.com/0/263269/e2170deb-4adc-ae95-dd60-ab96b5b6e841.png)
### 手順3-1.10
データベース名に「sample-app-db」を入力し「作成」をクリックします。
![030.png](https://qiita-image-store.s3.amazonaws.com/0/263269/642b19e0-288a-5abc-9953-222f1602ca2e.png)
### 手順3-1.11
データベースが作成されました。
![031.png](https://qiita-image-store.s3.amazonaws.com/0/263269/c38a088c-615e-3f64-eef6-8a7d11a66509.png)
### 手順3-1.12
早速、データベースインスタンスに接続します。
パスワードを求められたら「123456」を入力します。

```
[userid]@cloudshell:~ ([project_id])$ sudo gcloud sql connect sample-app-ist --user=postgres
Whitelisting your IP for incoming connection for 5 minutes...done.
Connecting to database with SQL user [postgres].Password for user postgres:
psql (9.6.11, server 9.6.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
Type "help" for help.
```

### 手順3-1.13
操作対象のデータベースがpostgresになっているので先ほど作成したsample-app-dbに切り替えます。パスワードを求められたら「123456」を入力します。

```
postgres=> \connect sample-app-db
Password for user postgres:
psql (9.6.11, server 9.6.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
You are now connected to database "sample-app-db" as user "postgres".
```

### 手順3-1.14
次に後で使用するproxyuserを作成し、データベースへの接続と権限を与えます。proxyuserに切り替えた後（パスワードを求められたら「123456」を入力）にt_sampleテーブルを作成し、1件テストデータをINSERTします。

```
sample-app-db=> CREATE ROLE proxyuser WITH LOGIN PASSWORD '123456';
CREATE ROLE
sample-app-db=> GRANT CONNECT ON DATABASE "sample-app-db" TO proxyuser;
sample-app-db=> \connect - proxyuser
Password for user proxyuser:
psql (9.6.11, server 9.6.10)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)
You are now connected to database "sample-app-db" as user "proxyuser".
sample-app-db=> CREATE TABLE t_sample (order_no BIGINT NOT NULL, cre_dt TIMESTAMP NOT NULL default CURRENT_TIMESTAMP, nickname VARCHAR(30), order_id VARCHAR(5000));
CREATE TABLE
sample-app-db=> INSERT INTO t_sample (order_no, cre_dt, nickname, order_id) VALUES (1, '1999-01-08 04:05:06', 'テスト', 'ABC');
INSERT 0 1
```

### 手順3-1.15
作成したテーブルを確認します。

```
sample-app-db=> \dt
           List of relations
 Schema |   Name   | Type  |   Owner
--------+----------+-------+-----------
 public | t_sample | table | proxyuser
(1 row)
```

## 3-2. データベースインスタンスへの接続に必要な設定
### 手順3-2.1
GKEからデータベースインスタンスへの接続に必要な設定を行います。
まず、[Cloud SQL Administration API を有効にする](https://console.cloud.google.com/flows/enableapi?apiid=sqladmin&hl=ja&_ga=2.250044038.-1219564708.1545700047)をクリックします。
### 手順3-2.2
「アプリケーションを登録するプロジェクトの選択」を入力し「続行」をクリックします。
![034.png](https://qiita-image-store.s3.amazonaws.com/0/263269/00ec7e7d-d2f1-2525-bc5e-dbf2bb54476f.png)
### 手順3-2.3
これでCloud SQL Administration APIが有効になりました。
プロジェクトへの認証情報の追加では「キャンセル」をクリックします。
![036.png](https://qiita-image-store.s3.amazonaws.com/0/263269/f108575e-37e9-2d2b-abd9-9c3e6a2a6161.png)
### 手順3-2.4
続いて「IAMと管理」 -> 「サービスアカウント」をクリックします。
※サービスアカウントは、個々のエンドユーザーではなく、アプリケーションや仮想マシン（VM）に属している特別なGoogleアカウントです。アプリケーションはサービスアカウントを使用して、ユーザーの関与を必要とせずにGoogleのサービスAPIを呼び出すことができます。
※必ずCloud SQL Administration APIの有効化を先に済ませてください。
![032.png](https://qiita-image-store.s3.amazonaws.com/0/263269/6817046f-03e2-e875-4a4a-14abd9b1192a.png)
### 手順3-2.5
「サービスアカウントを作成」をクリックします。
![033.png](https://qiita-image-store.s3.amazonaws.com/0/263269/e4d382a7-e114-8a92-beff-5579b640fefd.png)
### 手順3-2.6
サービスアカウント名に「sample-app-db-client」を入力し「作成」をクリックします。
![037.png](https://qiita-image-store.s3.amazonaws.com/0/263269/a788a474-b031-14e5-57a2-bad9a27373b5.png)
### 手順3-2.7
役割に「Cloud SQL クライアント」を入力し「続行」をクリックします。
![038.png](https://qiita-image-store.s3.amazonaws.com/0/263269/6175485b-b007-04e2-aeda-0d3bb0c6cf6b.png)
### 手順3-2.8
最後に「キーを作成」をクリックします。
![040.png](https://qiita-image-store.s3.amazonaws.com/0/263269/91d46dc9-8b83-8344-3b04-6c9527eb3506.png)
### 手順3-2.9
詳細画面で「JSON」が選ばれていることを確認し「作成」をクリックします。
![041.png](https://qiita-image-store.s3.amazonaws.com/0/263269/ed566b1f-ea8d-8033-cfa6-7194d92b8cd5.png)
### 手順3-2.10
ブラウザにJSONファイルがダウンロードされます。
![042.png](https://qiita-image-store.s3.amazonaws.com/0/263269/ed00cf71-3ec2-9d46-a711-356053595da4.png)
### 手順3-2.11
ブラウザにダウンロードされたJSONファイルをアップロードします。
![043.png](https://qiita-image-store.s3.amazonaws.com/0/263269/7827c1c0-d069-6d01-08b2-9112b0022af9.png)
### 手順3-2.12
ファイルがアップロードされたか確認します。

```
[userid]@cloudshell:~ ([project_id])$ ls -Fal
-rw-r--r-- 1 [userid] xxxxxxx      2361 Mar 10 09:25 [project_id]-xxxxxxxxxxxx.json
```

### 手順3-2.13
先ほどアップロードしたJSONを指定してsecretを作成します。
※[project_id]-xxxxxxxxxxxxの部分は各自の環境に合わせ書き換えてください。

```
[userid]@cloudshell:~ ([project_id])$ kubectl create secret generic cloudsql-instance-credentials --from-file=credentials.json=[project_id]-xxxxxxxxxxxx.json
secret "cloudsql-instance-credentials" created
```

### 手順3-2.14
Cloud Sql Proxyがデータベース・アクセス時に使うユーザとパスワードを指定してsecretを作成します。

```
[userid]@cloudshell:~ ([project_id])$ kubectl create secret generic cloudsql-db-credentials --from-literal=username=proxyuser --from-literal=password=123456
secret "cloudsql-db-credentials" created
```

以上