はじめに
Autonomous Databaseの機能アップデートで、Google Cloud Platform(GCP)のサービスアカウントを用いたGCPリソースへのアクセスがサポートされたので試してみました。
今回は、GCPのサービスアカウントを利用してAutonomous DatabaseからGoogle Cloud Storageにアクセスし、バケットの内のオブジェクトの表示と、バケット内のオブジェクト(ファイル)をもとにした外部表の作成を試してみました。
1. Autonomous DatabaseでGCPのサービスアカウントを有効化
adminユーザとして、Autonomous Databaseに接続します。
[opc@swingbench ~]$ sqlplus admin/Demo#1Demo#1@atp1_medium
SQL*Plus: Release 21.0.0.0.0 - Production on 木 10月 13 10:26:57 2022
Version 21.7.0.0.0
Copyright (c) 1982, 2022, Oracle. All rights reserved.
最終正常ログイン時間: 水 10月 12 2022 14:38:22 +09:00
Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
Version 19.17.0.1.0
に接続されました。
SQL>
Autonomous DatabaseでGCPのサービスアカウントを有効化するには、providerに'GCP'を指定して、DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTHプロシージャを実行します。
SQL> BEGIN
2 DBMS_CLOUD_ADMIN.ENABLE_PRINCIPAL_AUTH(
3 provider => 'GCP' );
4 END;
5 /
PL/SQLプロシージャが正常に完了しました。
SQL>
cloud_integrationsビューを検索してGCPのサービスアカウント名を確認し、メモしておきます。
SQL> SELECT * FROM cloud_integrations WHERE param_name = 'gcp_service_account';
PARAM_NAME
--------------------------------------------------------------------------------
PARAM_VALUE
--------------------------------------------------------------------------------
gcp_service_account
GCP-SA-16231-46794@gcp-pa-project1.iam.gserviceaccount.com
SQL>
2. Google Cloudのロールの作成
Autonomous Databaseのサービスアカウントに付与する、Google Cloud Storageへのアクセスを許可するロールを作成します。
Goole Cloudコンソールにサインインします。

左側のメニューの「IAMと管理」を選択し、「ロール」をクリックします。

ロールの画面に移動します。

「ロールの作成」をクリックします。

タイトルとIDに任意の文字列を入力し、「権限の追加」をクリックします。
ここでは、
タイトル:Object Store Read and Write for ADB
ID:ObjectStoreReadandWriteforADB
としました。

「フィルタ」の横をクリックすると、プロパティのリストが表示されるので、「権限」を選択します。

検索条件として「storage.objects」を入力してEnterキーを押します。
表示された権限の中から、
・storage.objects.create
・storage.objects.get
・storage.objects.list
・storage.objects.update
にチェックを入れ、「追加」をクリックします。

権限が正しく追加されているか確認し、「作成」をクリックします。

Google Cloud Storageへのアクセスを許可するロール(ここでは「Object Store Read and Write for ADB」)が作成されました。

3. Google Cloud Storageの準備
Google Cloudコンソールで「Cloud Storage」の「バケット」に移動します。

「作成」をクリックします。

任意のバケット名(ここでは「gcp-cloud-storage-bucket-for-adb」)を入力し、「続行」をクリックします。
こちらのマニュアルに記載があるように、バケット名に_(アンダースコア)が含まれていると、Autonomous Databaseから参照できませんのでご注意ください。

任意のロケーションタイプを選択し、「続行」をクリックします。

ストレージクラスはデフォルトの「Standard」のままで「続行」をクリックします。

オブジェクトへのアクセスを制御する方法もデフォルトのままで「続行」をクリックします。

オブジェクトを保護する方法を選択し、「作成」をクリックします。

バケット「gcp-cloud-storage-bucket-for-adb」が作成されました。

「権限」をクリックします。

「アクセス権を付与」をクリックします。

アクセス権付与のウインドウが表示されます。

「プリンシパルの追加」セクションの「新しいプリンシパル」に、1.でコピーしたAutonomous Databaseのサービスアカウントを入力し、Enterキーを押します。

「ロールを割り当てる」セクションの「ロールの選択」をクリックします。

クイックアクセスの「カスタム」を選択し、2.で作成したロール(ここでは「Object Store Read and Write for ADB」)をクリックします。

入力が完了したら、「作成」をクリックします。

Autonomous Databaseのサービスアカウントに対して、ロール「Object Store Read and Write for ADB」に基づくバケット「gcp-cloud-storage-bucket-for-adb」へのアクセス権が付与されました。

4. サービスアカウントを使用したAutonomous DatabaseからGoogle Cloud Storageへのアクセス
以下のようなファイル「testdata.txt」を作成します。
1,Paul
2,John
3,George
4,Ringo
testdata.txtを3.で作成したバケット「gcp-cloud-storage-bucket-for-adb」にアップロードします。

DBMS_CLOUD.LIST_OBJECTSファンクションで、Autonomous Databaseからバケット「gcp-cloud-storage-bucket-for-adb」内のオブジェクトのリストを取得してみます。
Google Cloud StorageにアクセスするためのクレデンシャルとしてGCPのサービスアカウントを使用する場合は、credential_nameに'GCP$PA'を指定します。
また、location_uriには、以下のような仮想ホスト形式でバケットを指定します。
https://バケット名.storage.googleapis.com/
SELECT * FROM
DBMS_CLOUD.LIST_OBJECTS(
credential_name => 'GCP$PA',
location_uri => 'https://バケット名.storage.googleapis.com/' );
では、実行してみます。
SQL> SELECT object_name, bytes FROM DBMS_CLOUD.LIST_OBJECTS(
2 credential_name => 'GCP$PA',
3 location_uri => 'https://gcp-cloud-storage-bucket-for-adb.storage.googleapis.com/'
4 );
OBJECT_NAME BYTES
------------------------------ ----------
testdata.txt 30
SQL>
サービスアカウントを使用して、Autonomous DatabaseからGoogle Cloud Storageにアクセスできました。
DBMS_CLOUD.CREATE_EXTERNAL_TABLEプロシージャでGoogle Cloud Storageのバケット「gcp-cloud-storage-bucket-for-adb」内にあるオブジェクト(ファイル)「testdata.txt」をもとにした外部表を作成し、testdata.txt内のデータをAutonomous Databaseから参照してみます。
Google Cloud StorageにアクセスするためのクレデンシャルとしてGCPのサービスアカウントを使用する場合は、credential_nameに'GCP$PA'を指定します。
また、file_uri_listには、以下のような仮想ホスト形式でバケット内のオブジェクト(ファイル)を指定します。
https://バケット名.storage.googleapis.com/オブジェクト名
では、実行してみます。
SQL> BEGIN
2 DBMS_CLOUD.CREATE_EXTERNAL_TABLE(
3 table_name =>'member',
4 credential_name =>'GCP$PA',
5 file_uri_list =>'https://gcp-cloud-storage-bucket-for-adb.storage.googleapis.com/testdata.txt',
6 format => json_object('delimiter' value ','),
7 column_list => 'ID NUMBER, name VARCHAR2(20)' );
8 END;
9 /
PL/SQLプロシージャが正常に完了しました。
SQL>
Google Cloud Storageのバケット「gcp-cloud-storage-bucket-for-adb」内にあるオブジェクト(ファイル)「testdata.txt」をもとにした外部表「member」が作成できました。
外部表「member」の内容を確認してみます。
SQL> SELECT * FROM member;
ID NAME
---------- --------------------
1 Paul
2 John
3 George
4 Ringo
SQL>
サービスアカウントを使用して作成した外部表「member」経由で、Google Cloud Storageのバケット「gcp-cloud-storage-bucket-for-adb」内にあるオブジェクト(ファイル)「testdata.txt」の内容を参照できることが確認できました。
5. Autonomous DatabaseでGCPのサービスアカウントを無効化
Autonomous DatabaseでGCPのサービスアカウントを無効にするには、providerに'GCP'を指定してDBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTHプロシージャを実行します。
BEGIN
DBMS_CLOUD_ADMIN.DISABLE_PRINCIPAL_AUTH(
provider => 'GCP' );
END;
/
参考資料
・Use Google Service Account to Access Google Cloud Platform Resources