本記事の目的
前記事のさくらのVPSではじめるOpen OnDemandでは、1台の計算機を使ったOpen OnDemandの構築方法を紹介しました。しかし、実環境では複数台の計算機で構成されたクラスタ環境が用いられます。
そこで本記事では、クラスタ環境を用いたOpen OnDemandの構築方法を紹介します。具体的には、AWS (Amazon Web Services) 上にクラスタ環境を構築し、そのヘッドノードにOpen OnDemandをインストールします1。AWS上にクラスタ環境を構築する方法として、AWS公式ツールであるAWS ParallelClusterを用います。本記事で用いるOpen OnDemandのバージョンは3.1.1、AWS ParallelClusterのバージョンは3.8.0です。
クラスタ環境の構築
AWS ParallelClusterとは
AWS上でクラスタ環境を構築するには、AWSが提供している様々なサービスを組み合わせる必要があります。具体的には、Amazon EC2(Elastic Compute Cloud)、Amazon VPC(Virtual Private Cloud)、NFS(Network File System)などの共有ファイルシステム、Slurmなどのジョブスケジューラ、AWS Auto Scalingを用いた計算ノードの自動増減などです。
AWS ParallelClusterは、それらの設定を自動化し、統一的な管理を可能にします。AWS ParallelClusterにはWeb上で操作するGUIバージョン(AWS ParallelCluster UI)とコマンドラインで操作するCUIバージョンがあり、本記事では簡単なGUIバージョンを用います。
クラスタ環境の概念図
今回、AWS上で構築するクラスタ環境の概念図は下記の通りです。
Open OnDemandはヘッドノードにインストールし、ユーザはヘッドノードにWebブラウザを使ってログインします。そして、ヘッドノードからSlurmを通して計算ノードにジョブを投入します。必要に応じて、AWS Auto Scalingにより計算ノードの数を増減させます。計算ノードはヘッドノードにNFSマウントしており、ヘッドノードのファイルシステムの一部を共有化します。
AWS ParallelCluster UIのインストール
AWS ParallelCluster UI クイック作成リンクの中からリージョンを選択します。今回は「ap-northeast-1(アジアパシフィック:東京)」を選択しました。
次のスタック作成の画面では、スタック名に適当な名前(デフォルトのparallelcluster-uiのままでもOK)、Admin's Emailに自身のメールアドレス、機能の項目をすべてチェックした後、「スタックの作成」を実行します(15分程度かかります)。入力したメールアドレスに一時パスワードが送信されます。
次に表示されるAWS CloudFormationで、スタックの名前のリンクを選択し、出力タブを選択します。
その中の「ParallelClusterUIUrl」のURLをクリックすると、Emailとパスワードの画面が現れるので、スタック作成時に入力したAdmin's Emailと一時パスワードを入力します。その次の画面で正式なパスワードを設定します。
以上の操作で、AWS ParallelCluster UIのホームページが表示されます。
次にクラスタ環境を作成します。早速「Create cluster」のボタンをクリックしてもよいのですが、その前に左の「Images」をクリックください。AWS ParallelClusterが対応しているAMI(Amazon Machine Image)の一覧が表示されます。
クラスタ環境は基本的にこれらのAMIを用いて構築されますが、この一覧にないカスタムイメージを作成することもできます。そこで、今回はRocky Linux 8.9(arm64アーキテクチャ)のカスタムイメージを作成したいと思います2。さらに、そのカスタムイメージには、HPC (High Performance Computing) 向けのコンテナプラットフォームであるSingularityをインストールしておきます。
「Custom」タブを選択し、「Build image」をクリックします。
Image IDは適当な名前を入力ください。RegionとParenetImageはhttps://rockylinux.org/cloud-images/から選択しています。Nameは適当なAMIの名前です。InstanceTypeはarm64アーキテクチャのAWS Graviton 3を選択しています。ComponentsのValueにはSingularityをインストールするため、dnf install -y singularity-ce
と記載したスクリプトを適当なWebサイトに保存し、そのURLを入力します3。
Region: ap-northeast-1
Image:
Name: Rocky Linux 8.9 Custom AMI for PCluster 3.8.0
Build:
InstanceType: c6g.large
ParentImage: ami-0e0226a3734dea3e4
Components:
- Type: script
Value: https://mnakao.net/singularity.sh
最後に「Build Image」をクリックします。カスタムイメージの完成までに1時間程度かかります。完成すると、カスタムイメージのAMI IDが表示されるので、それをコピーしておきます。
AWS ParallelCluster UIのトップページに戻り、「Create cluster」をクリックします。Nameはクラスタの名前を設定します。ここでは「Rokkosan」にしています。Operating Systemでは「Use a custom Amazon Machine Image (AMI)」を選択し、コピーしておいたカスタムイメージのAMI IDを入力します。VPCはデフォルトVPCなどを選択します。
ヘッドノードの設定を行います。Instance typeはカスタムイメージを作成したときに指定したのと同じ「c6g.large」にしました。また、AWSのコンソールからヘッドノードにログインするために「Add SSM session」をチェックします。「Set IMDS secured」はデフォルトでチェックされていたので、そのままです。
計算ノード設定を行います。Instance typeはヘッドノードと同じにしました(CPUコア数やメモリ量を大きくしてもOKです)。Static nodesは1、Dynamic nodesは4にしました。この設定では、計算ノードは常に1台立ち上がっており、ユーザの要望に応じて最大4台の計算ノードが自動的に起動・停止します。
これまで設定した情報がYAML形式で閲覧できます。Osの行を「Os: rocky8」と変更してください。「Dry run」を実行し、問題がなければ、「Create」をクリックすると、10分程度でクラスタ環境が構築できます。
Open OnDemandの設定
Open OnDemandのインストール
完成したクラスタ名をチェックし、「Shell」をクリックするとそのヘッドノードにログインできます。
Open OnDemandのインストールを行います。
sudo dnf -y config-manager --set-enabled powertools
sudo dnf -y install epel-release
sudo dnf -y module enable ruby:3.1 nodejs:18
sudo dnf -y install https://yum.osc.edu/ondemand/3.1/ondemand-release-web-3.1-1.el8.noarch.rpm
sudo dnf -y install ondemand
sudo systemctl start httpd
sudo systemctl enable httpd
認証の設定
Open OnDemandではApache2.4でサポートしている認証を利用できます。詳細はこちらを参照ください。今回は簡単なためPAM認証の設定を行いますが、この認証は推奨されていないことに注意ください。
sudo dnf -y install mod_authnz_pam
echo "LoadModule authnz_pam_module modules/mod_authnz_pam.so" | sudo tee /etc/httpd/conf.modules.d/55-authnz_pam.conf
sudo cp /etc/pam.d/sshd /etc/pam.d/ood
sudo chmod 640 /etc/shadow
sudo chgrp apache /etc/shadow
/etc/ood/config/ood_portal.yml
に下記を追記します。
auth:
- 'AuthType Basic'
- 'AuthName "Open OnDemand"'
- 'AuthBasicProvider PAM'
- 'AuthPAMService ood'
- 'Require valid-user'
# Capture system user name from authenticated user name
user_map_cmd: "/opt/ood/ood_auth_map/bin/ood_auth_map.regex"
node_uri: '/node'
rnode_uri: '/rnode'
/opt/ood/ood_auth_map/bin/ood_auth_map.regex
を下記のように作成します。
#!/bin/bash
REX="([^@]+)"
INPUT_USER="$1"
if [[ $INPUT_USER =~ $REX ]]; then
MATCH="${BASH_REMATCH[1]}"
echo "$MATCH" | tr '[:upper:]' '[:lower:]'
else
# can't write to standard out or error, so let's use syslog
logger -t 'ood-mapping' "cannot map $INPUT_USER"
# and exit 1
exit 1
fi
実行権限をつけます。
sudo chmod +x /opt/ood/ood_auth_map/bin/ood_auth_map.regex
サーバ証明書の作成
前記事のさくらのVPSではじめるOpen OnDemandではLet's Encryptを使ってサーバ証明書を作成しましたが、AWS上で同様のことを行う場合は独自のドメインが必要です。そこで、今回は自己署名証明書を代わりに用います。信頼された第三者機関(CA)による認証が行われていないため、実運用する場合は正式なサーバ証明書をご利用ください。
# 秘密鍵の作成
openssl genrsa 2048 > server.key
# CSR(Certificate Signing Request)の作成
openssl req -new -key server.key > server.csr
### すべてエンター ###
# 有効期限を365日にしてサーバ証明書(server.crt)を作成
openssl x509 -days 365 -req -sha256 -signkey server.key < server.csr > server.crt
sudo mkdir -p /etc/httpd/conf.d/ssl
sudo mv server.key server.csr server.crt /etc/httpd/conf.d/ssl/
作成したサーバ証明書などの情報を/etc/ood/config/ood_portal.yml
に追記します。また、ヘッドノードのドメイン名を「servername:」に記載します。この情報は「Instances」の「HeadNode」の行にあるIDをクリックしたページの「パブリック IPv4 DNS」に記載されています。
servername: ec2-XXX.ap-northeast-1.compute.amazonaws.com
ssl:
- 'SSLCertificateKeyFile "/etc/httpd/conf.d/ssl/server.key"'
- 'SSLCertificateFile "/etc/httpd/conf.d/ssl/server.crt"'
Open OnDemandの機能を使って、Apacheの設定ファイルを自動生成し、apacheの設定をリロードします。
sudo /opt/ood/ood-portal-generator/sbin/update_ood_portal
sudo systemctl reload httpd
ヘッドノードの設定
デフォルトのユーザであるrockyにパスワードを設定します。
sudo passwd rocky
Open OnDemandのWebサーバにアクセスするため、ヘッドノードの443ポートを開けます。
「Instances」の「HeadNode」の行にあるIDをクリックします。「セキュリティ」タブの「セキュリティグループ」をクリックすると、インバウンドルールの設定項目画面が表示されます。
「インバウンドのルールを設定」をクリックした後、「ルールの追加」をクリックします。「タイプ」にHTTPSを設定し、接続元の範囲を0.0.0.0/0(どこからでもアクセス可能)に設定し、「ルールを保存」をクリックします。
この時点で、Webブラウザに「https://(ドメイン名)」を入力すると、ユーザ認証後(ユーザ名はrocky)に下記のような画面が表示されます。
Singularityのコンテナイメージの作成
計算ノードで何らかのアプリケーションを動作させるためには、すべての計算ノードにそのアプリケーションの設定が必要であり、非常に煩雑な作業になります。そこで、必要なアプリケーションをインストールしたSingularityコンテナイメージを、全計算ノードが参照できる共有ファイルシステム(/opt/parallelcluster/shared
)に保存することにします4。
今回はリモートデスクトップをインストールしたコンテナイメージを構築するため、下記のSingularityの定義ファイルを作成します。
# rokko.def
Bootstrap: docker
From: rockylinux:8.9
%post
dnf -y install https://yum.osc.edu/ondemand/latest/compute/el8/aarch64/python3-websockify-0.10.0-1.el8.noarch.rpm
dnf -y install https://yum.osc.edu/ondemand/latest/compute/el8/aarch64/turbovnc-2.2.5-1.el8.aarch64.rpm
dnf -y install epel-release
dnf -y group install Xfce
dnf -y install dbus-x11 python3-numpy
#
dnf clean all
コンテナイメージを作成して、共有ファイルシステムに保存します。
singularity build --fakeroot rokko.sif rokko.def
sudo mv rokko.sif /opt/parallelcluster/shared/
クラスタの設定
Open OnDemandで用いるクラスタの設定を行います。クラスタの名前を「rokkosan」とします。
sudo mkdir -p /etc/ood/config/clusters.d
/etc/ood/config/clusters.d/rokkosan.yml
を下記のように作成します。hostにはヘッドノードのドメイン名を設定してください。
---
v2:
metadata:
title: "Rokkosan"
login:
host: "ec2-XXX.ap-northeast-1.compute.amazonaws.com"
job:
adapter: "slurm"
bin: "/opt/slurm/bin/"
batch_connect:
vnc:
script_wrapper: |
export PATH="/opt/TurboVNC/bin:$PATH"
export WEBSOCKIFY_CMD="/usr/bin/websockify"
%s
リモートデスクトップのWebフォームの設定ファイル/var/www/ood/apps/sys/bc_desktop/form.yml
を下記のように編集します。
---
attributes:
bc_vnc_idle: 0
bc_vnc_resolution:
required: true
bc_num_slots: 1
desktop: "xfce"
cluster: "rokkosan"
form:
- bc_num_hours
- bc_vnc_idle
- bc_vnc_resolution
- bc_num_slots
- desktop
- cluster
リモートデスクトップの起動スクリプト/var/www/ood/apps/sys/bc_desktop/submit.yml.erb
を下記のように編集します。
---
batch_connect:
template: vnc
websockify_cmd: '/usr/bin/websockify'
script_wrapper: |
cat << "CTRSCRIPT" > container.sh
export PATH="$PATH:/opt/TurboVNC/bin"
%s
CTRSCRIPT
singularity run /opt/parallelcluster/shared/rokko.sif bash ./container.sh
以上で設定は完了です。Webフォームの変更を反映させるため、ナビゲーションバーからRestart Web Serverをクリックください。
リモートデスクトップの起動
ナビゲーションバーのInteractive Apps
のDesktop
をクリックします。
下記の画面が表示されるので、Launchをクリックすると、リモートデスクトップが起動します。
補足
2つ上の図に「>_queue-1-st-queue-1-cr-1-1」というリンクがあります。このリンクをクリックすると、該当のノードにSSHログインを行えるのですが、SSHログインは許可されたノードとのみ可能になっています。その許可を行う方法を説明します。
ノード名をsinfo
コマンドで調べます。ノード名はAWS ParallelClusterの設定によって異なる可能性があります。
sinfo
PARTITION AVAIL TIMELIMIT NODES STATE NODELIST
queue-1* up infinite 4 idle~ queue-1-dy-queue-1-cr-1-[1-4]
queue-1* up infinite 1 mix queue-1-st-queue-1-cr-1-1
上記のノード名をSSHを許可するノードとして/etc/ood/config/apps/shell/env
に記載します。
OOD_SSHHOST_ALLOWLIST="queue-1-st-queue-1-cr-1-1:queue-1-dy-queue-1-cr-1-[1-4]"
-
Deploy Open OnDemand on AWSに、AWS CloudFormationのテンプレートを利用した本記事よりも簡単な方法が説明されていますが、なぜか正常に動作しませんでした。 ↩
-
2023年12月19日にリリースされたAWS ParallelCluster 3.8.0からRocky Linux 8に対応しました。また、2024年2月20日にリリースされたOpen OnDemand 3.1.0からarm64アーキテクチャに対応しました。 ↩
-
S3で指定することもできます。 ↩
-
共有ファイルシステムの場所は
sudo exportfs
コマンドでわかります。 ↩