はじめに
Autonomous DBは、OSレイヤにアクセスできないPaaSのサービスであるため、外部ファイルと連携するためにObject Storageが使われることがよくあります。
Object Storageへのアクセスには認証・認可が必要です。以前まで、認証方法として「認証トークン」または「APIキー」のみがサポートされており、Computeインスタンスのようにインスタンス・プリンシパルを使用した認証ができませんでした。
参考Blog: Autonomous Database Now Supports Accessing the Object Storage with OCI Native Authentication
2021年4月ごろから、Autonomous DBやDBCSでもリソース・プリンシパルという機能により、インスタンス・プリンシパルと同様に動的グループによる認証が可能になりました。
(何で区別するのでしょうね。インスタンス・プリンシパルはComputeのみで、それ以外がリソース・プリンシパル?)
この記事では、リソース・プリンシパルを使用して、Autonomous DBの認証を試してみます。なお、リソース・プリンシパルによる動的グループの設定は、DBCSでも可能です。
Autonomous DBのリソース・プリンシパルに関するマニュアルは、こちらです
前提
・Autonomous DBは、Free Tierのものを使用します
手順
Autonomous DBの作成
- [メニュー]⇒[Oracle Database]⇒[Autonomous Database]に遷移します
- 「Autonomous Databaseの作成」ボタンを押下します。
- Always Freeのインスタンスを作成します (詳細説明は割愛)
作成完了後、動的グループの指定に使用するため、Autonomous DBのOCIDをコピーしてメモします
動的グループによる認証設定
動的グループを作成して、作成したAutnomous DBを識別できるようにします。
- [メニュー]⇒[アイデンティティとセキュリティ]⇒[動的グループ]に遷移します
- 「動的グループの作成」ボタンを押下します
- 一致ルールとして、「resource.id = '<上述手順でコピーした、Autonomous DBのOCID>'」を入力します。これ以外の指定方法はマニュアルを参照ください
ポリシー
ポリシーを設定して、認可の設定をします。
- [メニュー]⇒[アイデンティティとセキュリティ]⇒[ポリシー]に遷移します
- 「ポリシーの作成」ボタンを押下します
- バケットを作成したコンパートメント内のバケット・オブジェクトに対して読み取り権限を与えてあげます
Allow dynamic-group <作成した動的グループ名> to read buckets in compartment <バケットを作成したコンパートメント名>
Allow dynamic-group <作成した動的グループ名> to read objects in compartment <バケットを作成したコンパートメント名>
DB接続用Walletのダウンロード
Autonomous DB作成後、「DB接続」ボタンを押下して、インスタンス・ウォレットをダウンロードします
バケットの作成
Object Storageにバケットを作成します
- [メニュー]⇒[ストレージ]⇒[バケット]のリンクを押下します
- 「バケットの作成」ボタンを押下します
- 設定値はすべてデフォルトにして、バケットを作成します
- 以下のCSVファイルを作成して、"names.csv"というオブジェクト名で作成したバケットにアップロードします
id,last_name,first_name
1,Yamada,Taro
2,Suzuki,Jiro
3,Sato,Saburo
アップロードしたオブジェクト(nams.csv)の右端メニューを押下し、オブジェクト詳細の表示を選択します
オブジェクトのURLパスをメモします。後述の手順で、外部表作成時に指定します
Resource Principalの有効化
ADBにアクセス
ADBにsqlplusを使用してアクセスします。接続方法の詳細は記載しませんが、以下のように、Linuxホストからsqlplusでアクセスしました
$ sqlplus admin@adb01_low
SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jun 23 19:59:24 2021
Version 19.10.0.0.0
Copyright (c) 1982, 2020, Oracle. All rights reserved.
Enter password:
Connected to:
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.5.0.0.0
SQL>
Resource Principalの有効化
Objectにアクセスするユーザが、ADMINユーザの場合は以下のSQLを実行します。
※検証では、ADMINユーザを使用しました。
SQL> EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL();
PL/SQL procedure successfully completed.
SQL> SELECT owner, credential_name FROM dba_credentials
WHERE credential_name = 'OCI$RESOURCE_PRINCIPAL' AND owner = 'ADMIN';
OWNER CREDENTIAL_NAME
----- ----------------------
ADMIN OCI$RESOURCE_PRINCIPAL
⇒ OCI$RESOURCE_PRINCIPAL という名前で、資格証明が作成されていることを確認します。
[参考] ADMINユーザ以外のユーザからアクセスする場合は、以下のSQLを実行します。
SQL> EXEC DBMS_CLOUD_ADMIN.ENABLE_RESOURCE_PRINCIPAL(username => '<ADB_USER名>');
外部表の作成
Object(csvファイル)を参照する外部表を作成して、Objectにアクセスできることを確認します
SQL> BEGIN
DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
table_name => 'SAMPLE_EXTERNAL_TABLE',
credential_name => 'OCI$RESOURCE_PRINCIPAL',
file_uri_list => '<上述の手順で確認した、オブジェクトのURLパス>',
format => '{"type": "CSV", "skipheaders": "1"}' ,
column_list => 'ID NUMBER, LAST_NAME VARCHAR2(50), FIRST_NAME VARCHAR2(50)'
);
END;
/
PL/SQL procedure successfully completed.
* 今回は、CSVファイルにヘッダーがついているので、skipheadersを指定して1行目を読み飛ばしています
参照してみます。
SQL> select * from SAMPLE_EXTERNAL_TABLE;
ID LAST_NAME FIRST_NAME
---------- ---------- ----------
1 Yamada Taro
2 Suzuki Jiro
3 Sato Saburo
参照できました!
なお、DBCSもリソース・プリンシパルをサポートしているそうで、oci cliの実行時の認証に利用できるようになっているそうです。