2024年3月18日月曜日

podmanとYAML形式の構成ファイルを使って色々なCloudの仮想マシンにOracle APEXを実装する

Oracle Container RegistryにはOracle Database 23c FreeとOracle REST Data Servicesのコンテナ・イメージが登録されています。Oracle REST Data Servicesのコンテナ・イメージにはOracle APEXの全言語版が含まれていて、初回起動時にデータベースにOracle APEXとOracle REST Data Servicesを構成するようにコンテナ・イメージが作られています(ただし、データベースにインストールされるのは英語のみ)。

コンテナ・イメージからOracle APEXが動作する環境を作成するには、Oracle Database 23c FreeとOracle REST Data Servicesの2つのコンテナが必要です。podmanにはYAML形式の構成ファイルを読み込み、podとそれに含まれるコンテナを作成する機能があります。この機能を使って、色々なCloudの仮想マシンにOracle APEXを実装してみます。

podmanに与えるYAMLファイルを生成するスクリプトは以下です。

Oracle Cloud、Microsoft Azure、AWS、Google Cloudの仮想マシン上にOracle APEXの環境を作成します。

仮想マシンは少なくてもスレッドが2つ(オラクルであれば 1OCPU、その他は 2vCPU)、メモリは最低限 8GB は必要です。 4GB だとスワップが発生しパフォーマンスが悪化します。

データベースのイメージにORDSをインストールする(同居させる - こちらの記事)と、メモリ要件を下げることができる可能性があります。


Oracle Cloud



仮想マシンはイメージとしてOracle Linux 9Shape1OCPU、メモリ8GBを選択して作成しました。


仮想マシンのIPアドレスは、手元のPCにホスト名oci-apexで参照できるように登録しておきます。接続に使用する秘密キーのファイルはoci-apex.keyとして保存しています。

Oracle Cloudに作成した仮想マシンに接続します。

ssh -i oci-apex.key opc@oci-apex

podmanのインストールとfirewalldの設定を行います。

以下のコマンドを実行します。podmanを含むcontainer-toolsをインストールしたのち、firewalldにポート818184431521への接続許可とポート80への接続を8181へ、ポート443への接続を8443へ転送する設定を行なっています。今回はHTTPで構成するため、HTTPS関連の設定は実際は不要です。その後にグループoinstallをGID:54321、ユーザーoracleをUID:54321で作成します。

作成したユーザーoracleで作業を行います。

sudo su - oracle

[opc@apex ~]$ sudo su - oracle

[oracle@apex ~]$ 


コンテナ・イメージが無ければpod作成時にダウンロードされますが、ポッドの作成に時間がかかります。作業の進捗が分かりにくくなるため、あらかじめコンテナ・イメージをダウンロードしておくことをお勧めします。

podman pull container-registry.oracle.com/database/free:latest
podman pull container-registry.oracle.com/database/ords:latest

記事に先頭に示したスクリプトinstall_apex.shを仮想マシン上に配置します。

引数にデータベースのSYSのパスワードを指定します。

sh install_apex.sh パスワード

[oracle@apex ~]$ sh install_apex.sh パスワード

apex.yaml is generated. please run

podman kube play apex.yaml

To monitor the progress

podman logs apex-db

podman exec -it apex-ords tail -f /tmp/install_container.log

[oracle@apex ~]$


構成ファイルがapex.yamlとして出力されます。

podmanにこのファイルを渡し、Oracle Database 23c FreeとOracle REST Data Servicesの2つのコンテナを含むポッドapexを作成します。Oracle APEXとOracle REST Data Servicesの構成は、Oracle REST Data Servicesのコンテナ起動時に自動的に行われます。

podman kube play apex.yaml

[oracle@apex ~]$ podman kube play apex.yaml

Pod:

de1381c11f990c81c2c348a5fe11654e4fb9963a373216d54ccc3083ab515ec6

Containers:

66bac5230fe5f745e5dd1a822b3728ffb9f1cdbebbf42c944fd22b25d369e2da

a305fdf18191eb184892fc9180cb88cd420b280a2d530b72715eb26df62c70f3


[oracle@apex ~]$ 


データベースのコンテナが作成された後に、Oracle APEXのインストールが開始します。

進捗は、以下のコマンドで確認できます。

podman exec -it apex-ords tail -f /tmp/install_container.log

大体30分弱でOracle APEXの構成が終了します。

--application/pages/page_00206

--application/end_environment

... elapsed: 4.8 sec


...done

Adjust instance settings


PL/SQL procedure successfully completed.


Disconnected from Oracle Database 23c Free Release 23.0.0.0.0 - Develop, Learn, and Run for Free

Version 23.3.0.23.09



構成が終了すると、以下のURLからORDSのランディング・ページにアクセスできます。



Oracle APEXを開くと日本語のリソースもインストールされていることが確認できます。



Microsoft Azure



Azureの仮想マシンではイメージとしてOracle Linux 9が選択できるので、それを選択します。OSが同じなので、Oracle Cloudと同じ手順でOracle APEXを構成できます。

サイズStandard_D2s_v3(2 vcpu数、8GiBのメモリ)を選択します。


受信ポートを選択で、HTTP (80), HTTPS (443), SSH (22)を選択します。


以上の条件で仮想マシンを作成します。

仮想マシンのIPアドレスは、手元のPCにホスト名azure-apexで参照できるように登録しておきます。接続に使用する秘密キーのファイルはapex_key.pemとして保存しています。

Microsoft Azureに作成した仮想マシンに接続します。

ssh -i apex_key.pem azureuser@azure-apex

これ以降の作業はOracle Cloudと同じです。

大体30分弱でOracle APEXの構成が終了しました。

構成が完了すると、以下のURLでORDSのランディング・ページに接続できます。



Google Cloud



Google Cloudではマシンの構成e2-standard-2 (2vCPU、1コア、8GBメモリ)を選択します。


ブートディスクRocky Linux 9 optimized for GCPを選択しました。


ファイアウォールHTTPトラフィックHTTPSトラフィックを許可するにチェックを入れます。


以上の条件で仮想マシンを作成します。

Google Cloudでは秘密鍵の扱いが少々異なるため、Google Cloudの仮想マシンはブラウザウィンドウから操作することにしました。


Rocky Linux 9をブートイメージとして選択しているため、以降の作業はOracle Linux 9と同じです。


仮想マシンのIPアドレスは、手元のPCにホスト名gcp-apexで参照できるように登録しておきます。

大体30分弱でOracle APEXの構成が終了しました。

構成が完了すると、以下のURLでORDSのランディング・ページに接続できます。



Amazon Lightsail



インスタンスイメージにCentOS 9 Streamを選択します。


サイズは8GBメモリ、2仮想CPU$40を選択します。


接続に使用するSSHキーペアの変更を行います。

作成されたインスタンスの接続に使えるSSHキーファイルを、aws-key.pemとして保存しておきます。


以上の条件でインスタンスを作成します。

ネットワーキングのIPv4ファイアウォールについて、HTTPはデフォルトで許可されているため、特に変更しません。プロトコルTCPのポート番号1521443(HTTPS)は、必要に応じて追加します。


仮想マシンのIPアドレスは、手元のPCにホスト名aws-apexで参照できるように登録しておきます。

Amazon Lightsailに作成した仮想マシンに接続します。

ssh -i aws-key.pem ec2-user@aws-apex

これ以降の作業はOracle Cloudと同じです。

大体40分弱でOracle APEXの構成が終了しました。

構成が完了すると、以下のURLでORDSのランディング・ページに接続できます。


色々なCloudの仮想マシンにOracle APEXを実装する手順の紹介は以上です。

RHEL9系列のOracle Linux 9、Rocky Linux 9、CentOS 9 Streamを選んでいるので、仮想マシンを準備した後の作業手順は基本同じです。

ポッドapexを作成するためにYAML形式の構成ファイルを使用しています。パスワードについてはKubenetes secretとして保存し、ポッドを作成するapex.yamlにパスワードの記述を含めないようにしています。ords_secrets/conn_string.txtおよびords_custom/01_install_language.shには、APEXおよび言語リソースをインストールするためにSYSのパスワードが記載されています。

ords_custom/01_install_language.shおよびords_secrets/conn_string.txt(このファイルはインストールが終了すると削除されます)は削除すればよいのですが、環境変数ORACLE_PWDに与えたパスワードはpodman generate kube apexを実行すると取り出すことができます。

そのため、安全のためにOracle APEXの環境構築後はsetPassword.shを呼び出して、SYS、SYSTEM、PDBADMINのパスワードの変更を変更しておくことが推奨されます。

podman exec apex-db ./setPassword.sh <your_password>

最後に、install_apex.shを実行すると以下のようなYAMLファイルが生成されています。