IBM Cloud Databases for PostgreSQL ことはじめ

# IBM Cloud Databases for PostgreSQL とは
IBM Cloud Database (ICD) はIBM Cloudで提供しているフルマネージドのデータベースサービス群です。2019/04/07現在、PostgreSQL、Redis、ElasticSearch、etcd、MongoDB、RabbitMQの6種類が使えます。

デフォルトでIBM CloudのMZR（マルチゾーンリージョン）にクラスターとして分散配置されるため、非常に可用性が高いのが特長です。また、バックアップはクロスリージョナルのICOS（IBM Cloud Object Storage）に自動で取得されます。

本記事では「Databases for PostgreSQL」サービスについて書きますが、他のデータベースの場合も始め方は同じです。

# まずはサービスインスタンスを作成
[IBM Cloud](https://cloud.ibm.com/)から「カタログ」→「Databases for PostgreSQL」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242688/25b480a3-d1bf-3b9d-b7f5-f3016fafb59a.png)
サービス詳細画面で必要な項目を選択します。

- サービス名
- デプロイする地域
    - 東京リージョンも選択可能です。
- 初期リソース（メモリ/ディスク）
    - 最小構成はメモリ1GB、ディスク5GBです。
    - ただし2メンバー構成（PostgreSQLの場合）のため実際にはメモリ2GB、ディスク10GBでプロビジョンされます
- ディスクの暗号鍵
    - Key Protect サービスで鍵を管理している場合はここでディスクを暗号化する鍵を指定できます
- バージョン
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242688/f9343b0a-6369-eddd-cdbc-11005ed3f266.png)

「作成」ボタンをクリックするとDBのデプロイが始まります。数分待てばすぐに利用可能になります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242688/31a2f2fa-a034-123f-349e-5162a23a1bcc.png)

# DBに接続してみる
## admin用パスワードの設定

ICDではデフォルトで"admin"ユーザーが作成されますが、パスワードが設定されていません。パスワードの設定は、ポータルやCLIから実施できます。

ポータルから行う場合は、「Settings」タブの中に「Change Password」という項目があるのでこちらで登録してください。任意の文字列を入力でもOKですし、思いつかない人は右側のアイコンを押せばランダムに生成してくれます。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/242688/bfde2131-9a11-a031-5e4f-ef5a549ac2c1.png)

パスワードを設定しようとすると忠告がでます。新規作成の場合は特に気にする必要はありませんが、すでにアプリと接続して動かしている場合は注意が必要ですね。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/242688/90431825-91bc-448c-0fd2-0209cdccbbac.png)

CLI経由で設定する場合はibmcloudコマンドと、cdbプラグインの導入が必要です。

```bash
# パスワードの設定
$ ibmcloud login  #IBM Cloudにログイン
$ ibmcloud plugin install cloud-databases -r 'IBM Cloud'  #プラグインのインストール
$ ibmcloud cdb user-password 'Databases for PostgreSQL-XX' admin <newpassword>  #サービス名とパスワードを指定
```

> サービスインスタンス名はポータルで確認するか、```ibmcloud resource service-instances```から確認することができます。

## DBとの接続
### psqlでの接続
CLIで以下のコマンドを叩けば接続できます。

```bash
$ ibmcloud cdb deployment-connections 'DatabasesforPostgreSQL-XX' --start
Database Password>>
psql (11.2, server 10.7)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-GCM-SHA384, bits: 256, compression: off)
Type "help" for help.

ibmclouddb=> \l
                                  List of databases
    Name    |        Owner        | Encoding | Collate |  Ctype  | Access privileges
------------+---------------------+----------+---------+---------+-------------------
 ibmclouddb | ibm-cloud-base-user | UTF8     | C.UTF-8 | C.UTF-8 |
 postgres   | ibm                 | UTF8     | C.UTF-8 | C.UTF-8 |
 template0  | ibm                 | UTF8     | C.UTF-8 | C.UTF-8 | =c/ibm           +
            |                     |          |         |         | ibm=CTc/ibm
 template1  | ibm                 | UTF8     | C.UTF-8 | C.UTF-8 | =c/ibm           +
            |                     |          |         |         | ibm=CTc/ibm
(4 rows)
```

> ```$ ibmcloud cdb cxn example-postgres -s```コマンドでも同じように接続できます。

### アプリからの接続
アプリからDBに接続する場合は各言語のドライバーを使います。
その際、接続に必要な情報はこれまたポータルまたはCLIで取得してください。

ポータルの「Overview」タブをみると、以下のような接続情報が表示されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/242688/dee39242-a6ce-cc76-1f2e-4d82a3439294.png)

CLIから取得する場合は以下のようになります。

```bash
$ ibmcloud cdb deployment-connections 'Databases for PostgreSQL-XX' -u admin
Type         Connection String
PostgreSQL   postgres://admin:$PASSWORD@xxxxxxxxxxx5c3-a4xxxxxxxxxxxxxxxa57fa5c84685d5b4.databases.appdomain.cloud:31472/ibmclouddb?sslmode=verify-full
CLI          PGPASSWORD=$PASSWORD PGSSLROOTCERT=b226x37a-ae06e730b71xxxxxxxxxx5 psql 'host=b1dxxxxxxxxxxxxxxx85d5b4.databases.appdomain.cloud port=31472 dbname=ibmclouddb user=admin sslmode=verify-full'
```

> 次のコマンドでも取得できます。```$ ibmcloud cdb cxn example-postgres -u admin```