2024年6月10日月曜日

Oracle Database 23aiで動作するOracle APEXでウォレットとしてsystem:を設定する

Oracle Database 23aiより、データベースよりTLSでコールアウトする際に使用するウォレットとしてsystem:が指定できるようになりました。

UTL_HTTPでの指定は以下のようになります。Oracle Corporationに所属しているMartin BachさんのブログUsing the JavaScript fetch API in Oracle Database 23aiを参照しています。
begin
    utl_http.set_wallet('system:');
end;
/
Oracle Database 23ai FreeにインストールしたAPEXで、ウォレットのパスとしてsystem:を指定できるかどうか確認してみました。結果としては動作したので、Oracle Database 23aiからは、Oracle APEXの環境構築の際にOracle Walletを作成する必要が無くなっています

2024年6月19日追記
Oracle APEX 24.1をOracle Database 23aiにインストールした場合は、ウォレット・パスが未指定であればsystem:を参照するようになりました。そのため、APEXでもウォレットに関する設定は不要になりました。
追記終わり

Oracle APEXの管理サービスにアクセスし、インスタンスの管理からインスタンスの設定を開きます。ウォレットのセクションのウォレット・パスはデフォルトで未指定です。

インスタンスの設定電子メールOracle APEXインスタンスのURLおよびOracle APEXのイメージURLはデフォルトで無指定ですが、必須項目です。変更を適用する際は値の指定が必須なので、デフォルトURLをクリックして設定しておきます。


この状態で、APEXのワークスペースよりAPEX_WEB_SERVICE.MAKE_HTTP_REQUESTを呼び出してみます。最初は引数p_wallet_pathをコメント・アウトします。
declare
    l_clob clob;
begin
    l_clob := apex_web_service.make_rest_request(
        p_url => 'https://oracle.com'
        ,p_http_method => 'GET'
        -- ,p_wallet_path => 'system:'
    );
    dbms_output.put_line(substr(l_clob, 1, 100));
end;
p_urlに指定しているプロトコルがhttpsであるため、ウォレットの指定が無いとORA-29024: 証明書の検証に失敗したが発生します。


p_wallet_pathのコメント・アウトを解除して、再度実行します。

ORA-29024は発生せず、コンテンツの取得ができています。ウォレット・パスに与えているsystem:は新しく追加された指定ですが、Oracle APEXのAPEX_WEB_SERVICEパッケージはp_wallet_pathへのsystem:の指定を、UTL_HTTP.SET_WALLETの引数として渡せています。


管理サービスを開き、インスタンスの設定ウォレット・パスとしてsystem:を設定します。この設定はAPEX_WEB_SERVICE.MAKE_REST_REQUESTの引数p_wallet_pathのデフォルト値になります。


APEXワークスペースより、再度同じ処理を実行します。引数p_wallet_pathをコメント・アウトしても、今度はエラーは発生しません。


APEX_WEB_SERVICE.MAKE_REST_REQUESTを呼び出すにあたって、ネットワークACLの追加が必要です。APEX 23.2の場合は、以下のようにprincipal_nameにAPEX_230200を指定します。
begin
  DBMS_NETWORK_ACL_ADMIN.APPEND_HOST_ACE(
    host => '*',
    ace => xs$ace_type(
        privilege_list => xs$name_list('connect'),
        principal_name => 'APEX_230200',
        principal_type => xs_acl.ptype_db));
  commit; 
end;
/
パッケージAPEX_WEB_SERVICEの所有者は(APEXのバージョンが23.2であれば)APEX_230200であり、MAKE_REST_REQUESTは定義者権限で動作します。APEX_WEB_SERVICEからHTTPのコールアウトを行う際にUTL_HTTPを呼び出されますが、定義者権限であるため、この呼び出しはパッケージAPEX_WEB_SERVICEの所有者であるAPEX_230200によって実行されることになります。そのためprincipal_nameをAPEX_230200としてネットワークACLを定義する必要があります。

今回参照した記事では、MLE JavaScriptよりHTTPのコールアウトを行なっています。これは接続しているスキーマで実行されるため、ネットワークACLはAPEXワークスペース・スキーマに対して許可する必要あります。また、APEXのインスタンス設定のウォレット・パスはあくまでAPEX_WEB_SERVICEからUTL_HTTPを呼び出す際に与えるウォレットのデフォルト値であるため、MLE JavaScriptではMartin Bachさんの記事にあるように、別途ウォレットを指定する必要があります。

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