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ファイルを生成するスクリプトは以下です。

#!/bin/sh
# Usage: install_apex.sh password [directory]
#
# password for sys password to install APEX into the database.
#
APEX_VERSION=23.2.0
#LANGUAGES=""
LANGUAGES="JAPANESE"
PASSWORD=${1}
DIR=${2:-`pwd`}
YAML=apex.yaml
SECRET_YAML=secret.yaml
# create directory for /opt/oracle/variables
mkdir -p ords_secrets
chmod 777 ords_secrets
# create ords_secrets/conn_string.txt
echo "CONN_STRING=sys/${PASSWORD}@localhost:1521/freepdb1" > ${DIR}/ords_secrets/conn_string.txt
# create directory for /etc/ords/config
mkdir -p ords_config
chmod 777 ords_config
# store sys password as kubenetes secret
encpassword=`echo -n ${PASSWORD} | base64`
cat <<EOF > ${SECRET_YAML}
apiVersion: v1
data:
password: ${encpassword}
kind: Secret
metadata:
creationTimestamp: null
name: oracle_params
EOF
podman kube play ${SECRET_YAML}
rm ${SECRET_YAML}
# create language resource installer.
if [ -n "${LANGUAGES}" ]; then
custdir=""
mkdir -p ords_custom
cat <<EOF > ords_custom/01_install_language.sh
#!/bin/sh
cd /opt/oracle/apex/${APEX_VERSION}
export PATH=/opt/oracle/sqlcl/bin:\$PATH
sql sys/${PASSWORD}@localhost/freepdb1 as sysdba @load_trans ${LANGUAGES} 2>&1 >> /tmp/install_container.log
EOF
chmod 777 ords_custom/01_install_language.sh
else
custdir="# "
fi
# Create Kube YAML
cat <<EOF > ${YAML}
apiVersion: v1
kind: Pod
metadata:
labels:
app: apex
name: apex
spec:
containers:
- env:
- name: ORACLE_PWD
valueFrom:
secretKeyRef:
name: oracle_params
key: password
image: container-registry.oracle.com/database/free:latest
name: db
ports:
- containerPort: 1521
hostPort: 1521
- containerPort: 8181
hostPort: 8181
- containerPort: 8443
hostPort: 8443
securityContext:
privileged: true
- image: container-registry.oracle.com/database/ords:latest
name: ords
securityContext:
privileged: true
depends_on:
- db
volumeMounts:
- mountPath: /opt/oracle/variables
name: home-oracle-ords_secrets-host-0
- mountPath: /etc/ords/config
name: home-oracle-ords_config-host-1
${custdir} - mountPath: /ords-entrypoint.d
${custdir} name: home-oracle-ords_custom-host-2
volumes:
- hostPath:
path: ${DIR}/ords_secrets
type: Directory
name: home-oracle-ords_secrets-host-0
- hostPath:
path: ${DIR}/ords_config
type: Directory
name: home-oracle-ords_config-host-1
${custdir} - hostPath:
${custdir} path: ${DIR}/ords_custom
${custdir} type: Directory
${custdir} name: home-oracle-ords_custom-host-2
EOF
# apex.yaml is generated, create podman pod
# podman kube play apex.yaml
echo 'apex.yaml is generated. please run'
echo 'podman kube play apex.yaml'
echo 'To monitor the progress'
echo 'podman logs apex-db'
echo 'podman exec -it apex-ords tail -f /tmp/install_container.log'
# end
view raw install_apex.sh hosted with ❤ by GitHub
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で作成します。

#!/bin/sh
# Preparation script to setup Oracle APEX using container images
# on Oracle Container Registry.
#
# Install podman
# firewalld is ignored if already installed.
sudo dnf -y install container-tools firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
# Setup firewalld to accept sqlnet, http and https connection.
sudo firewall-cmd --add-port=8181/tcp
sudo firewall-cmd --add-port=8443/tcp
sudo firewall-cmd --add-port=1521/tcp
sudo firewall-cmd --add-forward-port=port=443:proto=tcp:toport=8443
sudo firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8181
sudo firewall-cmd --runtime-to-permanent
sudo firewall-cmd --list-all
# Create group oinstall and user oracle.
sudo groupadd -g 54321 oinstall
sudo useradd -u 54321 -g 54321 oracle
sudo loginctl enable-linger 54321
# end of preparation.
作成したユーザー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ファイルが生成されています。

apiVersion: v1
kind: Pod
metadata:
labels:
app: apex
name: apex
spec:
containers:
- env:
- name: ORACLE_PWD
valueFrom:
secretKeyRef:
name: oracle_params
key: password
image: container-registry.oracle.com/database/free:latest
name: db
ports:
- containerPort: 1521
hostPort: 1521
- containerPort: 8181
hostPort: 8181
- containerPort: 8443
hostPort: 8443
securityContext:
privileged: true
- image: container-registry.oracle.com/database/ords:latest
name: ords
securityContext:
privileged: true
depends_on:
- db
volumeMounts:
- mountPath: /opt/oracle/variables
name: home-oracle-ords_secrets-host-0
- mountPath: /etc/ords/config
name: home-oracle-ords_config-host-1
- mountPath: /ords-entrypoint.d
name: home-oracle-ords_custom-host-2
volumes:
- hostPath:
path: /home/oracle/ords_secrets
type: Directory
name: home-oracle-ords_secrets-host-0
- hostPath:
path: /home/oracle/ords_config
type: Directory
name: home-oracle-ords_config-host-1
- hostPath:
path: /home/oracle/ords_custom
type: Directory
name: home-oracle-ords_custom-host-2
view raw apex.yaml hosted with ❤ by GitHub