OCI をFree Tier(Always Free)の範囲で触ってみる

# はじめに

OCI の勉強がしたい、が、課金は嫌だ、ということで、
OCI Cloud Free Tier(Always Free クラウドサービス)の範囲で触れる箇所を触ってみる。



OCI Cloud Free Tierの詳細は下記。

https://www.oracle.com/jp/cloud/free/

最初の30日間の無料枠に加え、その後もAlways Free クラウドサービス として
* Compute VM * 2
* Automonous DB * 2 


等が無料で利用可能。勉強用途で大変ありがたい。
OCIのアカウントを作成すると、最初は自動でFree Tierアカウントとなり、無料で使える箇所しか使えない安心設定になっている。
すでに最初の30日は過ぎてしまったため、Free Tierアカウントの範囲内でAlways Freeで使える箇所を試す。

# VCN

「VCNウィザードの起動」から作成。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/634cf1be-62dd-0cf8-c60f-c78db18c9da1.png)

VCN名：my-vcn、コンパートメントはあらかじめ作成したmy-compartmentとして後はデフォルトで作成。
デフォルトでは

* VCNのサブネット：10.0.0.0/16
* パブリックサブネット：10.0.0.0/24
* プライベートサブネット10.0.1.0/24

が設定される。

VCNウィザードの記載によれば、本来はインターネット・ゲートウェイ、NATゲートウェイ、サービスゲートウェイもセットで作成されるはずなのだが、always freeではインターネットゲートウェイしか作成されないようだ。後からサービスゲートウェイを個別に作成してみようともしてみたが、制限に引っかかってできなかった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/ea0e56da-72b0-5bea-53d1-b58a04e64d23.png)

デフォルトのセキュリティリストはインターネットからのsshを受け入れる設定。後で自宅のIPからのみ許可、等に絞っておきたい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/02bb7898-5e14-59b8-6107-64b6ac3826e2.png)




# Compute VM

my-instanceという名前でコンピュートインスタンスを作成する。
* コンパートメント名：my-compartment
* VCN：my-vcn
* サブネット：パブリック・サブネットmy-vcn

で作成。（右下にブートボリュームの月額料金が書いてあるのが気になるが・・・これだけ別料金なのか？）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/e6eec7c4-b5bb-8ef9-dacd-fe15b8cd09fd.png)

1分もかからず作成が完了。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/2ef17789-7388-d613-008c-803a9da55ddb.png)


インスタンス作成時にDLした秘密鍵でログインできた。

```powershell:powershell
PS > ssh -i .\ssh-key-2023-10-09.key opc@XXX.XXX.XXX.XXX
Activate the web console with: systemctl enable --now cockpit.socket

Last login: Mon Oct  9 03:36:07 2023 from XXX.XXX.XXX.XXX
[opc@my-instance ~]$
[opc@my-instance ~]$ cat /etc/*release*
Oracle Linux Server release 8.8
NAME="Oracle Linux Server"
VERSION="8.8"
ID="ol"
ID_LIKE="fedora"
VARIANT="Server"
VARIANT_ID="server"
VERSION_ID="8.8"
PLATFORM_ID="platform:el8"
PRETTY_NAME="Oracle Linux Server 8.8"
ANSI_COLOR="0;31"
CPE_NAME="cpe:/o:oracle:linux:8:8:server"
HOME_URL="https://linux.oracle.com/"
BUG_REPORT_URL="https://github.com/oracle/oracle-linux"

ORACLE_BUGZILLA_PRODUCT="Oracle Linux 8"
ORACLE_BUGZILLA_PRODUCT_VERSION=8.8
ORACLE_SUPPORT_PRODUCT="Oracle Linux"
ORACLE_SUPPORT_PRODUCT_VERSION=8.8
Red Hat Enterprise Linux release 8.8 (Ootpa)
Oracle Linux Server release 8.8
cpe:/o:oracle:linux:8:8:server
```

素のままだとふと手を離したすきにsshが切断されてしまって不便なため以下を設定。
```console:
[root@my-instance ~]# cat /etc/ssh/sshd_config  | grep Client
ClientAliveInterval 60
ClientAliveCountMax 3
```


# Autonomous DB

### Autonomous DBの作成

以下で作成する。 Oracle Autonomous DBには

* データウェアハウス：Autonomous Data Warehouse（ADW）
* トランザクション処理：Autonomous Transaction Processing（ATP）
* JSON：Autonomous JSON Database
* APEX：APEX Application Development

の4種類があるが、ここではデータウェアハウスを選択。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/68e7f114-3497-a643-489f-c20cac2f4774.png)

「ネットワーク・アクセスの選択」は「すべての場所からのセキュア・アクセス」を選択。

※折角OCIのコンピュートインスタンスも立てたので、インスタンスからautonomous DBに接続することを見越して、「許可されたIP及びVCN限定のセキュア・アクセス」としたいところだが、そのようにはせず。後述。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/ec36a2ea-2221-15ba-5959-4775967576aa.png)

数分で作成完了する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/bb40ab85-043e-055e-e2e3-fbecbe278730.png)


# compute VMからautonomous DBへ接続

パブリックサブネットに配置されたcompute VMから、autonomous DBにsqlplusで接続することを考える。
ここでは、インターネット経由で接続することとし、OCIの内部で通信を完結させることはしない。
というのも、OCIのコンピュートインスタンスから、インターネットを経由せずに直接内部でautomonous DBに通信したい場合、サービスゲートウェイを経由する必要がある、が、Always Free アカウントではサービスゲートウェイを作成できない・・という事情があるため。

### compute VMにoracle instant client, sqlplus, toolsを導入

https://qiita.com/shirok/items/bcc355de5515ee54e8dc
手順は上記を参考にした。


https://www.oracle.com/jp/database/technologies/instant-client/linux-x86-64-downloads.html#ic_x64_inst

上記から
* Basicパッケージ（RPM）：oracle-instantclient19.20-basic-19.20-0.0-1.x86_64.rpm
* SQL*Plusパッケージ（RPM）：oracle-instantclient19.20-sqlplus:19.20.0.0.0.0-1.x86_64.rpm
* ツール・パッケージ（RPM）：oracle-instantclient19.20-tools-19.20.0.0.0-1.x86_64.rpm
    * ツールはなくてもよいが、data pump, SQL*Loaderを使いたい場合は必要。今回はついでに

をダウンロードする。

scpでインスタンスに送り、インスタンス上で以下を実行。（手順の詳細は上記の「インストール手順」を参照）
`/usr/lib/oracle/19.20/client64`配下にパッケージが配置される。

```console:
[root@my-instance ~]# yum install oracle-instantclient19.20-sqlplus:19.20.0.0.0.0-1.x86_64.rpm
(略)
[root@my-instance ~]# yum install oracle-instantclient19.20-basic-19.20-0.0-1.x86_64.rpm
(略)
[root@my-instance ~]# rpm -qa | grep instantclient
oracle-instantclient19.20-sqlplus-19.20.0.0.0-1.x86_64
oracle-instantclient19.20-basic-19.20.0.0.0-1.x86_64
[root@my-instance ~]# rpm -ql oracle-instantclient19.20-sqlplus-19.20.0.0.0-1.x86_64
/usr/bin/sqlplus
/usr/bin/sqlplus64
/usr/lib/oracle
/usr/lib/oracle/19.20
/usr/lib/oracle/19.20/client64
/usr/lib/oracle/19.20/client64/bin
/usr/lib/oracle/19.20/client64/bin/sqlplus
/usr/lib/oracle/19.20/client64/lib
/usr/lib/oracle/19.20/client64/lib/glogin.sql
/usr/lib/oracle/19.20/client64/lib/libsqlplus.so
/usr/lib/oracle/19.20/client64/lib/libsqlplusic.so
/usr/share/oracle
/usr/share/oracle/19.20
/usr/share/oracle/19.20/client64
/usr/share/oracle/19.20/client64/doc
/usr/share/oracle/19.20/client64/doc/SQLPLUS_LICENSE
/usr/share/oracle/19.20/client64/doc/SQLPLUS_README
```

sqlplus が叩けるようになる。
（`/usr/bin/sqlplus`がシンボリックリンクとして追加されており、特にPATHの追加は不要の模様。）
```console:
[root@my-instance ~]# which sqlplus
/usr/bin/sqlplus
[root@my-instance ~]# ll /usr/bin/sqlplus
lrwxrwxrwx. 1 root root 42 Jul 15 04:34 /usr/bin/sqlplus -> /usr/lib/oracle/19.20/client64/bin/sqlplus(/usr/share/Modules/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
[root@my-instance ~]# sqlplus

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 9 06:58:59 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Enter user-name: ^C
[root@my-instance ~]#
```

### ウォレットのダウンロード

「データベース接続」から、autonomous DB接続用のウォレットをダウンロードする。`Wallet_myautonomousDB.zip`なるzipファイルを取得できる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1523824/ecd160f6-b55f-f54d-4bf9-ce18f582428d.png)

scpでインスタンスに送る。`Wallet_myautonomousDB.zip`を解凍すると以下のファイルが入っている。
```console
[root@my-instance ~]# ll /home/opc/Wallet/
total 72
-rw-r--r--. 1 root root  5349 Oct  9 04:44 cwallet.sso
-rw-r--r--. 1 root root  5304 Oct  9 04:44 ewallet.p12
-rw-r--r--. 1 root root  5710 Oct  9 04:44 ewallet.pem
-rw-r--r--. 1 root root  3190 Oct  9 04:44 keystore.jks
-rw-r--r--. 1 root root   691 Oct  9 04:44 ojdbc.properties
-rw-r--r--. 1 root root  3044 Oct  9 04:44 README
-rw-r--r--. 1 root root   114 Oct  9 04:44 sqlnet.ora
-rw-r--r--. 1 root root   804 Oct  9 04:44 tnsnames.ora
-rw-r--r--. 1 root root  2056 Oct  9 04:44 truststore.jks
-rw-rw-r--. 1 opc  opc  21974 Oct  9 04:45 Wallet_myautonomousDB.zip
```

解凍されたファイル一式（zip本体除く）を、`/usr/lib/oracle/19.20/client64/lib/network/wallet/` に配置する。
```console
[root@my-instance ~]# mkdir  /usr/lib/oracle/19.20/client64/lib/network/wallet/
[root@my-instance ~]# cp -pi /home/opc/Wallet/* /usr/lib/oracle/19.20/client64/lib/network/wallet/
[root@my-instance ~]# rm  /usr/lib/oracle/19.20/client64/lib/network/wallet/Wallet_myautonomousDB.zip
[root@my-instance ~]# ll  /usr/lib/oracle/19.20/client64/lib/network/wallet/
total 48
-rw-r--r--. 1 root root 5349 Oct  9 04:44 cwallet.sso
-rw-r--r--. 1 root root 5304 Oct  9 04:44 ewallet.p12
-rw-r--r--. 1 root root 5710 Oct  9 04:44 ewallet.pem
-rw-r--r--. 1 root root 3190 Oct  9 04:44 keystore.jks
-rw-r--r--. 1 root root  691 Oct  9 04:44 ojdbc.properties
-rw-r--r--. 1 root root 3044 Oct  9 04:44 README
-rw-r--r--. 1 root root  149 Oct  9 04:50 sqlnet.ora
-rw-r--r--. 1 root root  804 Oct  9 04:44 tnsnames.ora
-rw-r--r--. 1 root root 2056 Oct  9 04:44 truststore.jks
```

`sqlnet.ora` に、ウォレットが配置されたディレクトリを記載する欄がある。
デフォルトの値から修正する。

```console
[root@my-instance ~]# cat  /usr/lib/oracle/19.20/client64/lib/network/wallet/sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="?/network/admin")))
SSL_SERVER_DN_MATCH=yes

[root@my-instance ~]# vi /usr/lib/oracle/19.20/client64/lib/network/wallet/sqlnet.ora　★修正
[root@my-instance ~]# cat  /usr/lib/oracle/19.20/client64/lib/network/wallet/sqlnet.ora
WALLET_LOCATION = (SOURCE = (METHOD = file) (METHOD_DATA = (DIRECTORY="/usr/lib/oracle/19.20/client64/lib/network/wallet")))
SSL_SERVER_DN_MATCH=yes
```


tnsnames.oraの中身には以下が記載されている。特に修正不要。
処理の性質に応じて使い分ける意図で、複数の接続サービスがあらかじめ用意されている。
（内部的にはリソースマネージャのコンシューマーグループにマッピングされているとのこと）
https://blogs.oracle.com/oracle4engineer/post/adb-services-shares-201905

```
[root@my-instance ~]# cat  /usr/lib/oracle/19.20/client64/lib/network/wallet/tnsnames.ora
myautonomousdb_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_myautonomousdb_high.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))

myautonomousdb_low = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_myautonomousdb_low.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))

myautonomousdb_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=xxxxxxxxxxxxxxx_myautonomousdb_medium.adb.oraclecloud.com))(security=(ssl_server_dn_match=yes)))
```

### 環境変数の設定

あまり作法がわからず、以下で設定

```bash
[opc@my-instance ~]$  cat .bashrc | tail -n 5
export ORACLE_BASE=/usr/lib/oracle/
export ORACLE_HOME=/usr/lib/oracle/19.20
export TNS_ADMIN=/usr/lib/oracle/19.20/client64/lib/network/wallet/
export NLS_LANG=japanese_japan.UTF8
export PATH=$PATH:/usr/lib/oracle/19.20/client64/bin
```

###  接続確認

以下で疎通できる。

```console:
[root@my-instance ~]# sqlplus ADMIN/"パスワード"@myautonomousdb_medium

SQL*Plus: Release 19.0.0.0.0 - Production on Mon Oct 9 07:26:48 2023
Version 19.20.0.0.0

Copyright (c) 1982, 2022, Oracle.  All rights reserved.

Last Successful login time: Mon Oct 09 2023 07:24:45 +00:00

Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.21.0.1.0

SQL> select * from user_tables;

no rows selected

SQL>
```