⚱️

Oracle APEXでOCI ObjectStorageに日本語ファイル名のファイルを置く(前編)

5 min read

ローコードWeb開発ツールのOracle APEXを使って社内向けシステムを作っていますが、ファイルのアップロードとダウンロードの機能が必要になりました。オブジェクトストレージへのアップロードとダウンロードを行う手順があったので、その手順に従い設定するとアップロードはできるようになりました。
ただし、日本語名のファイルは文字化けしてしまいました。残念。

https://blogs.oracle.com/oraclemagazine/better-file-storage-in-oracle-cloud

他の方法を探してみたところ、DBMS_CLOUDパッケージを使うともう少し簡単にできそうだったので試してみました。

https://docs.oracle.com/cd/E83857_01/paas/atp-cloud/atpug/dbms-cloud.html

Always FreeのAutonomous Databaseインスタンス作成

  • なにはともあれOracle APEXが必要です。
  • Oracle Cloud Infrastructure(以降OCI)にログインして、Always FreeのAutonomous Databaseインスタンスを作成します。2021/5時点ではAPEXインスタンスが選べるようになっていましたので、そちらを選択しました。Autonomous Transaction ProcessingでもAPEXは使えます。
  • ADMINのパスワードはひとまず「T5w!Z9uu+eJ$UENs」としました。
  • インスタンスがデプロイされるまで少し待ちます。

APEXワークスペースの準備

  • APEXインスタンスがデプロイされたら、APEXの管理ページに移動して先程決めたADMINパスワードを入力してログインします。
  • 「Create WorkSpace」というボタンがありますので、押して作成します。
Key Value
Oracle APEXワークスペース管理者ID APEXOBJJPN
パスワード fe4nxa-89lk05AGA
Oracle APEXワークスペース名 APEXOBJJPN
  • ワークスペースが作成されたら、APEXOBJJPNでワークスペースにログインできるのを確認し、一旦Oracle APEXからログアウトしておきます。

Autonomous Databaseの権限付与

オブジェクトストレージへのアクセスはDBMS_CLOUDパッケージの関数を使うと出来ますが、DBMS_CLOUDパッケージを利用するにはDBMS_CLOUDの実行権限を付与しなければなりません。 Oracle Help Center

  • Autonomous Databaseインスタンスのページに行き、「ツール」-> 「データベース・アクション」を開きます。
  • ユーザ名ADMIN、パスワードはAutonomous Database管理者用パスワード(今回はT5w!Z9uu+eJ$UENs)でログインします。
  • 「SQL」を選び、下記SQLを実行します。
 GRANT EXECUTE ON DBMS_CLOUD TO APEXOBJJPN;
  • これでユーザ「APEXOBJJPN」がDBMS_CLOUDパッケージを利用できるようになりました。

コンパートメントとオブジェクトストレージの準備

APEXインスタンスの他に、保存先となるオブジェクトストレージが必要です。
また、Oracle Cloudにはコンパートメントという単位があり、オブジェクトストレージなどの各種リソースをコンパートメントに所属させることが出来ます。私はリソースのグループ名と理解しています。

  • OCIのコンソールに戻り、画面左上のハンバーガー(≡)メニューから、「アイデンティティとセキュリティ」→「コンパートメント」に進みます。
  • 「コンパートメントの作成」を押し、コンパートメントを作ります。
Key Value
名前 OBJTEST
説明 OracleAPEXからのオブジェクトストレージアクセス用
  • コンパートメントが出来たら、次はオブジェクトストレージをOBJTESTコンパートメント内に作ります。
  • ハンバーガーメニュー -> ストレージ -> オブジェクトストレージを開きます。
  • 画面左側に「コンパートメント」というコンボボックスがあるので、そこから「OBJTEST」を選びます。
  • Oracle APEXからアップロードしたファイルの保管用バケットを一つ作ります。可視性はプライベートのままにしておきます。
Key Value
バケット名 BucketForAPEX

アップロード用ユーザの作成とポリシーの作成

オブジェクトストレージもバケットを作っただけではアクセスが出来ません。
まずはBucketForAPEXバケットの読み書きができるOracle CloudのIAMユーザを作成します。その後、アクセス権限の付与とOracle APEX側で使う認証トークンの生成を行います。

  • ハンバーガーメニュー -> アイデンティティとセキュリティ -> ユーザー を選びます。
  • 「ユーザの作成」を押し、ユーザを作ります。
Key Value
ユーザタイプ IAMユーザー(OCIでのみ利用できるユーザ)
名前 OBJADMIN
説明 Oracle APEXからオブジェクトストレージへのアクセス用ユーザ
  • ユーザが作成出来たら、OBJADMINユーザのページに行き、画面左下にある「認証トークン」を選びます。
  • 「トークンの作成」ボタンを押します。するとトークンが作成されますので「コピー」を押してクリップボードにコピーし、どこか他の場所に貼り付けて保管しておきます。
Key Value
OBJADMINのAPEX用認証トークン O<3WIPd>0<OSrA7>)orA
  • 続いてグループの作成に移ります。ハンバーガーメニューからアイデンティティに移動し、「グループ作成」を押します。
Key Value
グループ名 OBJTESTGROUP
説明 オブジェクトストレージ管理用グループ
  • グループにOBJADMINユーザを追加します。
  • アイデンティティに戻り、今度は「ポリシー」を選びます。
  • 画面左下の「コンパートメント」から、「OBJTEST」を選んでおきます。
  • 「ポリシーの作成」を押します。
Key Value
名前 OBJTEST_ObjectStorageAdmin
説明 オブジェクトストレージ管理用ポリシー
コンパートメント OBJTEST
ポリシーユースケース ストレージ管理
共通ポリシー・テンプレート オブジェクト・ストレージ管理者がバケット及びオブジェクト管理を~
グループ OBJTESTGROUP
場所 OBJTEST

ここまで入力すると、ポリシー・ステートメントに

Allow OBJTESTGROUP to manage buckets in compartment OBJTEST
Allow OBJTESTGROUP to manage objects in compartment OBJTEST

と作られますので、「作成」を押します。OBJTESTGROUPに所属しているユーザであれば、OBJTESTコンパートメント内のバケットを好きなようにできる、という権限になります。
最小権限の原則からみるとManage権限は広すぎますが、今回はそのまま続行します。

認証情報の登録

  • Oracle APEXのワークスペース開発画面に移動し、APEXOBJJPNワークスペースにログインします。
  • 上の方にあるSQLワークショップ -> SQLコマンドと進みます。
  • DBMS_CLOUDパッケージの関数には、引数としてcredential_nameがあります。毎回パスワードを入れるのでは無くデータベースに予め認証情報を保存しておき、それを名前を指定して呼び出す形になっているようです。
  • というわけでObject Storage用の認証情報を作成します。
begin
  DBMS_CLOUD.create_credential (
    credential_name => 'CRED_OBJECTSTORAGE',
    username => 'OBJADMIN',
    password => 'O<3WIPd>0<OSrA7>)orA'
  ) ;
end;
/
  • 保存した認証情報を使って、Object Storageへアクセスできるか確認してみます。DBMS_CLOUDのLIST_OBJECTSを使います。
select * from DBMS_CLOUD.LIST_OBJECTS(
        credential_name => 'CRED_OBJECTSTORAGE',
        location_uri =>'https://objectstorage.ap-tokyo-1.oraclecloud.com/n/YourNamespace/b/BucketForAPEX/o/'
    );
-- NOTE: URIはご自身の環境に置き換えてください
  • ポリシーなどがきちんと設定されていれば、バケットにあるファイルの一覧が表示されます。

と、この後のOracle APEX側のアプリ作成部分も書いたのですが、操作ミスにより消えてしまいました(涙)

というわけでアップロードの部分は後編で!