2023年5月20日土曜日

ORDSのコネクション・プールの監視

Oracle REST Data Servicesのコネクション・プールを監視する用途に、ORDS Instance APIを使用できます。ORDS Instance APIについて、以下の2件の記事が公開されています。

1件目はORDSを開発しているKris Riceさんによる記事です。
Monitoring ORDS Connection Pools
2件目はORDSのプロダクト・マネージャのPeter O'Brienさんによる記事です。
ORDS Pool Usage Chart with APEX

コネクション・プールの状態を表示するアプリケーションは、最初の記事では静的なHTMLにJavaScriptを記述したもの、後の記事ではAPEXアプリケーションを作成しています。

後の記事で作成しているAPEXアプリケーションについては、記事中で詳しく説明されています。また、アプリケーションのエクスポートも添付されています。

1件目の記事は書かれた時期がORDS 20.4の頃で、最新のORDSでは構成するためのコマンドも構成ファイルも大幅に変更されています。そのため、本記事ではORDS Instance APIを有効にする新しい手順を紹介します。また、静的なHTMLファイルをほぼそのままAPEXのアプリケーションに変える、という少し変わった実装も紹介します。

以下のように動作するアプリケーションを作成します。



事前作業



ORDS Instance APIを有効にする前に、DNSへのホスト名の登録およびCA(今回はLet's Encrypt)からサーバー証明書を取得する必要があります。ORDS Instance APIをHTTPで呼び出す場合はこれらの作業は不要ですが、HTTPSの場合はパブリック認証局によって署名されたサーバー証明書が必要です。

サーバー証明書を取得するにあたって、ORDSが稼働しているコンピュート・インスタンスのホスト名とパブリックIPアドレスをDNSに登録しておきます。登録手順はDNSのサービスに依存します。

hostコマンドを実行し、DNSに登録したパブリックIPアドレスが返されることを確認します。

host ホスト名

[root@apex2 ~]# host ホスト名

apex2.apexugj.dev has address 150.***.***.177

[root@apex2 ~]# 


Certbotを使って、Let's Encryptからサーバー証明書を取得します。Oracle Linux 8で使用できるCertbotは、EPELリポジトリに含まれています。EPELリポジトリを構成した上で、Certbotをインストールすることもできますが、今回はdnfコマンドにリポジトリを指定して、Certbotをインストールします。

dnf --repofrompath ol8_developer_EPEL,http://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/x86_64 -y install certbot

[root@apex2 ~]# dnf --repofrompath ol8_developer_EPEL,http://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/x86_64 -y install certbot

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

Added ol8_developer_EPEL repo from http://yum.oracle.com/repo/OracleLinux/OL8/developer/EPEL/x86_64

ol8_developer_EPEL                               51 MB/s |  46 MB     00:00    

Last metadata expiration check: 0:00:11 ago on Sat May 20 16:50:29 2023.

Dependencies resolved.

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

 Package                   Arch   Version              Repository          Size

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

Installing:

 certbot                   noarch 1.22.0-1.el8         ol8_developer_EPEL  55 k

Installing dependencies:

 python3-acme              noarch 1.22.0-4.el8         ol8_developer_EPEL  97 k

 python3-certbot           noarch 1.22.0-1.el8         ol8_developer_EPEL 427 k

 python3-chardet           noarch 3.0.4-7.el8          ol8_baseos_latest  195 k

 python3-configargparse    noarch 0.14.0-6.el8         ol8_developer_EPEL  37 k

 python3-configobj         noarch 5.0.6-11.el8         ol8_baseos_latest   68 k

 python3-distro            noarch 1.4.0-2.module+el8.3.0+7694+550a8252

                                                       ol8_appstream       37 k


[中略]


  python3-urllib3-1.24.2-5.0.1.el8.noarch                                       

  python3-zope-component-4.3.0-8.el8.noarch                                     

  python3-zope-event-4.2.0-12.el8.noarch                                        

  python3-zope-interface-4.6.0-1.el8.x86_64                                     

  python36-3.6.8-38.module+el8.5.0+20329+5c5719bc.x86_64                        


Complete!

[root@apex2 ~]# 


certbotを実行すると、サーバー証明書の要求元を検証するために、HTTP-01チャレンジという操作が行われます。この処理は、TCP 80番ポートで通信します。

firewalldにて、TCP 80番ポートの通信を8080番ポートに転送する設定がされている場合、この設定を削除します。

firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=8080
firewall-cmd --runtime-to-permanent
firewall-cmd --list-all

[root@apex2 ~]# firewall-cmd --remove-forward-port=port=80:proto=tcp:toport=8080 

success

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

success

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

public (active)

  target: default

  icmp-block-inversion: no

  interfaces: ens3

  sources: 

  services: cockpit dhcpv6-client http https ssh

  ports: 

  protocols: 

  forward: no

  masquerade: no

  forward-ports: 

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

  source-ports: 

  icmp-blocks: 

  rich rules: 

[root@apex2 ~]# 


Certbotを実行してLet's Encryptからサーバー証明書を取得する準備ができました。

これからの作業は、以下の記事に沿って作業を行います。

Customer Managed ORDSの構成(2) - Let's Encryptを使ったSSL化
Let's Encryptからの証明書取得
ORDSの構成変更

作業の最後に、手元のPCからブラウザでAPEXに接続し、正しく設定されたことを確認します。

https://ホスト名/ords/apex_admin


ORDS Instance APIの有効化



ORDS Instance APIを有効にします。ORDS全体またはコネクション・プールごとに有効化できます。今回はORDS全体で有効にします。

ORDSのプロパティinstance.api.enabledtrueにします。

ORDSをインストールしたユーザーoracleで、ORDSの構成コマンドを実行します。

ords --config /etc/ords/config config set --global instance.api.enabled true

[oracle@apex2 ~]$ ords --config /etc/ords/config config set --global instance.api.enabled true


ORDS: Release 23.1 Production on Sat May 20 08:40:13 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


The setting named: instance.api.enabled is not a recognized configuration setting. Run: ords config info to get a list of known configuration settings

The global setting named: instance.api.enabled was set to: true

[oracle@apex2 ~]$ 


instance.api.enabled is not a recognized configurationといったメッセージが出力されますが、instance.api.enabledの名前に間違いがなければ、無視できます。

ORDS Instance APIを呼び出すことのできるユーザーを作成します。

ユーザー名はsysadmin、ロールとしてSystem Administratorを与えます。

ords --config /etc/ords/config config user add sysadmin 'System Administrator'

コマンドの実行中にパスワードの入力を求められます。同じ文字列を2回、入力します。

[oracle@apex2 ~]$ ords --config /etc/ords/config config user add sysadmin 'System Administrator'


ORDS: Release 23.1 Production on Sat May 20 08:23:37 2023


Copyright (c) 2010, 2023, Oracle.


Configuration:

  /etc/ords/config/


Enter the password for sysadmin: ********

Confirm password: ********

Created user sysadmin in file /etc/ords/config/global/credentials

[oracle@apex2 ~]$ 


ORDSの設定変更およびユーザー追加を有効にするには、ORDSを再起動する必要があります。ユーザーrootに戻り、ORDSを再起動します。

exit
systemctl restart ords

[oracle@apex2 ~]$ exit

logout

[root@apex2 ~]# systemctl restart ords

[root@apex2 ~]# 


curlコマンドによる動作確認の例です。

curl --user sysadmin:パスワード https://ホスト名/ords/_/instance-api/stable/status

% curl --user sysadmin:********* https://ホスト名/ords/_/instance-api/stable/status 

{

  "invalid_pools_count" : 0,

  "valid_pools_count" : 1,

  "links" : [ {

    "rel" : "self",

    "href" : "https://***.*****.***/ords/_/instance-api/stable/status"

  }, {

    "rel" : "describedby",

    "href" : "https://***.*****.***/ords/_/instance-api/stable/metadata-catalog/"

  }, {

    "rel" : "related",

    "href" : "https://***.*****.***/ords/_/instance-api/stable/database-pools-cache/"

  } ]

}%                                                                              % 




アプリケーションPool Monitorの作成



アプリケーション作成ウィザードを起動し、空のアプリケーションを作成します。アプリケーションの名前Pool Monitorとします。


アプリケーションが作成されます。

アプリケーション定義置換を開き、ORDS Instance APIの呼び出しに使うホスト名、ユーザー名、パスワードをそれぞれG_HOSTG_USERNAMEG_PASSWORDとして設定します。


ページ・デザイナホーム・ページを開きます。

ページ・プロパティCSSファイルURLとして、以下を指定します。

https://cdn.jsdelivr.net/npm/hack-font@3/build/web/hack-subset.css


Kris Riceさんの記事にある<script>から</script>の間のコードを、JavaScriptファンクションおよびグローバル変数の宣言に記述します。コードには以下の変更を加えます。

ホスト名は&G_HOST.に置き換える。
ユーザー名は&G_USERNAME.に置き換える。
パスワードは&G_PASSWORD.に置き換える。
一番最後のpoolListing();は記述しない。


ページ・プロパティのJavaScriptページ・ロード時に実行に以下を記述します。

poolListing();


静的コンテンツのリージョンを作成し、<body>から</body>の間のHTMLをソースHTMLコードに転記します。

外観テンプレートとして、修飾のないBlank with Attributes (No Grid)を選択します。


以上でアプリケーションは完成です。

アプリケーションを実行すると、記事の先頭の動画のように動作します。

今回作成したアプリケーションのエクスポートを以下に置きました。
https://github.com/ujnak/apexapps/blob/master/exports/ords-pool-monitor.zip

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