2022年11月25日金曜日

Customer Managed ORDSの構成(1) - インストールと構成

 Oracle REST Data Services 22.3を使ってCustomer Managed ORDSを構成してみます。22.3以前のバージョンと比較すると、インストール手順が大幅に簡素化されています。

以下が前提条件になります。

  • Autonomous Databaseが作成済み(今回はAlways FreeのATPを使っています)。
  • インスタンス・ウォレットがダウンロード済み(今回はWallet_APEX.zipとします)。
  • 仮想クラウド・ネットワークが構成済み。
  • コンピュート・インスタンスが作成済み。
  • コンピュート・インスタンスがパブリック・ネットワークに配置され、パブリックIPアドレスが割り当てられている。
  • パブリック・ネットワークのイングレス・ルールとしてポート80と443の通信が許可されている。
ORDSはJavaアプリであるのと、Customer Managed ORDSの実装にオラクル・データベースのコンポーネントは使わないため、アーキテクチャはIntelとARM、OSはOracle Linux 8とOracle Linux 9のどちらも選択することができます。

以下より実施した作業を紹介します。


CDNの設定


ブラウザにロードされるOracle APEXの静的ファイルを、CDNから取得するように設定を変更します。この変更は、標準の構成でも利用できます。

Autonomous Databaseより提供されている標準のデータベース・アクションに接続し、APEXのパラメータIMAGE_PREFIXを変更します。

最初にパラメータIMAGE_PREFIXに設定されている値を確認します。
begin
    dbms_output.put_line(
        apex_instance_admin.get_parameter(
            p_parameter => 'IMAGE_PREFIX'
        )
    );
end;

APEXのバージョンによって異なりますが、以下のような結果が返されます。

/i/22.2.0/


CDNを指していないことを確認し、以下の値に置き換えます。

https://static.oracle.com/cdn/apex/22.2.0/

末尾のバージョン番号が一致するようにします。
begin
    apex_instance_admin.set_parameter(
        p_parameter => 'IMAGE_PREFIX'
        , p_value => 'https://static.oracle.com/cdn/apex/22.2.0/'
    );
end;

以上で、CDNの設定は完了です。

Autonomous Databaseのアップグレード作業はオラクルによって実施されますが、パラメータIMAGE_PREFIXの宛先がCDNになっている場合は、オラクル側でIMAGE_PREFIXを適切な位置に変更します。そのため、APEXのバージョンとIMAGE_PREFIXが指している静的ファイルのバージョンに不整合が発生することはありません。


firewalldの構成



データベースとしてAutonomous Databaseを使用している場合、Customer Managed ORDSであっても通信はHTTPSのみに制限されます。HTTPでは構成できません。

ORDSを一般ユーザで実行した上でポート443で接続を受け付けるために、firewalldでポートの転送を行います。

firewall-cmd --add-service=https
firewall-cmd --add-forward-port=port=443:proto=tcp:toport=8443
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all

Customer Managed ORDSを構成するコンピュート・インスタンスにログインし、ユーザーrootで上記のコマンドを実行します。

[root@cmords ~]# firewall-cmd --add-service=https

success

[root@cmords ~]# firewall-cmd --add-forward-port=port=443:proto=tcp:toport=8443

success

[root@cmords ~]# firewall-cmd --runtime-to-permanent

success

[root@cmords ~]# firewall-cmd --reload

success

[root@cmords ~]# firewall-cmd --list-all

public (active)

  target: default

  icmp-block-inversion: no

  interfaces: enp0s3

  sources: 

  services: dhcpv6-client https ssh

  ports: 

  protocols: 

  forward: no

  masquerade: no

  forward-ports: 

port=443:proto=tcp:toport=8443:toaddr=

  source-ports: 

  icmp-blocks: 

  rich rules: 

[root@cmords ~]# 


Java Development Kitのインストール


JDK 17をインストールします。Oracle Cloudのコンピュート・インスタンスにはあらかじめJDK-17を含むリポジトリが登録済み(Intel、ARMともに)です。以下のコマンドを実行すると、JDK-17のインストールは完了します。

dnf -y install jdk-17

[root@cmords ~]# dnf -y install jdk-17

Failed to set locale, defaulting to C.UTF-8

Ksplice for Oracle Linux 8 (aarch64)                                   1.1 MB/s | 470 kB     00:00    

MySQL 8.0 for Oracle Linux 8 (aarch64)                                  27 MB/s | 2.6 MB     00:00    

MySQL 8.0 Tools Community for Oracle Linux 8 (aarch64)                 2.9 MB/s | 235 kB     00:00    

MySQL 8.0 Connectors Community for Oracle Linux 8 (aarch64)            375 kB/s |  23 kB     00:00    

Oracle Software for OCI users on Oracle Linux 8 (aarch64)               38 MB/s |  54 MB     00:01    

Oracle Linux 8 BaseOS Latest (aarch64)                                  64 MB/s |  66 MB     00:01    

Oracle Linux 8 Application Stream (aarch64)                             62 MB/s |  36 MB     00:00    

Oracle Linux 8 Addons (aarch64)                                         11 MB/s | 4.8 MB     00:00    

Dependencies resolved.

=======================================================================================================

 Package            Architecture        Version                     Repository                    Size

=======================================================================================================

Installing:

 jdk-17             aarch64             2000:17.0.5-ga              ol8_oci_included             154 M


Transaction Summary

=======================================================================================================

Install  1 Package


Total download size: 154 M

Installed size: 304 M

Downloading Packages:

jdk-17.0.5_linux-aarch64_bin.rpm                                        30 MB/s | 154 MB     00:05    

-------------------------------------------------------------------------------------------------------

Total                                                                   30 MB/s | 154 MB     00:05     

Running transaction check

Transaction check succeeded.

Running transaction test

Transaction test succeeded.

Running transaction

  Preparing        :                                                                               1/1 

  Installing       : jdk-17-2000:17.0.5-ga.aarch64                                                 1/1 

  Running scriptlet: jdk-17-2000:17.0.5-ga.aarch64                                                 1/1 

  Verifying        : jdk-17-2000:17.0.5-ga.aarch64                                                 1/1 


Installed:

  jdk-17-2000:17.0.5-ga.aarch64                                                                        


Complete!

[root@cmords ~]# 

インストールされたJavaのバージョンを確認します。

java -version

[root@cmords ~]# java -version

java version "17.0.5" 2022-10-18 LTS

Java(TM) SE Runtime Environment (build 17.0.5+9-LTS-191)

Java HotSpot(TM) 64-Bit Server VM (build 17.0.5+9-LTS-191, mixed mode, sharing)

[root@cmords ~]# 

バージョンが17であればJDKのインストールは完了です。


Oracle REST Data Servicesのインストール


IntelとARMでインストールのために実行するコマンドが異なります。Intelの場合は、ORDSを含むリポジトリが構成済みであるため、以下のコマンドを実行するとORDSがインストールされます。

dnf -y install ords

ARMの場合は、以下のコマンドを実行します。x86_64のリポジトリを指定していますが、ORDS自体はCPUアーキテクチャに依存しないため、問題なくインストールできます。

dnf -y --repofrompath ol8_oracle_software,http://yum.oracle.com/repo/OracleLinux/OL8/oracle/software/x86_64 install ords

Oracle Linux 9の場合は以下のコマンドでインストールします。

dnf -y --repofrompath ol9_oracle_software,https://yum.oracle.com/repo/OracleLinux/OL9/oracle/software/x86_64/ install ords

[root@cmords ~]# dnf -y --repofrompath ol8_oracle_software,http://yum.oracle.com/repo/OracleLinux/OL8/oracle/software/x86_64 install ords

Failed to set locale, defaulting to C.UTF-8

Added ol8_oracle_software repo from http://yum.oracle.com/repo/OracleLinux/OL8/oracle/software/x86_64

ol8_oracle_software                                                    814 kB/s |  58 kB     00:00    

Dependencies resolved.

=======================================================================================================

 Package          Architecture       Version                     Repository                       Size

=======================================================================================================

Installing:

 ords             noarch             22.3.3-1.el8                ol8_oracle_software              87 M


Transaction Summary

=======================================================================================================

Install  1 Package


Total download size: 87 M

Installed size: 91 M

Downloading Packages:

ords-22.3.3-1.el8.noarch.rpm                                           6.2 MB/s |  87 MB     00:14    

-------------------------------------------------------------------------------------------------------

Total                                                                  6.2 MB/s |  87 MB     00:14     

Running transaction check

Transaction check succeeded.

Running transaction test

Transaction test succeeded.

Running transaction

  Preparing        :                                                                               1/1 

  Running scriptlet: ords-22.3.3-1.el8.noarch                                                      1/1 

  Installing       : ords-22.3.3-1.el8.noarch                                                      1/1 

  Running scriptlet: ords-22.3.3-1.el8.noarch                                                      1/1 

INFO: Before starting ORDS service, run the below command as user oracle:

         ords --config /etc/ords/config install

INFO: To enable the ORDS service during startup, run the below command:

         sudo  systemctl enable ords


  Verifying        : ords-22.3.3-1.el8.noarch                                                      1/1 


Installed:

  ords-22.3.3-1.el8.noarch                                                                             


Complete!

[root@cmords ~]# 


以上でORDSのインストールは完了です。ORDSをRPMからインストールすると、ユーザーoracleも同時に作成されます。

ORDSはユーザーoracleで実行します。そのため、構成作業もユーザーoracleにて実施します。


Oracle REST Data Servicesの構成



ORDSを構成するために、ユーザーoracleに切り替えます。ORDSの構成ディレクトリのデフォルトである/etc/ords/configへ移動します。このディレクトリもRPMをインストールしたときに作成されます。

su - oracle
cd /etc/ords/config


[root@cmords ~]# su - oracle

Last login: Fri Nov 25 05:54:54 GMT 2022 on pts/0

[oracle@cmords ~]$ cd /etc/ords/config

[oracle@cmords config]$ 


データベースへの接続に使用するウォレットを/etc/ords/config以下にコピーしておきます。リモート・コピーのツール(sftpなど)を使って、ウォレット・ファイルをアップロードします。今回はウォレット・ファイルとしてWallet_APEX.zipをアップロードしています。

ls -l Wallet_APEX.zip

[oracle@cmords config]$ ls -l Wallet_APEX.zip 

-rw-r--r--. 1 oracle oinstall 26412 Nov 25 06:00 Wallet_APEX.zip

[oracle@cmords config]$ 


ORDSの構成を行います。以下のコマンドを実行します。

ords install adb --interactive --prompt-password

インストールのコマンドや、質問の詳細はマニュアルのこちらに記載されています。

対話的にインストールする(interactive)、パスワードの入力を要求する(prompt-password)を指定しています。

Autonomous Database Wallet path/etc/ords/config/Wallet_APEX.zipになります。ウォレット・ファイルの名前、位置が異なる場合は、構成に合わせて変更します。

TNS Network alias to useはインスタンス名_LOWを選択しています。今回の例ではAPEX_LOWです。Always FreeのインスタンスであればLOW一択ですが、データベースのOCPU数が多い場合は、MEDIUMやHIGHを選択してもよいでしょう。

administrator usernameADMINです。続けてユーザーADMINのパスワードを入力します。

ORDS runtime database usernameはデフォルトのORDS_PUBLIC_USER2を採用します。このユーザーと続けて入力するパスワードを使って、ORDSはデータベースに接続します。ORDS_PUBLIC_USER2が存在しない場合は新規に作成されます。すでに存在する場合は、作成済みのユーザーを使用します。入力したパスワードが作成済みのユーザーに設定されているパスワードと一致しない場合は、入力したパスワードに置き換えられます。可用性を確保するためにORDSを複数回インストールする場合は、パスワードに間違いがないように注意が必要です。

PL/SQL Gateway usernameORDS_PLSQL_GATEWAY2とします。APEXの処理はこのユーザーを介して実行されます。このユーザーもORDS_PUBLIC_USER2と同様に、存在しない場合は新規に作成されます。存在する場合でパスワードが異なると、入力したパスワードに置き換えられます。

select additional feature(s) to enable3(REST Enabled SQL)を選択しています。広くサービスを公開する場合などは、Customer Managed ORDSで利用できる機能を限定した方が良いかもしれません。

これ以降はWebサーバーの構成になります。ポート8443HTTPSの待ち受けを行うように構成します。

以上を入力するとORDSが構成され、サーバーが起動します。

[oracle@cmords config]$ ords install adb --interactive --prompt-password


ORDS: Release 22.3 Production on Fri Nov 25 06:06:12 2022


Copyright (c) 2010, 2022, Oracle.


Configuration:

  /etc/ords/config/


The configuration folder /etc/ords/config does not contain any configuration files.


Oracle REST Data Services - Interactive Customer Managed ORDS for Autonomous Database


  Enter the Autonomous Database Wallet path: /etc/ords/config/Wallet_APEX.zip

  Enter a number to select the TNS Network alias to use

    [1] APEX_LOW     ...service_name=bp9nc*******4p_apex_low.adb.oraclecloud....

    [2] APEX_MEDIUM  ...service_name=bp9nc*******4p_apex_medium.adb.oracleclo...

    [3] APEX_HIGH    ...service_name=bp9nc*******4p_apex_high.adb.oraclecloud...

    [4] APEX_TP      ...service_name=bp9nc*******4p_apex_tp.adb.oraclecloud.c...

    [5] APEX_TPURGENT ...service_name=bp9ncf74sqibu4p_apex_tpurgent.adb.oraclec...

  Choose [1]: 

  Provide database user name with administrator privileges.

    Enter the administrator username [ADMIN]: 

  Enter the database password for ADMIN: ********

  Enter the ORDS runtime database username [ORDS_PUBLIC_USER2]: 

  Enter the database password for ORDS_PUBLIC_USER2: ********

Confirm password: ********

  Enter the PL/SQL Gateway database username: ORDS_PLSQL_GATEWAY2

  Enter the database password for ORDS_PLSQL_GATEWAY2: ********

Confirm password: ********

Connecting to Autonomous database user: ADMIN TNS Service: APEX_LOW

Retrieving information

  Enter a number to select additional feature(s) to enable:

    [1] Database Actions  (Enables all features)

    [2] REST Enabled SQL and Database API

    [3] REST Enabled SQL

    [4] Database API

    [5] None

  Choose [1]: 3

  Enter a number to configure and start ORDS in standalone mode

    [1] Configure and start ORDS in standalone mode

    [2] Skip

  Choose [1]: 

  Enter a number to select the protocol

    [1] HTTP

    [2] HTTPS

  Choose [1]: 2

  Enter the HTTPS port [8443]: 

The setting named: db.wallet.zip.path was set to: /etc/ords/config/Wallet_APEX.zip in configuration: default

The setting named: db.wallet.zip.service was set to: APEX_LOW in configuration: default

The setting named: db.username was set to: ORDS_PUBLIC_USER2 in configuration: default

The setting named: db.password was set to: ****** in configuration: default

The setting named: plsql.gateway.mode was set to: proxied in configuration: default

The setting named: feature.sdw was set to: false in configuration: default

The global setting named: database.api.enabled was set to: false

The setting named: restEnabledSql.active was set to: true in configuration: default

The setting named: security.requestValidationFunction was set to: ords_util.authorize_plsql_gateway in configuration: default

The global setting named: standalone.https.port was set to: 8443

The global setting named: standalone.context.path was set to: /ords

The global setting named: standalone.doc.root was set to: /etc/ords/config/global/doc_root

2022-11-25T06:07:44.005Z INFO        Connecting to Autonomous database user: ADMIN TNS Service: APEX_LOW

------------------------------------------------------------

Date       : 25 Nov 2022 06:07:44

Release    : Oracle REST Data Services 22.3.3.r3111929


Database   : Oracle Database 19c Enterprise Edition  

DB Version : 19.17.0.1.0

------------------------------------------------------------

Container Name: BP9NCF74SQIBU4P_APEX

------------------------------------------------------------


[*** script: ords_runtime_user.sql] 


[中略]


2022-11-25T06:07:53.759Z WARNING     *** jdbc.MaxLimit in configuration |default|lo| is using a value of 10, this setting may not be sized adequately for a production environment ***

2022-11-25T06:07:53.760Z WARNING     *** jdbc.InitialLimit in configuration |default|lo| is using a value of 3, this setting may not be sized adequately for a production environment ***

2022-11-25T06:07:57.754Z INFO        Oracle REST Data Services initialized

Oracle REST Data Services version : 22.3.3.r3111929

Oracle REST Data Services server info: jetty/10.0.12

Oracle REST Data Services java info: Java HotSpot(TM) 64-Bit Server VM 17.0.5+9-LTS-191


まだ設定は完了していないため、CTRL+Cを入力し処理を中断します。


自己署名証明書によるHTTPS化



以下の記事に従って自己署名証明書を作成し、HTTPS化を完了します。ディレクトリ/etc/ords/config/global/standaloneまでは作成済みなので、実行するコマンドはopenssl以降になります。

settings.xmlはすでにHTTPSで起動するように設定されているため、変更は不要です。

Oracle APEXの環境作成(10) - 自己署名証明書によるHTTPS化
http://apexugj.blogspot.com/2022/11/building-oracle-apex-environment-10-https.html

自動起動の設定をしてORDSを起動します。

systemctl enable ords
systemctl start ords

[root@cmords ~]# systemctl enable ords

Synchronizing state of ords.service with SysV service script with /usr/lib/systemd/systemd-sysv-install.

Executing: /usr/lib/systemd/systemd-sysv-install enable ords

Created symlink /etc/systemd/system/multi-user.target.wants/ords.service → /etc/systemd/system/ords.service.

Created symlink /etc/systemd/system/graphical.target.wants/ords.service → /etc/systemd/system/ords.service.

[root@cmords ~]# systemctl start ords

[root@cmords ~]# 


以上でCustomer Managed ORDSの構成は完了です。

接続確認を行います。手元のPCのHostsファイルに登録したホスト名を使用し、以下のURLにアクセスします。
https://ホスト名/ords/

信頼できない証明書のエラーが発生するので、HTTPSの構成手順の記事にあるように自己署名証明書を信頼する設定を、手元のPCで実施します。

その後、HTTPSにて再度アクセスします。

APEXの画面にアクセスできることが確認できるはずです。



PL/SQL Gateway Userについて



PL/SQL Gateway UserとしてORDS_PLSQL_GATEWAY2を作成しています。作成時にパスワードを指定していますが、本来PL/SQL Gateway Userにパスワードは不要です。sqlplusなどの接続に例えると、以下のような指定により接続するためです。

connect ords_public_user2[ords_plsql_gateway2]/[ords_public_user2のパスワード]@apex_low

実際にAutonomous Databaseに標準で作成されているユーザーORDS_PLSQL_GATEWAYのAUTHENTICATION_TYPEはPASSWORDではなくNONEになっており、パスワードは設定されていません。

以下のコマンドを実行してORDS_PLSQL_GATEWAY2のパスワードを削除しても、ORDSの運用は可能です。

alter user ords_plsql_gateway2 no authentication;

ORDSの追加インストール時にORDS_PLSQL_USER2のパスワードが一致せず、また、パスワードの変更もできないため、追加インストールは必ず失敗します。

追加でORDSをインストールすることがない、または、PL/SQL Gateway Userにパスワードを設定した後にORDSの追加インストールを行なうという手順が徹底できれば、ORDS_PLSQL_GATEWAY2のパスワードを削除すると、より環境が安全になるでしょう。

続く