最近のAPEX Office Hoursで、この機能を開発したJaon Straubさんが解説をしています。28分から40分の間です。本記事は彼の機能紹介に依っています。
アプリケーション定義にアプリケーション・ファイル・ストレージの項目が追加されています。ファイル・ストレージ・タイプのデフォルトはローカル・データベースです。この設定をOracle Cloud Object Storageに変更し、リモート・ファイル・サーバーとしてOracle Cloudのオブジェクト・ストレージのバケットURLが宛先となっているファイル・サーバーを指定します。
リモート・ファイル・サーバーを作成するには、オブジェクト・ストレージの追加をクリックします。
リモート・ファイル・ストレージの名前は任意です。ここで作成するリモート・ファイル・ストレージは、ワークスペース・ユーティティのリモート・サーバーとして管理されるため、ワークスペースで一意にします。
バケットURLは、OCIのオブジェクト・ストレージのバケットを指すURLです。バケットに保存するファイルは、APEXのアプリケーションにアクセスしているブラウザから直接アクセスできなければならないため、通常は可視性をパブリックにします。バケットの作成をオンにしていると、新規にバケットが作成されます。可視性はパブリックになります。
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/が追加されています。
このようにして作成したリモート・ファイル・サーバーを、アプリケーション・ファイル・ストレージに設定します。
静的アプリケーション・ファイルから作成したファイルは、オブジェクト・ストレージのバケットにアップロードされます。
ファイルの作成をクリックし、ファイル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のアプリケーション作成の参考になれば幸いです。
完