Hey Siri! Autonomous Databaseを起動して！

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

こちらで紹介されていた内容をやってみました。
https://blogs.oracle.com/developers/hey-siri-create-my-oracle-autonomous-database

上のBLOGではAutonomous Databaseを作成していますが、ここではAutonomous Databaseの起動/停止/ステータス確認をしています。

iOS 12以降で実装されている、iPhoneの「ショートカット」機能を使っていますが、それ以外の部分は、Oracle Cloudを利用する際の一般的な手順となります（コマンドベースでの管理ツールである**oci cliからAutonomous Databaseを操作する場合の一連の手順**）。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/d3a92a04-fa35-21c7-07e5-b63482403814.png)

ちなみに、**OCI Manager** という便利なiPhoneアプリ(公式ではありませんが)を使っても、
Autonomous Databaseの起動停止は簡単に行えます。
[OCIのインスタンスをiOSから操作できるOCI Managerを使ってみる](https://qiita.com/mmarukaw/items/0c763bfbfbfbf4bedb02)
（あれっ？OCI Managerをショートカットに登録すれば良かったのでは...という気がしますが、一旦忘れます）


# 環境

**①iPhone --(SSH公開鍵認証)--> ②OCI上のCompute --(oci cliで操作)--> ③Autonomous Database**

- ②のOS：Oracle Linux 7
- ②のOSユーザ名：app　(事前に作成済み)

注：②Computeインスタンスには「パブリックIPアドレスを割当て」しておく。（下の図はインスタンス作成時にラジオボタンで指定している）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/9effcf25-01f8-dedb-bf48-2d6e80e8a63b.png)

# やったこと

## oci cli を実行できるようセットアップする

①iPhone --(SSH公開鍵認証)--> **②OCI上のCompute --(oci cliで操作)-->** ③Autonomous Database

**②OCI上のComputeインスタンス**に、appユーザでログインし

[Oracle Cloud Infrastructure の Python SDKを使ってObject Storageにファイルをアップロード](https://qiita.com/mikika/items/ca63d02b0ad510f8b8ea#%E6%BA%96%E5%82%99)
の**「準備」**の「公開鍵の登録」までを実行する。（途中、バケットの作成と、pipenv install oci は実施不要）

※冒頭のBLOGのように、Oracle Cloud Developer Imageを使用したComputeインスタンスを作成した場合は、Python環境を整えるところはSKIP可能。（その場合は使用したPython仮想環境に応じて後続の手順を、適宜読み替えて下さい）

## Autonomous Databaseを起動停止するスクリプトを作成する

①iPhone --(SSH公開鍵認証)--> **②OCI上のCompute --(oci cliで操作)-->** ③Autonomous Database

以前、[（Autonomousではない）データベースを起動停止するベタ書きスクリプト(mydb.sh)を作成](https://qiita.com/mikika/items/5a93c669d725a9dfc846)したときの内容を参考に、/home/app/mypj/util/mydb.sh として準備。--wait-for-state の説明などは前回分(リンク先)参照。

今回のmydb.sh では、

- 変数ADBに、Autonomous Databaseのocidを指定
- 今回のPython仮想環境が pyenv + pipenv なので、oci db .. の それぞれ冒頭で pipenv run 
- --query 'data."lifecycle-state"' 指定は、JMESPathでの指定（oci db .. 実行結果のjsonの一部だけ表示）

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

# Autonomous Databaseの ocidを指定する
ADB="ocid1.autonomousdatabase.oc1.xxx.xxxxxxxxxxxxxxxxxxx"

cd /home/app/mypj

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

case $1 in
        "stop" ) pipenv run oci db autonomous-database stop --autonomous-database-id ${ADB} --wait-for-state STOPPED --query 'data."lifecycle-state"' ;;
        "start" ) pipenv run oci db autonomous-database start --autonomous-database-id ${ADB} --wait-for-state AVAILABLE --query 'data."lifecycle-state"' ;;
        "get" | "status" ) pipenv run oci db autonomous-database get --autonomous-database-id ${ADB} --query 'data."lifecycle-state"' ;;
esac
```

（ついstatusと打ちたくなるので、case 内ではgetとstatusと両方受け付けるようにしている）

以下を実行し、Autonomous Databaseの起動/停止/ステータス確認する。

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

それぞれ、「"AVAILABLE"」「"STOPPED"」「"<ステータスに応じた値>"」が返る。

## iPhoneから「SSH経由でスクリプトを実行」するショートカットを作成する

**①iPhone --(SSH公開鍵認証)-->** ②OCI上のCompute --(oci cliで操作)--> ③Autonomous Database

ショートカットの作成は、

- iPhoneで「ショートカット」を起動（「ショートカット」アプリがない場合はインストール）
- 「ショートカットを作成」
- 「スクリプティング」 → 「SSH経由でスクリプトを実行」を選択

こんな感じ↓↓で ②OCI上のComputeのPublic IPアドレスやユーザ名など、ログイン情報や、実行するスクリプトを入力。（下図では、いきなりOperation変数を定義して /home/.../mydb.sh を指定しているが、まずは引数無しでdateコマンドとかで試すのがよいかと）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/0302d79f-98d1-1527-6cf4-2094d8e031e0.png)


- 「認証」に「SSHキー」を選択
- 「SSHキー」をクリックすると、SSHキーの作成画面になる
- RSAの場合は 最低2048ビットを推奨、と[マニュアルに記載があった](https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/managingkeypairs.htm)のでそれを指定して作成した　"A minimum of 2048 bits is recommended for SSH-2 RSA."

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/7ee00a50-7fe4-7a96-11af-201142e11f3b.png)

「キーを生成」をクリックし、SSHキーのペアを作成する。
「公開鍵を共有」をクリックし、公開鍵を何らかの形で吸い上げる。

## SSH公開鍵認証でログインできるよう設定する

①iPhone --**(SSH公開鍵認証)--> ②OCI上のCompute** --(oci cliで操作)--> ③Autonomous Database

先の手順「公開鍵を共有」で得られたファイルを appユーザの $HOME/.ssh/authorized_keysに貼り付け。

マニュアルに少し手順があるが、追加で、ファイルのパーミッションについても設定が必要。
[Adding Users on an Instance - Creating Additional SSH-Enabled Users on Linux Instances](https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/addingusers.htm)

今回はapp ユーザで、以下の内容を実施した。

```
$ mkdir ~/.ssh

### authorized_keysファイルに 公開鍵の内容を記入する
$ echo "ssh-rsa AAA*************************9XB iPhone XX" >>  ~/.ssh/authorized_keys

$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/authorized_keys

### (.sshディレクトリ, authorized_keysファイルのパーミッションは以下の状態）
$ ls -la ~/.ssh
total 8
drwx------.  2 app app   29 Nov  7 13:00 .
drwx------. 13 app app 4096 Nov  7 14:36 ..
-rw-------.  1 app app  391 Nov  7 13:00 authorized_keys
```

## iPhoneからショートカットを実行してみる

ここまできたら iPhoneからのSSH公開鍵認証→スクリプト実行ができるので、再生ボタン▶をクリックして試しに実行してみる。

## start/stop/statusを変数にしたり、アイコンを整える

最終的にこんな感じに。赤枠内が既に作成済みのところ、その前後に、Operationという名前の変数にリストから選んだ値を代入したり、最後に結果表示を入れたり。**iPhoneのショートカットを初めて触ったので、これがベストかどうかは全く分かりませんが...。**

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/83ce1543-2c8b-c761-884e-be80e63521f6.png)

ショートカットに付けた名前「Autonomous Database」が、Siriで起動するときの言葉になる。

最後に、アイコンを優しい赤色の車に変更する。（Autonomous Databaseといえば、いつも赤い車の絵で表現されるので、それっぽいアイコンを選びたい）


# 実行 (Hey Siri!)

**「Hey Siri! Autonomous Database!」** と呼びかけると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/9d8a3fc3-aa67-e8e8-a292-fda323d54826.png)

startをクリックし、起動が完了すると、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/249bfe19-563e-e22e-0aad-d3c2e3e687d2.png)

# 実行 (ショートカットのアイコンをクリック)

アイコンクリックし、「Status」を選んだときの様子。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/7c4f9644-975c-0623-fd96-cf966b82eed8.png)

<img width="375" alt="IMG_1802.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/f074da6b-8fe1-1926-7700-200e4258bb8e.png">

<img width="375" alt="IMG_1803.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/297987/4ad6d6da-7b10-de5c-5019-b83e2db3b33b.png">


# 最後に
本資料の内容は、動作確認を目的に、エラーハンドリング等もない簡単なサンプルコードとなります。

# 参考

- Oracle Cloud Infrastructure CLI Command Reference
    - https://docs.cloud.oracle.com/iaas/tools/oci-cli/latest/oci_cli_docs/index.html

- Adding Users on an Instance - Creating Additional SSH-Enabled Users on Linux Instances
    - https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/addingusers.htm

- Managing Key Pairs on Linux Instances
    - https://docs.cloud.oracle.com/iaas/Content/Compute/Tasks/managingkeypairs.htm

- JMESPath指定
    - https://community.oracle.com/docs/DOC-1019624#jive_content_id_4_JMESPath