1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

[OCI]日次バッチ等で必要なオブジェクト・ストレージ・バケットの作成をAutonomous Databaseにやらせてみた

Last updated at Posted at 2023-12-25

はじめに

Autonomous Databaseでは、Oracle Cloud Infrastructure SDK for PL/SQL(PL/SQL SDK)を使用して、Oracle Cloud Infrastructureのリソースを管理するためのPL/SQLコードを記述できます。

今回は、日次のバッチ処理でオブジェクト・ストレージ・バケットの作成が必要なケースを想定して、日付を名前に含むバケットをAutonomous Databaseに作成させ、そこにクエリの結果を出力するPL/SQLプロシージャを作成してみました。

なお、今回の検証ではバケットの作成およびアクセスにリソース・プリンシパルを使用しますので、Autonomous Databaseインスタンスを含む動的グループを作成し、オブジェクト・ストレージ・バケットへのアクセスを許可するポリシーを正しく設定した上で、 Autonomous Databaseのリソース・プリンシパルを有効にしておきます。

1. PL/SQLプロシージャの作成

今回は、実行するとDATA_YYYYMMDD(YYYYMMDD部分はプロシージャの実行日から生成)という名前のバケットを作成し、そこにv$parameerの検索結果をCSV形式で出力する、create_daily_bucketという名前のPL/SQLプロシージャを作成します。

プロシージャcreate_daily_bucketのDDLは以下のようになります。
なお、このプロシージャでは、Autonomous Databaseのリージョン、コンパートメントをv$pdbsビューから取得して、バケットをAutonomous Databaseと同じリージョン、同じコンパートメントに作成しています。

create_daily_bucket
CREATE OR REPLACE PROCEDURE create_daily_bucket
IS
    -- 変数の宣言
    resp_get_namespace   dbms_cloud_oci_obs_object_storage_get_namespace_response_t;
    resp_create_bucket   dbms_cloud_oci_obs_object_storage_create_bucket_response_t;
    create_bucket_detail dbms_cloud_oci_object_storage_create_bucket_details_t := dbms_cloud_oci_object_storage_create_bucket_details_t();
    adb_region           VARCHAR2(20);
    adb_compartment_ocid VARCHAR2(100);
    namespace            VARCHAR2(100);
    bucket_name          VARCHAR2(100);

BEGIN
    -- ADBが存在するリージョンとコンパートメントのOCIDを取得
    SELECT json_value(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.COMPARTMENT_OCID'))
	    INTO adb_region, adb_compartment_ocid FROM v$pdbs;

    -- オブジェクト・ストレージ・ネームスペースを取得
    resp_get_namespace := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE(
                              region          => adb_region,
                              credential_name => 'OCI$RESOURCE_PRINCIPAL'
	                      );
    namespace := REPLACE(resp_get_namespace.response_body, '"', '');

    -- 日付からバケット名(DATA_YYYYMMDD)を生成
    SELECT 'DATA_'||TO_CHAR(sysdate, 'YYYYMMDD') INTO bucket_name FROM DUAL;

    -- バケット作成時のパラメータをセット
    create_bucket_detail.name           := bucket_name;
    create_bucket_detail.compartment_id := adb_compartment_ocid;

    -- バケットを作成
    resp_create_bucket := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.CREATE_BUCKET(
                              region                => adb_region,
                              credential_name       => 'OCI$RESOURCE_PRINCIPAL',
                              namespace_name        => namespace,
                              create_bucket_details => create_bucket_detail
                          );

    DBMS_CLOUD.EXPORT_DATA(
        credential_name => 'OCI$RESOURCE_PRINCIPAL',
        file_uri_list   => 'https://objectstorage.'||adb_region||'.oraclecloud.com/n/'||namespace||'/b/'||bucket_name||'/o/'||'parameter.csv',
        format          => '{"type" : "csv"}',
        query           => 'SELECT * FROM v$parameter'
 );

END;
/

DDLを実行して、プロシージャcreate_daily_bucketを作成します。

SQL> CREATE OR REPLACE PROCEDURE create_daily_bucket
     IS
         resp_get_namespace   dbms_cloud_oci_obs_object_storage_get_namespace_response_t;
         resp_create_bucket   dbms_cloud_oci_obs_object_storage_create_bucket_response_t;
         create_bucket_detail dbms_cloud_oci_object_storage_create_bucket_details_t := dbms_cloud_oci_object_storage_create_bucket_details_t();
         adb_region           VARCHAR2(20);
         adb_compartment_ocid VARCHAR2(100);
         namespace            VARCHAR2(100);
         bucket_name          VARCHAR2(100);
     
     BEGIN
         -- ADBが存在するリージョンとコンパートメントのOCIDを取得
         SELECT json_value(cloud_identity, '$.REGION'), LOWER(json_value(cloud_identity, '$.COMPARTMENT_OCID'))
         INTO adb_region, adb_compartment_ocid FROM v$pdbs;
     
         -- オブジェクト・ストレージ・ネームスペースを取得
         resp_get_namespace := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE(
                                   region          => adb_region,
                                   credential_name => 'OCI$RESOURCE_PRINCIPAL'
                           );
         namespace := REPLACE(resp_get_namespace.response_body, '"', '');
     
         -- 日付からバケット名(DATA_YYYYMMDD)を生成
         SELECT 'DATA_'||TO_CHAR(sysdate, 'YYYYMMDD') INTO bucket_name FROM DUAL;
     
         -- バケット作成時のパラメータをセット
         create_bucket_detail.name           := bucket_name;
         create_bucket_detail.compartment_id := adb_compartment_ocid;
     
         -- バケットを作成
         resp_create_bucket := DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.CREATE_BUCKET(
                                   region                => adb_region,
                                   credential_name       => 'OCI$RESOURCE_PRINCIPAL',
                                   namespace_name        => namespace,
                                   create_bucket_details => create_bucket_detail
                               );
     
         DBMS_CLOUD.EXPORT_DATA(
             credential_name => 'OCI$RESOURCE_PRINCIPAL',
             file_uri_list   => 'https://objectstorage.'||adb_region||'.oraclecloud.com/n/'||namespace||'/b/'||bucket_name||'/o/'||'parameter.csv',
             format          => '{"type" : "csv"}',
             query           => 'SELECT * FROM v$parameter'
      );
     
     END;
     /

Procedure CREATE_DAILY_BUCKET compiled

SQL> 

プロシージャcreate_daily_bucketが作成できました。

2. プロシージャの実行

execコマンドでcreate_daily_bucketを実行してみます。

SQL> exec create_daily_bucket

PL/SQL procedure successfully completed.

SQL>

問題なく実行できました。

DBMS_CLOUD.LIST_OBJECTSファンクションを使用して、バケットの作成、データのエクスポートが正しく行われているかを確認してみます。

SQL> SELECT object_name, bytes, created
     FROM DBMS_CLOUD.LIST_OBJECTS(
              credential_name       => 'OCI$RESOURCE_PRINCIPAL',
              location_uri          => 'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/************/b/DATA_20231225/o'
          );

OBJECT_NAME                                  BYTES CREATED                                
_________________________________________ ________ ______________________________________ 
parameter_1_20231225T025034126155Z.csv       33687 25-DEC-23 02.50.34.534000000 AM GMT    

SQL> 

名前にプロシージャの実行日を含むバケットが作成され、その中に指定したプレフィックスを持つCSVが作成されていることが確認できました。

OCIコンソールからも確認してみます。
スクリーンショット 2023-12-25 12.29.33.png
名前にプロシージャの実行日を含むバケットが作成されたことが確認できました。

バケットの内容を確認してみます。
スクリーンショット 2023-12-25 12.29.53.png
指定したプレフィックスを持つCSVが作成されていることが確認できました。

参考情報

DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.CREATE_BUCKET Function
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE Function
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_NAMESPACE_RESPONSE_T Type
DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_CREATE_BUCKET_RESPONSE_T Type
DBMS_CLOUD_OCI_OBJECT_STORAGE_CREATE_BUCKET_DETAILS_T Type
DBMS_CLOUD.EXPORT_DATA Procedure
DBMS_CLOUD.LIST_OBJECTS Function

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?