Open OnDemand ポータルから別の EC2 へ接続してシェルアクセスをユーザーへ提供する方法を試してみた

Open OnDemand ポータルから別の EC2 へ接続してシェルアクセスをユーザーへ提供する方法を試してみた

Clock Icon2025.03.18

はじめに

Open OnDemand は主に HPC クラスタ環境へブラウザからアクセスするために利用されている Web ポータルです。本記事では、Open OnDemand のポータルを導入した EC2 インスタンスから別の EC2 へ SSH 接続して、その EC2 からユーザーへ Linux の実行環境を提供するための検証をしました。結果をもとに設定方法とやってみた感想を共有します。

実現したいこと

Open OnDemand のポータルから、別の EC2 インスタンス(Ubuntu サーバー)へのシェルアクセスを提供します。

OpenOnDemandの構成図

前回の記事で構築した環境をベースに新たな構成を追加します。

https://dev.classmethod.jp/articles/amazon-ec2-openondemand-verification-environment-setup/

必要な設定

今回の設定では以下の作業が必要になります。太字は今回新たに追加する設定です。

設定の概要

検証環境

今回の検証環境の構成です。

項目 内容
EC2インスタンス t3.micro x2
EBS(gp3) 8GB
OS Ubuntu 24.04
Open OnDemand v4.0.1
目的 OpenOnDemandサーバから別の EC2 を利用したシェルアクセスの提供

前提

セキュリティグループ

セキュリティグループの設定として、Open OnDemand サーバーからターゲットサーバーへの SSH 接続(ポート 22)を許可しておく必要があります。

EC2 間の SSH 接続

EC2 インスタンス間の SSH 接続には、公開鍵認証方式を採用しています。パスワード認証は使用しません。

OpenOnDemand-1(7).png

https://dev.classmethod.jp/articles/jw-attempt-to-connect-ssh-without-a-password-between-ec2-instances/

設定手順

1. Open OnDemandサーバーでの設定

OpenOnDemand-1(5).png

1-1. ユーザーの作成

まず、Open OnDemand サーバーにアクセスするためのユーザーを作成します。以下のスクリプトは以下の処理を行います。

  • テストユーザー「guest00」を作成
  • ランダムなパスワードを設定
  • SSH キーペアを生成
#!/bin/bash

# 必要なパッケージをインストール
if ! command -v pwgen &> /dev/null; then
    sudo apt-get update
    sudo apt-get install -y pwgen
fi

# ユーザー名を設定
USERNAME="guest00"

# ユーザーが存在するか確認
if id "$USERNAME" &>/dev/null; then
    echo "User $USERNAME already exists."
else
    # ユーザーを作成
    sudo adduser --disabled-password --gecos "" $USERNAME
    echo "User $USERNAME created."
fi

# ランダムパスワードを生成
USER_PASSWORD=$(pwgen -s -n -c 16 1)

# パスワードを設定
echo "$USERNAME:$USER_PASSWORD" | sudo chpasswd

# パスワードをファイルに保存
echo "$USERNAME,$USER_PASSWORD" > /home/ubuntu/${USERNAME}_password.txt
sudo chown ubuntu:ubuntu /home/ubuntu/${USERNAME}_password.txt
sudo chmod 600 /home/ubuntu/${USERNAME}_password.txt

# SSH鍵の生成
sudo -u $USERNAME mkdir -p /home/$USERNAME/.ssh
sudo -u $USERNAME chmod 700 /home/$USERNAME/.ssh

# 既存の鍵があれば削除
if [ -f "/home/$USERNAME/.ssh/id_rsa" ]; then
  sudo -u $USERNAME rm /home/$USERNAME/.ssh/id_rsa
fi
if [ -f "/home/$USERNAME/.ssh/id_rsa.pub" ]; then
  sudo -u $USERNAME rm /home/$USERNAME/.ssh/id_rsa.pub
fi

# SSHキーペアを生成(パスフレーズなし)
sudo -u $USERNAME ssh-keygen -t rsa -b 4096 -f /home/$USERNAME/.ssh/id_rsa -N ""

# 権限の確認と修正
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh
sudo chmod 700 /home/$USERNAME/.ssh
sudo chmod 600 /home/$USERNAME/.ssh/id_rsa
sudo chmod 644 /home/$USERNAME/.ssh/id_rsa.pub

# 結果を表示
echo "User $USERNAME has been created with password: $USER_PASSWORD"
echo "Password saved to: /home/ubuntu/${USERNAME}_password.txt"
echo "SSH key generated at: /home/$USERNAME/.ssh/id_rsa"

1-2. Linux Host Adapterの設定

シェルアクセスを提供するために必要な設定を作成します。

# 必要なディレクトリを作成
sudo mkdir -p /opt/ood/linuxhost_adapter/bin

# スクリプトを作成
sudo bash -c 'cat > /opt/ood/linuxhost_adapter/bin/submit << EOF
#!/bin/bash

# スクリプトファイルを取得
script_file=\$1
shift

# スクリプトを実行
bash \${script_file} "\$@"
EOF'

# スクリプトに実行権限を付与
sudo chmod +x /opt/ood/linuxhost_adapter/bin/submit

1-3. クラスター設定ファイルの作成

OpenOnDemand にターゲットサーバーへの接続情報を登録します。

この設定ファイルでは以下の内容を定義しています。

  • ターゲットサーバーの情報
  • 接続方法(SSH)
  • 認証方法(公開鍵認証を使用)
# クラスター設定ディレクトリの作成(既に存在する場合は不要)
sudo mkdir -p /etc/ood/config/clusters.d

# クラスター設定ファイルを作成
# ターゲットサーバーのホスト名またはIPを適切に変更してください
CLUSTER_FILE="ec2_ubuntu"
TARGET_HOST="ip-10-0-4-48.ap-northeast-1.compute.internal"

sudo bash -c "cat > /etc/ood/config/clusters.d/${CLUSTER_FILE}.yml << EOF
---
v2:
  metadata:
    title: \"EC2 Ubuntu Server\"
    url: \"https://openondemand.ohmura.classmethod.info\"
    hidden: false
  login:
    host: ${TARGET_HOST}
  job:
    adapter: \"linux_host\"
    submit_host: ${TARGET_HOST}
    ssh_hosts:
      - host: ${TARGET_HOST}
    site_timeout: 7200
    debug: true
    strict_host_checking: false
    tmux_bin: \"/usr/bin/tmux\"
    # パスワード認証を無効化し、公開鍵認証を優先
    ssh_allow_password_auth: false
  batch_connect:
    basic:
      script_wrapper: |
        export PATH=\"/opt/ood/linuxhost_adapter/bin:\\\$PATH\"
        %s
EOF"

2. ターゲットサーバーでの設定

OpenOnDemand-1(6).png

2-1. 必要なパッケージのインストール

ターゲットサーバーに必要なパッケージをインストールします。

sudo apt install -y tmux

2-2. ユーザーの作成

Open OnDemand サーバーと同じユーザー名でアカウントを作成します。

USERNAME="guest00"
sudo adduser --disabled-password --gecos "" $USERNAME

2-3. SSH設定

公開鍵認証のための設定を行います。

sudo mkdir -p /home/$USERNAME/.ssh
sudo touch /home/$USERNAME/.ssh/authorized_keys
sudo chmod 700 /home/$USERNAME/.ssh
sudo chmod 600 /home/$USERNAME/.ssh/authorized_keys
sudo chown -R $USERNAME:$USERNAME /home/$USERNAME/.ssh

Open OnDemand サーバーで生成したユーザー(guest00)の公開鍵をターゲットサーバーのauthorized_keysファイルに追加します。Open OnDemand サーバーの/home/guest00/.ssh/id_rsa.pubの内容をコピーして貼り付けます。

sudo vi /home/$USERNAME/.ssh/authorized_keys

3. Open OnDemand サーバーからの接続テスト

OpenOnDemand-1(5).png

3-1. 接続テスト

Open OnDemand サーバーからターゲットサーバーへの SSH 接続をテストします。

sudo -u guest00 ssh guest00@ip-10-0-4-48.ap-northeast-1.compute.internal

問題なく接続できれば、Open OnDemand の設定を更新します。

sudo /opt/ood/ood-portal-generator/sbin/update_ood_portal
sudo systemctl restart apache2

動作確認

Open OnDemand のダッシュボードにアクセスすると、新しく追加した EC2 Ubuntu Server が表示されます。

ダッシュボード画面

クリックするとシェルアクセスが可能になります。

シェルアクセス画面

まとめ

本記事では、Open OnDemand のポータルから別の EC2 インスタンスへ接続し、その EC2 からシェルアクセスをユーザーへ提供する設定を試してみました。

  1. Open OnDemand サーバーでのユーザー作成と SSH 鍵の生成
  2. クラスター設定ファイルの作成
  3. ターゲットサーバーでの対応するユーザー作成と SSH 設定

おわりに

今回の検証を通じてユーザーごとに公開鍵認証を設定する方法は、セキュアであるものの多数のユーザーがいる環境では管理が煩雑になることがわかりました。正確に言えばわかってはいたのですけど、やってみると思ったより大変でした。

OpenOnDemand-1(7).png

今後は SSH 接続に関してはホストベース認証にするなど効率的な方法を検討します。その前に code-server を利用できるプラグインがあるようなので次回をそちらを試してます。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.