Autonomous Database検証環境を無料で作って触ってみる

OCIの特徴を語る上で、Autonomous Databaseは外すことができません。
Oracle社の技術を集約したサービスと言っても過言ではなく、気になる方も多いのではないかと思いますが、コストを払ってまではちょっと。。といった方も多いのではないでしょうか。
実は、Autonomous Databaseおよびその周辺環境は**Always Tier**(無料トライアルアカウント)の範囲で構築、操作が可能です。
本記事は、無料範囲内でAutonomous Databaseを触るための環境構築および、Autonomosu Databaseの操作をご紹介します。


# 環境概要
### 本環境でできること
・Database Actionを利用したSQL DeveloperライクなAutonomous Database操作
・Cloud Shellを利用したsqlplus経由でのAutonomous Database操作
・Object Storageからのデータロード等

### アーキテクチャ図、構築リソース（全て無料枠）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/b7cbbdb7-5b7f-2eb9-e5a4-c70c399bcad0.png)

Autonmous Databaseを触るだけならObject StorageとIAMリソースは不要ですが、各種検証にあたってデータロード等必要かと思うので、「Object Storage」およびObject StorageへAutonmous Databaseがアクセスするために必要な「IAMリソース」も併せて作成しています。

| リソース種別 |概要   |
|:-|:-|:-|
|Autonomous Database| Data Warehouse。アクセス元指定無し。  | 
|Object Storage | プライベート設定   |
|IAMユーザ/グループ|Object Storageへのアクセス権をPolicyにて付与されたグループへ所属 |



# 環境構築
本記事では、OCI CLIは利用せず、コンソールからの構築前提で進めます。

**手順**
1.　Autonomosu Databaseを作成する
2.　Object Storageを作成する<br> 　　（本記事では手順は省略します。20GiB無料で利用できます）
3.　IAMリソースを作成する

###1. Autonomosu Databaseを作成する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/f056c817-5599-8fe9-e584-1944b179ae28.png)
OCIコンソールへログインして、Autonomous Databaseのコンソール画面へ移動。
「Autonomosu Databaseの作成」を選択。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/b50d2b61-2a19-fcfd-6099-76566ec1ef9d.png)
**コンパートメント** ：Autonomous Databaseを構築するコンパートメントを指定。
**表示名** ：コンソールでの表示名を入力。
**データベース名** ：データベース名はテナンシのリージョン内で一意となるように入力。

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/86fe529d-c714-5ff2-267c-24ca3879c84b.png)
**ワークロードタイプの選択** ：ワークロードタイプを指定。今回はAutonomosu Data Warehouseを指定。
**デプロイメントタイプの選択** ：「共有インフラストラクチャ」を指定。
＊Always Freeでは、相乗りでなくHWを専有利用する「専用インフラストラクチャ」利用不可。

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/6bcfb265-d990-2529-402f-b40e663f5ed5.png)
**データベースを構成します** ：Always Freeにチェックを入れる
＊本来はOracle DBのVer、OCPUやストレージサイズを入力
＊Always Freeでは、DB verの指定不可(19c)。OCPUとストレージサイズも固定。

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/a7951c2c-d5af-79a7-85ca-04f88ccdeef8.png)
**管理者資格証明の作成** ：DBインスタンスのAdminユーザのPWを入力。
＊DBインスタンスログインの際は、このPWを利用してログインする

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/1d175ebd-8396-1b2e-c293-839c9903fafc.png)
**ネットワーク・アクセスの選択** ：すべての場所からのセキュリティ・アクセスを選択
＊Always Freeでは、「プライベート・エンドポイント・アクセス」は利用不可
＊「許可されたIP及びVCN限定のセキュアアクセス」も選択可。各項目の概要は下記表のとおり。

**【参考】ネットワーク・アクセスの選択_各項目内容**

| アクセス手法 | エンドポイント | 概要 |
|:-|:-|:-|
| すべての場所からの<br>セキュア・アクセス  | Public EP|  アクセス元の制限なし。<br> (アクセスの際に後述するWallet+PW認証は必要)|
|許可されたIPおよび<br>VCN限定のセキュア・アクセス |  Public EP | アクセス元を指定する。NW ACLでの制御。<br>VCNの場合はアクセス可能なVCNに加えて、IPの指定も可能|
|プライベート・エンドポイント・アクセス|  Private EP | 指定VCNからのトラフィックのみが許可される<br>VCN内にプライベートIPを持つEPを構成する  |

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/40c80451-4222-8b65-c1a8-3fa73844f655.png)
**ライセンス・タイプの選択** ：ライセンス込み
＊Always Freeは無料リソースなので、BYOL不可
**運用上の通知およびお知らせ用の連絡先を指定してください** ：通知先のメールアドレスを記載

------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/d41b44a4-b183-0baa-0818-27e7e6cda320.png)
**[オプション]暗号化キー** ：Oracle管理キーを使用した暗号化
＊KMSでなくHSMで管理したい場合は、「顧客管理キーを使用した暗号化」を選択


上記設定に間違いがなければ、**「Autonomous Databaseの作成」**を選択。

###3. IAMリソースを作成
Autonomous DatabaseがObject Storageを操作するためには、後述するクレデンシャル(Credential)が必要となります。
クレデンシャル作成においてIAMユーザ情報が必要となるため、IAMリソース（ユーザ、ポリシー、グループ）を作成します。
＊この手順は既存のAdmin権限等、Onject Storageを利用可能なユーザでも代替できます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/4299bf47-b6b3-a72b-1dec-55174fc8f115.png)
OCIコンソールへログインして、アイデンティティのコンソール画面へ移動し、ユーザを選択
「ユーザの作成」を選択。
 -----
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/be0b0887-6e25-c682-bc99-1509728fa0d6.png)
IAMユーザを選択して、任意の名前、説明を入力して「作成」を選択
 ------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/a62c3891-7284-4beb-bd98-bfb44c136508.png)
アイデンティティのコンソール画面へ移動し、グループを選択。
任意の名前を入力して「作成」を選択
 ------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/b39a44fe-4ab9-a04f-5684-03dd2a1b931a.png)

アイデンティティのコンソール画面へ移動し、ポリシーを選択。
任意の名前を入力して、「ポリシー・ビルダー」にObject Storageへの管理権限を記載。
問題がなければ「作成」を選択。
＊テナンシ指定で、Object Storageへmanage権限を付与する場合はルートコンパートメントに作成する必要があります。

#Autonmous Databaseへ接続してみる
1. Database Actionを利用した接続
2. CloudShellを利用した接続

###Database Actionを利用した接続
Database ActionはAutonmous Databaseの開発/データ・ツール/管理/監視機能を提供するGUIツールとなります。
本記事では開発機能の1つであるSQL（SQL Developer相当の機能）を使ってのADW操作について記載します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/2c074bc3-812b-7315-b82e-5c212b093404.png)
Autonomous Databaseのコンソール画面より、「データベース・アクション」を選択
 ------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/e4b7504f-19c0-2ee8-e965-23bc5979d50f.png)
Database Action画面が開くので開発の「SQL」を選択
 ------
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/0cf749f6-fa01-442d-7b84-4c21324320a8.png)
SQL Developerのような画面がひらくので、「ワークシート」にSQLを記載して
記載したSQLを指定して▶を選択して、実行。
###CloudShellを利用した接続
Cloud ShellはOCIコンソールからアクセスできる、Webブラウザベースの端末です。
Webベースのインスタンス(VM)のようなイメージで、OCI CLIやsqlplus等、各種ツールが配備されている便利な端末です。
利用にあたって課金等発生しませんが、IAM Policy等でCloud Shellの利用が許可されている必要があります。
（本記事の操作はAdminアカウントで行っているので、ここはスキップ）

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/39a54f93-3a2c-8ae7-eafe-4e937234934f.png)
OCIコンソールのどの画面でもいいので、右上のCloudShell（「>_」のマーク）を選択。
OCIコンソール上にCloud Shellの起動を確認。

 ------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/529da603-f537-ee0a-fe75-3bdc8ed1e6e6.png)
Autonomosu Databaseのページに移動して、「サービス・コンソール」を選択

 ------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/c046cccc-23ab-8220-2e7f-0fa6ca9d2ec4.png)
左のメニューより「管理」を選択して、「クライアント資格証明（ウォレット）のダウンロード」を選択。

 ------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/dae23ac8-6d2b-c46a-bf0b-d0156a3c7a0d.png)
クライアント資格証明（ウォレット）のダウンロード画面で任意のPW（何でも大丈夫）を入力
「ダウンロード」を選択。クライアント端末のローカルにウォレットをダウンロード。
 
------

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/0df2cfea-e1fb-ecda-1d93-5d59b43b3321.png)
ダウンロードしたウォレットをドラックアンドドロップで、Cloud Shellへアップロード。

------

```
cloudshell:~ (ap-tokyo-1)$ export ORACLE_HOME=<ホームディレクトリ>
cloudshell:~ (ap-tokyo-1)$ mkdir -p network/admin
cloudshell:~ (ap-tokyo-1)$ mv <ウォレットファイル.zip> network/admin/
cloudshell:~ (ap-tokyo-1)$ unzip <ウォレットファイル.zip>
cloudshell:~ (ap-tokyo-1)$ ls -l
otal 64
-rw-r--r--. 1 user oci  6701 Jan  6 09:15 cwallet.sso
-rw-r--r--. 1 user oci  6656 Jan  6 09:15 ewallet.p12
-rw-r--r--. 1 user oci  3191 Jan  6 09:15 keystore.jks
-rw-r--r--. 1 user oci   691 Jan  6 09:15 ojdbc.properties
-rw-r--r--. 1 user oci  3187 Jan  6 09:15 README
-rw-r--r--. 1 user oci   114 Jan  6 09:15 sqlnet.ora
-rw-r--r--. 1 user oci  1131 Jan  6 09:15 tnsnames.ora
-rw-r--r--. 1 user oci  3378 Jan  6 09:15 truststore.jks
-rw-r--r--. 1 user oci 21630 Jan  6 09:18 <ウォレットファイル.zip>
```
ホームディレクトリ配下に「network/admin」ディレクトリを作成。
作成したディレクトリ配下へウォレットファイルを移動して解凍。
＊ホームディレクトリを$ORACLE_HOMEとする場合の手順になります。
＊Oracle DBを構築するときと同様に、tnsnames.ora等はデフォルトではsqlnet.oraの記載に従い
  「＄ORACLE＿HOME/network/admin」配下へ格納する必要があります。

------

```
cloudshell:admin (ap-tokyo-1)$ cat tnsnames.ora 
testadw202201_high = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=g300782c4bdbc86_testadw202201_high.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com, OU=Oracle ADB TOKYO, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))

testadw202201_low = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=g300782c4bdbc86_testadw202201_low.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com, OU=Oracle ADB TOKYO, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))

testadw202201_medium = (description= (retry_count=20)(retry_delay=3)(address=(protocol=tcps)(port=1522)(host=adb.ap-tokyo-1.oraclecloud.com))(connect_data=(service_name=g300782c4bdbc86_testadw202201_medium.adb.oraclecloud.com))(security=(ssl_server_cert_dn="CN=adb.ap-tokyo-1.oraclecloud.com, OU=Oracle ADB TOKYO, O=Oracle Corporation, L=Redwood City, ST=California, C=US")))
```
tnsnames.oraを参照して、sqlplusで接続するためのサービス名を確認。
＊ADWへの接続は「high」「medium」「low」の３種類が存在します。
　これはパラレル処理の違いとなります。（Highの方が並列度型が高い）

------

```
cloudshell:admin (ap-tokyo-1)$ sqlplus admin@testadw202201_low

SQL*Plus: Release 21.0.0.0.0 - Production on Thu Jan 6 09:41:40 2022
Version 21.4.0.0.0

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

Enter password: 

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

SQL> 
SQL> show parameter 

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
DBFIPS_140                           boolean     FALSE
active_instance_count                integer
adg_account_info_tracking            string      LOCAL
.......
```
sqlplusでサービス名を指定して接続。本記事では一番多重度の低い「low」を選択。
＊この時聞かれるPWはウォレットのPWでなく、Autonomosu Databaseを構築した際に指定した
　PWを利用してください。
＊Database Actionでは"show parameter"等は実行できませんが、Cloud Shellは
　sqlplusを利用しているので、実行可能です。

# Object StorageのデータをAutonomosu Databaseへロードしてみる
ここまでの内容で、Autonomous Databseの構築とアクセスが実現できたので
最後に、検証用データをObject StorageからAutonomous Databaseへロードする方法をご紹介します。

**手順**
1. 認証トークンの作成
2. クレデンシャルの作成
3. ロード先の空テーブルの作成
4. ロード元ファイルのURIを確認
5. Object Storageからテーブルへデータロード

###1. 認証トークンの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/eb60070b-9d99-f0b6-ef47-380b533178ed.png)
IAMユーザのコンソール画面でユーザを選択。
その後、左下のメニューから「認証トークン」を選択して、「トークンの生成」を選択。
＊生成後トークンのPWが表示されるの、必ずこれをメモしてください。


###2. クレデンシャルの作成
Autonomous Database内でObject Storageアクセス用のクレデンシャルを作成します。
クレデンシャル の作成はDBMS_CLOUDパッケージを利用します。

```
BEGIN 
  DBMS_CLOUD.CREATE_CREDENTIAL(
    credential_name => 'ObjectsStrageAccess', 
    username => 'ObjectsStrage',
    password => '7Ff0P;IHU)fQm#OWLG}A'
  );
END;
/ 
```
Autonomous Databaseへログインして、上記PL/SQLを実行する。
credential_name→任意のクレデンシャル名
username→トークンを生成したユーザ名
password→トークン生成時にメモしたPW

###3. ロード先の空テーブルの作成
データのロード先のテーブルを作成します。
検証なので、すごいシンプルなテーブルです。ここはお好みで。

```
CREATE TABLE ADWTEST01 (
 ID INT,
 NAME VARCHAR2(64),
 ERIA VARCHAR2(64)
);  
```
###4. ロード元ファイルのURIを確認
Object Storageに格納されたロード元ファイルのURIを確認します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1946634/fe535c72-2b12-b78e-a357-a5a9c88b7e8c.png)
対象のファイルの右側の「:」から「オブジェクト詳細の表示」を選択すると
URIを確認することが可能です。


###5. Object Storageからテーブルへデータロード
Object StorageにあるcsvファイルをAutonomous Databaseへロードします。
ここでもDBMS_CLOUDパッケージを利用します。

```
begin
    dbms_cloud.copy_data(
        table_name => 'ADWTEST01',
        credential_name => 'ObjectsStrageAccess',
        file_uri_list => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/nrjtv8rp1wyr/b/OCITEST_202201/o/SAUNA.csv',
        format => json_object('type' value 'csv')
    );
end;
/
```
table_name ：作成したテーブル名
credential_name ：作成「したクレデンシャル名
file_uri_list ：確認したObject Storage内ファイルのURI
format ：ロード時の各種フォーマット指定。本記事ではcsv1行目の指定のみ。読み込みスキップやデータ型の指定等可能。

**【参考】実行結果**

```
SQL> select * from ADWTEST01;

        ID NAME                           ERIA
---------- ------------------------------ ------------------------------
         1 Hokkaido SAUNA                 Hokkaido
         2 SHIKIGI                        Shizuoka
         3 Welbee SAKAE                   Aichi
         4 MATUMOTOYU                     Tokyo
         5 MARUSINSUPA                    Tokyo
         6 OASISGOTEMBA                   Shizuoka
         7 YUIRU                          Kanagawa
         8 SKC                            Saitama

8 rows selected.
```
Autonmous DatabaseにObject Storageに格納されたcsvファイルのデータが読み込まれていることが確認できました。

# おわりに
今回は無料枠内でAutonomous Databaseを構築して触ってみました。
OCIはAutonomous Databaseの他にもMySQL HeatWave等目玉機能がAlways Free対象となっているので
時間がありましたら触ってみていただけたらと思います。（自分ももう少し複雑な検証等試していきたいです。）