2023年12月7日木曜日

APEX 23.2で静的アプリケーション・ファイルをOCIオブジェクト・ストレージに保存する

Oracle APEX 23.2より静的アプリケーション・ファイルとして保存するファイルを、Oracle Cloudのオブジェクト・ストレージに保存できるようになりました。ファイル自体はAPEXがインストールされているデータベースとオブジェクト・ストレージの双方に保存され、同期をとるような実装になっています。

最近のAPEX Office Hoursで、この機能を開発したJaon Straubさんが解説をしています。28分から40分の間です。本記事は彼の機能紹介に依っています。

アプリケーション定義アプリケーション・ファイル・ストレージの項目が追加されています。ファイル・ストレージ・タイプのデフォルトはローカル・データベースです。この設定をOracle Cloud Object Storageに変更し、リモート・ファイル・サーバーとしてOracle Cloudのオブジェクト・ストレージのバケットURLが宛先となっているファイル・サーバーを指定します。


リモート・ファイル・サーバーを作成するには、オブジェクト・ストレージの追加をクリックします。


リモート・ファイル・ストレージ名前は任意です。ここで作成するリモート・ファイル・ストレージは、ワークスペース・ユーティティリモート・サーバーとして管理されるため、ワークスペースで一意にします。

バケットURLは、OCIのオブジェクト・ストレージのバケットを指すURLです。バケットに保存するファイルは、APEXのアプリケーションにアクセスしているブラウザから直接アクセスできなければならないため、通常は可視性パブリックにします。バケットの作成オンにしていると、新規にバケットが作成されます。可視性パブリックになります。

バケットURLは以下の形式になります。今回はバケット名をapex-static-filesとしています。

https://<ネームスペース>.objectstorage.<リージョン>.oci.customer-oci.com/n/<ネームスペース>/b/<バケット名>

認証タイプOracle Cloud Infrastructure (OCI)Web資格証明を、OCI資格証明として選択します。

OCIオブジェクト・ストレージにアクセスするWeb資格証明の作成方法については、以下の記事を参照してください。

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

コンパートメントOCIDを設定し、へ進みます。


オブジェクト・ストレージへのファイルの移行オンにすると、すでに存在している静的アプリケーション・ファイルが、設定または新規作成されたバケットへコピーされます。

終了をクリックすると、バケットの作成やファイルのコピーといった一連の処理が行われます。


オブジェクト・ストレージにアクセスすると、作成されたバケットを確認できます。


オブジェクト・ストレージへのファイルの移行オンであれば、バケット内のオブジェクトとして、静的アプリケーション・ファイルが保存されていることも確認できます。


作成されたリモート・ファイル・サーバーを確認します。

ワークスペース・ユーティリティリモート・ファイル・サーバーを開きます。


サーバー・タイプファイル・サーバーになります。ベースURL(エンドポイントURL)の末尾に/o/が追加されています。


このようにして作成したリモート・ファイル・サーバーを、アプリケーション・ファイル・ストレージに設定します。


アプリケーション・ファイル・ストレージとしてOracle Cloud Object Storageが設定されている状態で、共有コンポーネント静的アプリケーション・ファイルを開くと、ページの右にこのアプリケーションはOracle Cloud Object Storageを使用します、と表示されます。


静的アプリケーション・ファイルから作成したファイルは、オブジェクト・ストレージのバケットにアップロードされます。

ファイルの作成をクリックし、ファイルraccoon-dog.jpgをアップロードしてみました。


オブジェクト・ストレージ・ファイルの表示をクリックすると、オブジェクト・ストレージに保存されているファイルを確認できます。


ファイルraccoon-dog.jpgがオブジェクト・ストレージに存在することが確認できます。


Oracle Cloudのコンソールからも、バケットapex-static-filesにファイルraccoon-dog.jpgがアップロードされていることが確認できます。


Oracle APEXの静的アプリケーション・ファイルよりraccoon-dog.jpgを削除すると、オブジェクト・ストレージからもファイルは削除されます。反対に、Oracle Cloudのコンソールなどからファイルを削除すると、静的アプリケーション・ファイルからはファイルは削除されません。


 オブジェクト・ストレージ・ファイルから、ファイルが削除されていることが確認できます。


静的アプリケーション・ファイルにファイルが残っています。この状態を解消するために、タスクファイルの同期化を呼び出します(またはオブジェクト・ストレージ・ファイルファイルの同期化)。


ファイルの同期化では方向として、オブジェクト・ストレージからローカル・データベースへローカル・データベースからオブジェクト・ストレージへのどちらかを選ぶことができます。

今回は静的アプリケーション・ファイルに残っているraccoon-dog.jpgを再度オブジェクト・ストレージに戻すため、ローカル・データベースからオブジェクト・ストレージへを選びます。

ファイルの同期化を実行します。


オブジェクト・ストレージ・ファイルを開くと、オブジェクト・ストレージにファイルraccoon-dog.jpgが作成されていることが確認できます。それ以外のファイルの変更時刻も更新されていることより、すべてのファイルが置き換わっています。

Oracle Cloudのコンソールからも、同様の状況が確認できます。


アプリケーション・ファイル・ストレージOracle Cloud Object Storageを指している場合、APEXアプリケーションで静的アプリケーション・ファイルを参照しているURLが、オブジェクト・ストレージを指すように変わります。

ログインのダイアログに表示されている画像は、静的アプリケーション・ファイルです。画像URLを確認してみます。ブラウザから検証を呼び出します。


画像のURLがオブジェクト・ストレージ上のファイルを指していることが確認できます。


静的アプリケーション・ファイル(に限らず、静的ワークスペース・ファイルやデータベースのBLOB列に保存されたファイルなども)はデータベースに保存されおり、ブラウザに表示するためにデータを取り出す際に(ORDSからの)アクティブなコネクションを消費します。CPU処理時間はそれほど消費しなくても、ファイルの大きさやネットワークの速度に依存して、ダウンロードが完了するまでコネクションがアクティブなままになります。表示するページに多数の静的アプリケーション・ファイルへの参照が含まれている場合、同時にファイルのダウンロードが要求されるため、一時的に多くのアクティブなコネクションが要求されます。

場合によってはコネクションが取得できないため、エラーが発生します。ORDSのコネクション・プールの最大値を上げることで対応できますが、オブジェクト・ストレージやCDNに画像を配置しデータベースの負荷を下げる方がコスト的に有利になります。

Oracle CloudのAutonomous Databaseを利用している場合は、特に利用をお勧めする機能です。

オブジェクト・ストレージのバケットの可視性パブリックにしたくない場合は、バケットの事前承認済リクエストを代わりに使用することもできます。可視性プライベートに変更し、バケットの事前承認済リクエストを作成します。


作成した事前承認済リクエストアプリケーション定義ユーザー・インターフェース詳細セクションにある#APP_FILES#のパスに設定します。


意図した実装なのかどうか不明ですが、この設定を有効にするには、アプリケーション・ファイル・ストレージファイル・ストレージ・タイプローカル・データベースに戻す必要があります。


以上の設定により、生成されるページには事前承認済リクエストが含まれるようになります


最後に、静的アプリケーション・ファイルをオブジェクト・ストレージに配置する場合、ファイル名に日本語が含まれていると文字化けします。静的アプリケーション・ファイルは通常URLに含まれる文字列になるため、ファイル名を日本語にすることはあまりないとは思いますが、注意が必要です。

ファイル"たぬき.jpg"を静的アプリケーション・ファイルとしてアップロードしました。オブジェクト・ストレージ・ファイルを確認すると、ファイル名が化けていることが確認できます。


今回の記事は以上になります。

非常に有効な機能追加ですが、使用にあたっていくつかの注意点もありました。

Oracle APEXのアプリケーション作成の参考になれば幸いです。