オラクルの公式ブログと先日のOffice Hourにて、製品マネージャーのTodd BottgerさんよりAutonomous DatabaseのAPEXで複数ドメインが利用できるようになった、と告知がありました。
ブログの記事は以下になります。
Oracle Autonomous Database Vanity URLs Part 4: Multiple Domain NamesOffice Hourは以下より録画を視聴できます。
Vanity URL Extensions for APEX & ORDS (2022年2月17日)
複数ドメインの確認は難しいため、単一のAutonomous DatabaseのAPEXに複数のホスト名を割り当てる設定を行ってみました。
以前の記事OCIの証明書サービスを使うに従って構築した環境を使います。元の英語の記事ではAutonomous Databaseはプライベート・エンドポイントで構成されていますが、それは有料なので使わず、Customer Managed ORDSを構成することにより独自ホスト名を割り当てられるようにしています。
ロード・バランサはtestsrvlbとして作成しています。割り当てられたパブリックIPアドレスは、DNSより2つのホスト名webprod.apexugj.devおよびwebtest.apexugj.devから参照されるようにしています。手順が分かりにくくなるので本記事では検証に使用したホスト名をそのまま記載しますが、ホスト名の部分はそれぞれの環境に合わせて置き換えて作業する必要があります。
構成されている環境の概要は以下です。仮想プライベート・ネットワークをMyAPEXDEVNetとして作成していますが、データベース、コンピュート、ロード・バランサなど全てが仮想プライベート・ネットワーク内の同一のパブリック・ネットワークに含まれているので、説明からは省きます。
- Always FreeのAutonomous Transaction ProcessingをAPEXDEVとして作成。
- コンピュート・インスタンスを作成し、Customer Managed ORDSを構成。
- OCIの証明書サービスを使い、webprod.apexujg.devのサーバー証明書を生成。
- 作成したコンピュート・インスタンスをバックエンドとするロード・バランサtestsrvlbを作成。
- APEXのワークスペースとしてAPEXDEVを作成。
ここまでの手順は以前の記事通りですが、ホスト名はtestsrv.apexugj.devではなく、webprod.apexugj.devとしてアクセスできるように構成しています。
証明書の準備
サーバー証明書はOCIの証明書サービスを使わなくても準備できます。とはいえ、最も準備が容易でかつ無料です。以前の記事でもOCIの証明書サービスを使用しているため、同じ手順で追加の証明書を作成します。
受け付けるホスト名を共通名(Common Name)およびサブジェクトの代替名(Subject Alternative Name)とした証明書を発行します。
OCIのコンソールより証明書サービスを開きます。
コンパートメントにルート、証明書タイプに内部CAによって発行済を選択します。名前はwebtest.apexugj.devとしていますが、この名前はホスト名である必要はありません。説明を入力し、次へ進みます。
サブジェクト情報の共通名として、追加するホスト名webtest.apexugj.devを入力します。サブジェクトの代替名としてもwebtest.apexugj.devを入力し、次へ進みます。
証明書構成の証明書プロファイル・タイプとしてTLSサーバーを選択します。それ以外はデフォルトの設定のまま、次へ進みます。
更新ルールの更新間隔(日数)と拡張更新期間(日数)はともに、デフォルトの90、30のまま変更せず、次へ進みます。
サマリーを確認し、証明書の作成を実行します。
以上で、2つのホスト名webprod.apexugj.dev、webtest.apexugj.devで利用できるサーバー証明書が発行済になりました。
ホスト名の登録
ロード・バランサにホスト名を登録します。
作成済みのロード・バランサtstsrvlbのロード・バランサ詳細ページを開き、リソースからホスト名を選択します。
ホスト名の作成をクリックします。
画面右にドロワーが開きます。名前にProd、ホスト名としてwebprod.apexugj.devを入力します。
作成をクリックします。
ホスト名としてwebprod.apexugj.devが登録されます。再度、ホスト名の作成をクリックし、名前としてTest、ホスト名としてwebtest.apexugj.devを入力し、作成をクリックします。
結果としてロード・バランサtestsrvlbに、ホスト名webprod.apexugj.devおよびwebtest.apexugj.devが登録されます。
リスナーの構成
すでに作成済みのリスナーtestsrvlsnrにホスト名を割り当てます。ロード・バランサ詳細のリソースより、リスナーを選択します。
既存のリスナーtestsrvlsnrのメニューを開き、編集を実行します。
リスナーのホスト名としてProdが表示されます。
ホスト名webtest.apexugj.devを割り当てるリスナーを作成します。
リスナーの作成をクリックします。
名前は任意ですが、ここではwebtestとしています。プロトコルはHTTPS、ポートは443を選択します。証明書リソースとして証明書サービス管理対象証明書、証明書としてwebtest.apexugj.devを選択します。
ホスト名としてTestを選択します。バックエンド・セットとして、既に作成されているバックエンド・セット(ひとつのみのはず)を選択します。
リスナーの作成をクリックします。
リスナーwebtestが新たに作成されます。
以上で登録したホスト名で、ロード・バランサが接続を受け付けるようになりました。
接続確認
最初に以下のURLでアクセスします。
https://webprod.apexugj.dev/ords/
アプリケーション・ビルダーへのサインイン画面が開きます。
同様に以下のURLでもアクセスします。
https://webtest.apexugj.dev/ords/
同じ画面が表示されます。
ホスト名が違っていても、両方とも同じAutonomous Databaseで実行されています。
アプリケーションの作成
webprod.apexugj.devにサインインし、EMP / DEPTのサンプル・アプリケーションを作成します。
SQLワークショップのユーティリティより、サンプル・データセットを開きます。
EMP / DEPT のインストールを実行します。
(アプリケーションにアクセスするURLを英語にするため)言語にEnglishを選び、次へ進みます。
アプリケーションの作成を実行します。インストールしたデータ・セットを元にしたアプリケーションが作成されます。
アプリケーション作成ウィザードが起動します。特に設定の変更はせず、アプリケーションの作成を実行します。
アプリケーションが作成されたことを確認し、アプリケーションの実行を行います。
実行したアプリケーションにサインインします。
画面のURLは以下で始まっています。
https://webprod.apexugj.dev/ords/r/apexdev/demonstration-emp-dept/home
webprodの部分をwebtestに変更してアクセスします。
https://webtest.apexugj.dev/ords/r/apexdev/demonstration-emp-dept/home
ユーザー名、パスワードを入力してサインインすると、同じアプリケーションが実行されます。
初期化PL/SQLコードによるホストの制限
英語の記事では、以下のPL/SQLコードをAPEXアプリケーションに設定することにより、アクセス可能なドメインを制限しています。
DECLARE
the_host VARCHAR2(32767) := LOWER(OWA_UTIL.GET_CGI_ENV('Host'));
BEGIN
IF the_host != 'webprod.apexugj.dev' THEN
APEX_UTIL.REDIRECT_URL (p_url => 'https://' || the_host || '/ords/blocked');
END IF;
END;
アプリケーション定義のセキュリティのデータベース・セッションにある、初期化PL/SQLコードとして記述します。初期化PL/SQLコードは、APEXのページ・プロセスの先頭で必ず実行されます。
OWA_UTIL.GET_CGI_ENV('Host')の呼び出しにより、URLに含まれるホスト部分が取り出されます。PL/SQLのブロック内のIF文の条件で、取り出されたホスト名(この場合webprod.apexugj.dev)に一致しなければ、https://webtest.apexugj.dev/ords/blockedへリダイレクトします。
結果としてwebtest.apexugj.devを指定してアプリケーションにアクセスすると、以下のようなエラーが表示されます。
ワークスペースの分離
現時点ではAutonomous Databaseではサポートされていませんが、Oracle APEXにはワークスペースの分離という設定があります。
管理サービスにサインインし、ワークスペースの管理を開きます。
ワークスペース・レポートの既存のワークスペースを開きます。
編集するワークスペースを開きます。
ワークスペースの分離のタブを選択し、ホスト名の許可にホスト名を設定します。開発ツールを含むワークスペース内のすべてのアプリケーションに対して、ここで指定したホスト名が含まれたURLによるアクセスのみが許可されます。カンマ区切りで複数のホスト名が指定可能です。
ワークスペースの分離として設定されていないホスト名が含まれるURLによって、APEXアプリケーションにアクセスするとHTTP 404 Not Foundのエラーが発生します。
この仕組みを使うことにより、以下のような構成が可能になります。
- ワークスペースA = https://www.domain-a.comからのみアクセス可。
- ワークスペースB = https://www.domain-b.comからのみアクセス可。
ちなみにAutonomous Databaseで既存のワークスペースの編集画面を開くと、ワークスペースの分離が設定項目として無いことが確認できます。
オラクルの公式のドキュメントで制限について記載されている部分は以下になります。
https://docs.oracle.com/en/cloud/paas/autonomous-database/adbsa/apex-restrictions.html#GUID-E13D5044-B9DD-4168-8A12-C99532940DA9
Restrictions and Limitations for Oracle APEX with Autonomous Database
Disabled options in Administration ServicesとしてWorkspace Isolationが含まれています。
以上が、現時点でのAutonomous Database上のAPEXによる複数ドメインのサポート状況になるようです。
元の英語の記事にはロード・バランサの設定なども含まれていますが、あるAPEXアプリケーションにアクセスできるドメインを特定するために、ロード・バランサのルールやAPEX側のコードで制御しています。
ワークスペースの分離によって実現可能な要件であれば、Autonomous Databaseで利用可能になるのを待つのも選択肢になるでしょう。
完