Oracle Cloud にあるデータベースをコマンドライン（CLI）から起動・停止してみた

**■■■Oracle Cloudのウェビナーシリーズは→[こちら](https://bit.ly/2VJS8pU)■■■**

Oracle Cloud環境に、Compute Instanceや、データベース（Oracle DatabaseのVM Instance）や、Oracle Autonomous Data Warehouse Cloud（ADW）を作って最近よく触っているのですが、

[OCIのインスタンスをiOSから操作できるOCI Managerを使ってみる](https://qiita.com/mmarukaw/items/0c763bfbfbfbf4bedb02)

をセットアップし、iPhoneからインスタンスの起動停止を行なってみました。超便利！

ただ、現時点で、このツールはCompute InstanceとADWの起動停止はできるものの、データベースは対応していません。iPhoneから操作できないのは残念ですが、Webブラウザを起動してコンソールにアクセスして...ではなく、Windows環境からコマンド一発で操作できるよう OCI CLIをセットアップしてみました。

**※以降、「データベース」とは「Oracle Cloud Infrastructure環境の、Database - Virtual Machines（PaaS）」のことを指しています。**

**※「データベースの起動・停止」と表現していますが、正確には「データベースが起動しているVMを起動・停止」しています。**

# まず結論から：実行したコマンド

上から順に、データベースの起動/停止/状態表示(=情報取得)

```
$ oci db node start --db-node-id <db nodeのOCID> --wait-for-state AVAILABLE
$ oci db node stop --db-node-id <db nodeのOCID> --wait-for-state STOPPED
$ oci db node get --db-node-id <db nodeのOCID>
```

※参考（最新情報等はこちらの公式ドキュメント↓）起動停止以外にも色々できる。
- [Oracle Cloud Infrastructure CLI Command Reference](https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/index.html)

# やったことを順番に

Windows10環境から、冒頭のコマンドを実行したかったので、そのセットアップ手順。

OCIのCLIを使うだけだけなら、WindowsのコマンドプロンプトやPowerShellコンソールなどでも実行可能。今回はLinuxでBashターミナルを利用しシェルスクリプト化したかったので、Windows Subsystem for Linux（WSL）をセットアップして、その中にOCIのCLIをインストールする。

## 環境

Windows 10
- WSL（Windows Subsystem for Linux）で Ubuntu をインストール
- （Ubuntu 内の Python3 Version は Python 3.6.7）

## Windows 10 環境でWSLを有効にしUbuntuをインストール

Windows 10から利用可能な、WSL（Windows Subsystem for Linux）を使うと、Linux向けのバイナリプログラムをそのまま実行できるようになる。以下の手順で実行。

[Windows 10でLinuxプログラムを利用可能にするWSLをインストールする（バージョン1803以降対応版）]
(http://www.atmarkit.co.jp/ait/articles/1608/08/news039.html)

手順内でUbuntuにログインするユーザ名/パスワードを設定しているので忘れないように。（久々に使おうとしたら、入力を求められるも忘れてて困りました。。。）

## Oracle Cloud InfrastructureのCLIをインストール

### インストール

[Oracle Cloud InfrastructureのCLIをvirtualenv環境内にインストールする]
(http://charleysdiary.hatenablog.com/entry/2019/01/06/004920)

の手順通りに、インストール。この手順に従った理由は引用参照↓↓↓。

> Oracle Cloud Infrastructure（以下、OCI）のCLIはPythonで実装されています。Pythonのvirtualenvを使って、OCI CLI専用の環境を切ってインストールしておけば、Pythonにありがちな依存モジュールの問題に悩まされずに済みますので、このエントリーではその手順を書きます。


以下は実行したコマンドを備忘録として。詳細はリンク先参照。

```
   1  sudo apt update
   2  sudo apt install python3-pip
   3  pip3 install virtualenv
   4  python3 -m virtualenv ~/.pyenv_oci-cli --no-site-packages
   5  source ~/.pyenv_oci-cli/bin/activate
   6  pip install oci-cli
   7  oci -h
```

### 環境設定と確認

続けて、上のサイトに記載されているように

[Oracle Cloud Infrastructure CLIを設定してみた](http://chiroito.hatenablog.jp/entry/2018/12/03/000000)

の手順で、接続に必要な環境設定を行う。

最初のステップの、ociコマンドを使って公開鍵・秘密鍵の生成をしているところを抜粋した。ここまでの手順でvirtualenvが有効な状態なので(上の **5 source ~/.pyenv_oci-cli/bin/activate**により有効になる）、コマンドプロンプトは先頭に(.pyenv_oci-cli)表示があるはず。

```
(.pyenv_oci-cli) miki@MKAWAUCH-JP:~$ oci setup keys
Enter a passphrase for your private key (empty for no passphrase):
Public key written to: /mnt/c/linux_home/.oci/oci_api_key_public.pem
Private key written to: /mnt/c/linux_home/.oci/oci_api_key.pem
Public key fingerprint: XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
```

最後のステップ（確認）では、以下のように、データベースの情報を表示。（WebコンソールからデータベースやコンパートメントのOCIDを確認してコマンドを実行する）

```
$ oci db database list -c <コンパートメントのOCID> --db-system-id <データベースのOCID>
WARNING: Permissions on /mnt/c/linux_home/.oci/config are too open. To fix this please execute the following command: oci setup repair-file-permissions --file /mnt/c/linux_home/.oci/config
WARNING: Permissions on /mnt/c/linux_home/.oci/oci_api_key.pem are too open. To fix this please execute the following command: oci setup repair-file-permissions --file /mnt/c/linux_home/.oci/oci_api_key.pem
{
  "data": [
    {
      "character-set": "AL32UTF8",
      "compartment-id": "ocid1.compartment.oc1..XXXXX",
      "db-backup-config": {
        "auto-backup-enabled": false
      },
      "db-home-id": "ocid1.dbhome.oc1.XXX.XXXXX",
      "db-name": "mydb",
      "db-unique-name": "mydb_XXXXXX",
      "db-workload": "OLTP",
      "defined-tags": {},
      "freeform-tags": {},
      "id": "ocid1.database.oc1.XXX.XXXXX",
      "lifecycle-details": null,
      "lifecycle-state": "AVAILABLE",
      "ncharacter-set": "AL16UTF16",
      "pdb-name": "pdb1",
      "time-created": "2019-01-15T04:06:14.838000+00:00"
    }
  ]
}
```


データベースのOCIDは、左上「MENU」→ 「Bare Metal, VM and Exadata」から、対象のデータベースを表示することで確認できる。

![01menu.png](https://qiita-image-store.s3.amazonaws.com/0/297987/fd5fcfdc-8110-63ac-454f-14f922b6b148.png)



### 補足：実行時のWARNING

WSLのホームディレクトリの設定場所(デフォルトから変更した場合など)によっては、冒頭に WARNING: が2つ出る場合がある。ファイルのパーミッションが緩いことに起因（両方共777だった）するが、WARNING内に指定のコマンドを実行しても変わらなかったのでこのままにしている。

```
$ ls -la /mnt/c/linux_home/.oci/oci_api_key.pem
-rwxrwxrwx 1 root root 1679 Jan 22 15:15 /mnt/c/linux_home/.oci/oci_api_key.pem
$ ls -la /mnt/c/linux_home/.oci/config
-rwxrwxrwx 1 root root 308 Jan 22 15:24 /mnt/c/linux_home/.oci/config
```

## OCI CLIからデータベースの起動停止を実行

### データベースのノードのOCIDを確認する

**ここからの操作は、先程使用したデータベースのOCIDではなく、ノードのOCIDを指定する。**

データベースを表示した後、左下「Resources」にある「Nodes(1)」をクリックすると、以下の画面になる。Nodes内にある OCIDが、ノードのOCID。

![02node.png](https://qiita-image-store.s3.amazonaws.com/0/297987/d4c1a93f-ac0b-8d05-f71c-63c000f7347c.png)

### コマンド実行：データベースを起動

ここから、冒頭のコマンドを順に実行していく。

**--wait-for-state <ステータス名> の指定は、そのステータスになるまで、コマンドプロンプトが返らない。**（必須ではないが便利）

```
$ oci db node start --db-node-id <db nodeのOCID> --wait-for-state AVAILABLE
Action completed. Waiting until the resource has entered state: AVAILABLE <== この後、AVAILABLEになるまでしばらく待つ
{
  "data": {
    "backup-vnic-id": null,
    "db-system-id": "ocid1.dbsystem.oc1.XXX.XXXXX",
    "hostname": "mydb",
    "id": "ocid1.dbnode.oc1.XXX.XXXXX",
    "lifecycle-state": "AVAILABLE",
    "software-storage-size-in-gb": 200,
    "time-created": "2019-01-15T04:06:14.837000+00:00",
    "vnic-id": "ocid1.vnic.oc1.XXX.XXXXX"
  },
  "etag": "XXXXXXXX"
}
```

Webのコンソールの「Resources -> Nodes(1)」で見てみると、AVAILABLE表示。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/90b0cb6f-bef2-a3b2-0cc0-d5d2ca90a709.png)

### コマンド実行：データベースを停止

```
$ oci db node stop --db-node-id <db nodeのOCID> --wait-for-state STOPPED
Action completed. Waiting until the resource has entered state: STOPPED
{
  "data": {
    "backup-vnic-id": null,
    "db-system-id": "ocid1.dbsystem.oc1.XXX.XXXXX",
    "hostname": "mydb",
    "id": "ocid1.dbnode.oc1.XXX.XXXXX",
    "lifecycle-state": "STOPPED",
    "software-storage-size-in-gb": 200,
    "time-created": "2019-01-15T04:06:14.837000+00:00",
    "vnic-id": "ocid1.vnic.oc1.XXX.XXXXX"
  },
  "etag": "XXXXXXXX"
}
```

Webのコンソールの「Resources -> Nodes(1)」で見てみると、STOPPED表示。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/297987/07f42184-b30e-9903-075b-d21ade6c6390.png)

### コマンド実行：状態確認

lifecycle-stateから、現在の状態が確認できる。
（get指定自体は、状態確認というよりは、このデータベースノードの情報を取得するためのもの）

```
$ oci db node get --db-node-id <db nodeのOCID>
{
  "data": {
    "backup-vnic-id": null,
    "db-system-id": "ocid1.dbsystem.oc1.XXX.XXXXX",
    "hostname": "mydb",
    "id": "ocid1.dbnode.oc1.XXX.XXXXX",
    "lifecycle-state": "AVAILABLE", <== ステータスはAVAILABLEであることが分かる
    "software-storage-size-in-gb": 200,
    "time-created": "2019-01-15T04:06:14.837000+00:00",
    "vnic-id": "ocid1.vnic.oc1.XXX.XXXXX"
  },
  "etag": "XXXXXXXX"
}
$
```

## シェルスクリプト化

Ubuntuアイコンクリックし起動、./mydb.sh start (または stop, get) で実行できるよう、mydb.shとしてスクリプト化。（載せるほどでもないベタ書きですが・・・）

### 実行例

```
$ ./mydb.sh start
$ ./mydb.sh stop
$ ./mydb.sh get
```

### スクリプト

```mydb.sh
#!/bin/sh

. ~/.pyenv_oci-cli/bin/activate

if [ "$1" = "" ]
then
    echo "Usage: "
    echo $0 "stop"
    echo $0 "start"
    echo $0 "get"
    exit 1
fi

echo $1

case $1 in
        "stop" ) oci db node stop --db-node-id <db nodeのOCID> --wait-for-state STOPPED ;;
        "start" ) oci db node start --db-node-id <db nodeのOCID> --wait-for-state AVAILABLE ;;
        "get" | "status" ) oci db node get --db-node-id <db nodeのOCID> ;;
esac
```

# 参考

※本文中にリンク貼ったものを再掲

- [Oracle Cloud Infrastructure CLI Command Reference](https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/index.html)
- [Oracle Cloud InfrastructureのCLIをvirtualenv環境内にインストールする]
(http://charleysdiary.hatenablog.com/entry/2019/01/06/004920)
- [Oracle Cloud Infrastructure CLIを設定してみた](http://chiroito.hatenablog.jp/entry/2018/12/03/000000)

※それ以外

- [Oracle Cloud : コマンド・ライン・インタフェース(CLI) をインストールしてみた](https://qiita.com/shirok/items/e63be9a22158fef10ba9)
- [コマンドライン(CLI)でOCIを操作する - Oracle Cloud Infrastructureアドバンスド](https://community.oracle.com/docs/DOC-1019624)
- [製品ドキュメント：Oracle Cloud Infrastructure Documentation - Bare Metal and Virtual Machine DB Systems](https://docs.cloud.oracle.com/iaas/Content/Database/Concepts/overview.htm)

# 最後に

（一応念の為記載です、ご利用は自己責任にてよろしくお願いいたします。）