Autonomous Databaseへ接続（クレデンシャル・ウォレット）

# 前提
* ADBが作成済み
* Cloud Shellを利用しています
* 本手順は```クレデンシャル・ウォレット```を使用し```SQLcl```と```SQL*PLUS```で接続する手順です

# Cloud Shellとは
* OCIコンソールから利用できるWebブラウザベースの端末
* Cloud Shell自体は**無償**
* OCI CLI、SQL PLUS、SQLcl、Terraform、Pythonなどのツールが事前にインストール済み
* 以下の記事がわかりやすいです
    * [OCI Cloud Shellの概要](https://qiita.com/liu-wei/items/d11aea8865accddbfd90)

# 手順
## １）Cloud Shellを起動
OCIコンソール右上のアイコンから ```Cloud Shell``` を起動します
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/1fa6c072-3442-7306-3ce7-62776287fa0d.png)
Cloud Shellが起動されるとOCIコンソールの下に表示されます
![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/3a44aecb-56d6-d82d-9e80-77754af03524.png)
左側のハンバーガーメニューから、ローカルマシン上のファイルをCloud Shellへアップロード/ダウンロードや、Cloud Shellのフォント・サイズの設定などが可能です。
![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/af9046d2-1786-e93e-fe7d-3ba9f7170797.png)

## ２）ADBのクレデンシャル・ウォレットをダウンロード
### OCI CLIでのダウンロード方法
OCIコンソールからADBインスタンスのOCIDを確認
![c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/da10ff4a-ad23-790a-561f-ad28ee937634.png)

Cloud ShellでOCI CLIの確認
```bash
$ oci -v
```
ADBのOCIDを設定
```bash
$ db_ocid=<ADBのOCID>
```
設定されているか確認
```bash
$ echo $db_ocid
```
OCI CLIを使用しクレデンシャル・ウォレットをダウンロード
```bash
$ oci db autonomous-database generate-wallet --autonomous-database-id $db_ocid --file wallet.zip --password <ウォレットのパスワード>
```
例
```
$ oci db autonomous-database generate-wallet --autonomous-database-id $db_ocid --file wallet.zip --password <ウォレット・ファイルに付与するパスワード>

```

```wallet.zip```がダウンロードされます
```bash
$ ls
```
### OCIコンソールからのダウンロード方法
```Autonomous Databaseの詳細```　→　```DB接続```
![c5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/e35e424d-c98c-6595-7357-799b6446f6a3.png)

ウォレットは2種類あります。
| 種類| 内容 | 利用ケース
|:-----------|------------:|:------------:|
| インスタンス・ウォレット（デフォルト）|特定のインスタンスの資格証明のみが記載|アプリケーションからの接続で利用|
| リージョナル・ウォレット|選択されたリージョン内の全てのインスタンスの資格証明が記載|他のインスタンスへの接続時も利用できるため、主に管理目的で利用|

今回は```インスタンス・ウォレット```を利用します。
![c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/a3e8107d-229c-9b36-1d7d-abd8053d2175.png)
ウォレット・ファイルに付与するパスワードを入力しダウンロード
![c6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/ac0fb0e9-8130-ee3e-d180-89e970d8aae0.png)
ローカルマシンにダウンロードされるので、Cloud ShellのハンバーガーメニューからCloud Shellにアップロードすることもできます

* 補足：クレデンシャル・ウォレットについて
![c1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/0b82c6be-fd93-34a5-8d95-57e2fd6fa67a.png)
出典：OCI活用資料集-[Autonomous Database 技術詳細](https://oracle-japan.github.io/ocidocs/services/database/autonomous/autonomous-database-100/)

## ３）ADBへ接続
### SQLclでの接続方法
```SQLcl```は無料のコマンドラインツールで```SQL*Plus``よりも多くの機能が備わっています。
SQLclについては、[こちら](https://www.oracle.com/jp/database/technologies/appdev/sqlcl.html)や[こちら](https://docs.oracle.com/cd/F40596_01/sqcug/working-sqlcl.html#GUID-1343FA2B-BDB4-4645-B4D4-CD7C3E200AC9)をご参照ください。

* SQLclへのログイン
```bash
$ sql /nolog
```
* ウォレットをセット
    * 今回はOCI CLIでダウンロードしたウォレット・ファイルを使用しています。
```sql
SQL> set cloudconfig wallet.zip
```
* TNS名の確認。
    * OCIコンソールの```DB接続```から```TNS名```や```接続文字列```を確認できます。
* 補足
    * ウォレット内の```tnsnames.ora```からも```TNS名```や```接続文字列```を確認できます

* ADMINユーザで接続
    * ```接続サービス```については後述
```sql
SQL> connect admin/<パスワード>@<tns名>
```
例
```sql
SQL> connect admin/Welcome#1Welcome#1@kadw_medium
```
接続できたか確認
```
SQL> show user
```
ADMINユーザで接続できたことがわかります
```
USER is "ADMIN"
```

* 補足：接続サービスについて
    * 合わせてこちらもご確認ください。
        * OCIチュートリアル-[201: 接続サービスの理解](https://oracle-japan.github.io/ocitutorials/database/adb201-service-names/)
![c2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/d30f894d-4187-640e-7251-6c8dd11f31fd.png)
![c3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/b07cbff6-cf83-3463-e5e1-20c201508120.png)
![c4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449014/dc769943-2697-ea52-b444-01685ad1b2bb.png)
出典：OCI活用資料集-[Autonomous Database 技術詳細](https://oracle-japan.github.io/ocidocs/services/database/autonomous/autonomous-database-100/)

### SQL PLUSでの接続方法
* ウォレット格納用のディレクトリを作成し、ウォレット・ファイルを$HOME/network/admin 配下に移動させます

格納用のディレクトリを作成
```bash
$ mkdir -p ~/network/admin
```
ウォレット・ファイルを移動
```bash
$  mv wallet.zip ~/network/admin
```
* 作成したディレクトリに移動し、圧縮されたウォレットファイルを展開します。

ディレクトリの移動
```bash
$ cd ~/network/admin
```
ZIPファイルを解凍
```bash
$ unzip wallet.zip
```
確認
```bash
$ ls
```
展開されるファイル
```bash
cwallet.sso  ewallet.p12  keystore.jks  ojdbc.properties  README  sqlnet.ora  tnsnames.ora  truststore.jks  wallet.zip
```
* TNS_ADMIN 環境変数にウォレットの保存先を設定します。

```bash
$ export TNS_ADMIN=~/network/admin
$ echo $TNS_ADMIN
```
* ```sqlnet.ora``` の次の行を編集し、ウォレットの保存先を置き換えます。
    * 前の手順で、保存先をTNS_ADMIN環境変数に格納しているのでこちらを使います。
```bash
$ cp -p sqlnet.ora sqlnet.ora.bk
$ vi sqlnet.ora
```
編集***前***（「```DIRECTORY=```」の箇所が「```?/network/admin```」）
```bash
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
SSL_SERVER_DN_MATCH=yes
```
編集***後***（「```DIRECTORY=```」の箇所を「```$TNS_ADMIN```」に変更）
```sql
 WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY=$TNS_ADMIN)))
SSL_SERVER_DN_MATCH=yes
```
* 環境変数```ORACLE_HOME```を設定
```bash
$ export ORACLE_HOME=~
```
* echoコマンドで中身を確認し、「```/home/[username] ```」が出力されればOK
```bash
$ echo $ORACLE_HOME
```
* ADMINユーザで接続
```bash
$ sqlplus admin/<パスワード>@<tns名>
```
例
```bash
$ sqlplus admin/Welcome#1Welcome#1@kadw_medium
```
* 接続できたか確認
```
SQL> show user
```
ADMINユーザで接続できたことがわかります
```
USER is "ADMIN"
```

# 参考情報
* OCIドキュメント
    * [クラウド・シェルの使用](https://docs.oracle.com/ja-jp/iaas/Content/API/Concepts/cloudshellgettingstarted.htm)
* OCIチュートリアル
    * [104: クレデンシャル・ウォレットを利用して接続してみよう](https://oracle-japan.github.io/ocitutorials/database/adb104-connect-using-wallet/#1-%E3%82%AF%E3%83%AC%E3%83%87%E3%83%B3%E3%82%B7%E3%83%A3%E3%83%AB%E3%82%A6%E3%82%A9%E3%83%AC%E3%83%83%E3%83%88%E3%81%AE%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89)