2021年4月5日月曜日

APEXからオブジェクト・ストレージをPL/SQL SDKで操作する(1) - 準備

 以前に書いた記事はAPEXからAPEX_WEB_SERVICEパッケージを使ってオブジェクト・ストレージを操作しました。同じアプリをPL/SQL SDKを使って実装してみようと思います。

以前の記事は英語の記事を元にしていました。その記事の著者Adrian PngがManipulating the Oracle Cloud with PL/SQLとして、PL/SQL SDKを使用するための準備を解説しています。彼が以前に行ったRESTサービスを呼び出す実装は色々と大変だったけど、PL/SQL SDKを使うことにより、低レベルのデータ変換を行うコーディングが不要になり、情報の取り出しも系統だって行えるようになったと言っています。

使用するオブジェクト・ストレージのPL/SQL SDKのドキュメントはこちらです。

元の記事から1年以上経っているので、以前の記事での記載にかかわらず、実施する作業はできるだけ作業ログとして残そうと思います。とはいえ、Autonomous Databaseの作成とOracle APEXのワークスペースの作成は、今回は準備済みとして省略します。

最初にクリデンシャルの登録から行います。

APIユーザーの作成は、以下の記事通りに実施します。

APEXからOCIオブジェクト・ストレージを操作する(1) - APIユーザーの作成

今回はAPEXアプリケーションからバケットも操作するため、ポリシーをreadからmanageにに変更します。

Allow group APEXObjectManagers to manage buckets in compartment APEX


クリデンシャルの作成



作成済みのAutonomous Databaseのデータベース・アクションに、管理者ユーザーADMINで接続します。

SQLの実行画面を開き、Oracle APEXのワークスペース・スキーマにDBMS_CLOUDパッケージの実行権限を与えます。 

grant execute on dbms_cloud to <APEXワークスペース・スキーマ>;

Oracle APEX 22.1以降でAutonomous Database上にワークスペースを作成している場合は、ワークスペース・スキーマ名はワークスペース名にWKSP_が接頭辞として追加されます。

ワークスペース名がAPEXDEVであれば、以下のようになります。 

grant execute on dbms_cloud to wksp_apexdev;



APEXのワークスペースからDBMS_CLOUDパッケージの実行が可能になりました。続いて、APEXのワークスペースにサインインし、SQLワークショップSQLコマンドを開いて、DBMS_CLOUD.CREATE_CREDENTIALプロシージャを実行します。
begin
    dbms_cloud.create_credential(
        credential_name => 'MY_OCI_CRED'
        , user_ocid => 'ocid1.user.oc1..aaaaaaaa*********************************************'
        , tenancy_ocid => 'ocid1.tenancy.oc1..aaaaaaaa**************************************************'
        , private_key => 'MIIE********************************************************************='
        , fingerprint => '**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**'
    );
end;
/
credential_nameは作成されるクリデンシャルの名前で、任意の名前を設定することが可能です。今回はMY_OCI_CREDとします。user_ocidはAPIキーを登録したとき表示されたuser=の値を指定します。tenancy_ocidtenancy=の値です。fingerprintfingerprint=の値です。private_keyはダウンロードした秘密キーのファイルに含まれている-----BEGIN PRIVATE KEY-----から-----END PRIVATE KEY-----の間に含まれているデータを1行にして指定します。BEGINとENDを示す行は含みません。

今回はtrコマンドが使えたので、以下の引数を与えてLFとCRを除去し、コピペしました。

tr -d '\n\r' < apex_oci_api_key.pem

% tr -d '\n\r' < apex_oci_api_key.pem  

-----BEGIN PRIVATE KEY-----MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQCu4Lv9Uv0zfkwX6zLJoWc3NTE*****************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************************+ZW7JL3zKKyJBx+GAABlK4E6cMNuoG7sQY6EXtvh6jqRM1aBbzJSmLNDn3R9nvIFy3+OmQdBJrTCVoaFrtGresIOuQchho=-----END PRIVATE KEY-----

%



登録されたクリデンシャルを、ビューUSER_CREDENTIALSを検索して確認します。

select * from user_credentials

検索結果に作成したクリデンシャルが含まれていれば、クリデンシャルの登録はできています。



オブジェクト・ストレージのネームスペースの取得



今までの作業が正しく行われたか確認するため、PL/SQL SDKを使用してオブジェクト・ストレージのネームスペースを取得します。

SQL Developer Webに管理者ユーザーADMINで接続し、必要な権限をAPEXのワークスペース・スキーマに与えます。SQLの画面を開きます。 

grant execute on dbms_cloud_oci_obs_object_storage to WKSP_<APEXワークスペース・スキーマ名>; 
grant execute on dbms_cloud_oci_obs_object_storage_get_namespace_response_t to WKSP_<APEXワークスペース・スキーマ名>;

APEXのワークスペース名がAPEXDEVの場合での実行画面は以下になります。



PL/SQL SDKを呼び出す権限が与えられたので、APEXに移ります。

オブジェクト・ストレージのネームスペースを取得するスクリプトは以下になります。
declare
  response dbms_cloud_oci_obs_object_storage_get_namespace_response_t;
begin
   response := dbms_cloud_oci_obs_object_storage.get_namespace(
       compartment_id => null
       , region => 'リージョン名'
       , credential_name => '作成したクリデンシャル名'
   );
   dbms_output.put_line('Status Code: ' || response.status_code);
   dbms_output.put_line(response.response_body);
end;
リージョン名がus-ashburn-1(北米リージョン)、作成したクリデンシャル名がMY_OCI_CREDの場合の実行例は以下になります。


ネームスペースはオブジェクト・ストレージを操作する際に指定するので、結果はメモしておきましょう。


APEXアプリケーションの作成


アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。名前オブジェクト・ストレージ操作とします。

アプリケーションの作成を実行します。


アプリケーションが作成された後、アプリケーション定義に置換文字列として以下の4つを作成します。

前回の記事通りに作業を行っている場合、対象とするコンパートメントAPEXなので、そのOCID、クリデンシャル名はMY_OCI_CRED、ネームスペース名はDBMS_CLOUD_OCI_OBS_OBJECT_STORAGE.GET_NAMESPACE()を実行して取得したネームスペース名を指定します。リージョン名は北米アッシュバーン・リージョンであれば、us-ashburn-1です。
  • G_COMPARTMENT_ID - コンパートメントのOCID
  • G_CREDENTIAL_NAME - クリデンシャル名
  • G_NAMESPACE_NAME - ネームスペース名
  • G_REGION - リージョン名

これからページの作成を始めますが、その前にPL/SQL SDKをAPEXのワークスペースから呼び出せるように権限を割り与えます。

SQL Developer Webに管理者ユーザーADMINで接続し、以下のスクリプトを実行します。apexdevの部分は、使用中のAPEXのワークスペース名に置き換えてください。
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_LIST_BUCKETS_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_CREATE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_UPDATE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_DELETE_BUCKET_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_LIST_OBJECTS_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_PUT_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_RENAME_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_DELETE_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBS_OBJECT_STORAGE_GET_OBJECT_RESPONSE_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_BUCKET_SUMMARY_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_CREATE_BUCKET_DETAILS_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_UPDATE_BUCKET_DETAILS_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_OBJECT_SUMMARY_T to wksp_apexdev;
grant execute on DBMS_CLOUD_OCI_OBJECT_STORAGE_RENAME_OBJECT_DETAILS_T to wksp_apexdev;


権限の割り当てを行ったら、Oracle APEXに戻ります。

次の記事からオブジェクト・ストレージを操作する機能を実装していきます。

続く