EC2 1 台で複数ユーザーが利用可能な Web IDE 環境を code-server で実現できるのか試してみた

EC2 1 台で複数ユーザーが利用可能な Web IDE 環境を code-server で実現できるのか試してみた

Clock Icon2025.03.14

はじめに

ハンズオントレーニングや講義で参加者全員に同じ実行環境を提供したいケースがあります。しかし、個別にサーバーを用意するとコストがかかり、参加者の PC を利用すると環境に依存すると様々なトラブルが発生します。

以前の記事「EC2 1 台で複数ユーザーが利用可能な Web IDE 環境を code-server で実現できるのか調べてみた」では、code-server が公式にマルチユーザー環境を推奨していないことを確認しました。非推奨ではあるもののマルチユーザー環境として利用することは技術的に可能なのか試してみました。

本記事では、1 台の EC2 インスタンスで複数ユーザーが code-server を利用して Web IDE 環境を利用可能な構築方法を紹介します。

マルチユーザー環境の構成図

結論

code-server でマルチユーザー環境を構築するには以下の設定が必要でした。

  • 各ユーザー専用の設定ファイルを作成する
    • ユーザーごとに異なるポート番号を割り当てる
  • systemd を使って各ユーザーのサービスを個別に管理する

これらの条件を満たすことで、1 台の EC2 インスタンス上で複数ユーザーが code-server を利用できました。

マルチユーザー環境の構築方法

1. 前提条件

  • Ubuntu 24.04 LTS の EC2 インスタンス
  • インスタンスタイプはt3.microだとメモリ不足になるためt3.medium以上を推奨
  • 必要なポート範囲(今回は 50443-50462)が開放されたセキュリティグループ

セキュリティグループの設定

2. 自動セットアップスクリプト

以下のスクリプトを使用すると、20 人分のユーザーアカウントと code-server 環境を自動的に構築できます。

setup-code-server.sh
#!/bin/bash
set -e  # エラー時に実行を停止

# 必要なパッケージのインストール
sudo apt update
sudo apt install -y pwgen jq curl

# GitHubのAPIを使用して最新バージョンを取得
CODER_VERSION=$(curl -s https://api.github.com/repos/coder/code-server/releases/latest | jq -r .tag_name | sed 's/v//')

# ダウンロードURLを組み立て
DOWNLOAD_URL="https://github.com/coder/code-server/releases/download/v${CODER_VERSION}/code-server_${CODER_VERSION}_amd64.deb"

# ダウンロード&インストール
if [ ! -f "/usr/bin/code-server" ]; then
    echo "code-server ${CODER_VERSION} をダウンロードしています..."
    curl -fOL ${DOWNLOAD_URL}
    apt install -y ./code-server_${CODER_VERSION}_amd64.deb
    rm -f code-server_${CODER_VERSION}_amd64.deb
else
    echo "code-server はすでにインストールされています"
fi

# ベースポート番号(50443から開始)
BASE_PORT=50443

# ユーザーログイン情報出力ファイル
CSV_FILE="/home/ubuntu/code-server-users.csv"

# CSV ヘッダーを作成
echo "username,user_password,access_url,code_server_password" > $CSV_FILE

# EC2 のパブリック IPv4 アドレスの取得
SERVER_IP=$(curl -s -4 ifconfig.me || hostname -I | awk '{print $1}')

# ユーザーごとの設定
for i in $(seq 1 20); do
    USERNAME="guest-$i"
    USER_HOME="/home/$USERNAME"
    PORT=$((BASE_PORT + i - 1))

    # ユーザーが存在しない場合は作成
    if ! id -u "$USERNAME" &>/dev/null; then
        echo "ユーザー $USERNAME を作成しています..."
        useradd -m -s /bin/bash "$USERNAME"
        USER_PASSWORD=$(pwgen -s -n -c 16 1)
        echo "$USERNAME:$USER_PASSWORD" | chpasswd
    else
        echo "ユーザー $USERNAME はすでに存在します"
    fi

    # code-server の設定ディレクトリを作成
    mkdir -p "$USER_HOME/.config/code-server/"

    # code-serve 用パスワードを生成
    CS_PASSWORD=$(pwgen -s -n -c 32 1)

    # 設定ファイルを作成
    cat > "$USER_HOME/.config/code-server/config.yaml" << EOF
bind-addr: 0.0.0.0:$PORT
auth: password
password: $CS_PASSWORD
cert: true
EOF

    # 所有権を設定
    chown -R "$USERNAME:$USERNAME" "$USER_HOME/.config"

    # systemd サービスファイルを作成
    cat > "/etc/systemd/system/code-server@$USERNAME.service" << EOF
[Unit]
Description=code-server for $USERNAME
After=network.target

[Service]
Type=simple
User=$USERNAME
ExecStart=/usr/bin/code-server
Restart=always
WorkingDirectory=$USER_HOME

[Install]
WantedBy=multi-user.target
EOF

    # サービスを有効化して開始
    systemctl daemon-reload
    systemctl enable --now "code-server@$USERNAME"

    # アクセスURLを作成
    ACCESS_URL="https://$SERVER_IP:$PORT"

    # CSVファイルに情報を追加
    echo "$USERNAME,$USER_PASSWORD,$ACCESS_URL,$CS_PASSWORD" >> $CSV_FILE
done

# 権限設定
chown ubuntu:ubuntu $CSV_FILE
chmod 600 $CSV_FILE

# サマリーを表示
echo "--- 実行結果 ---"
echo "各ユーザーのアクセス情報は以下のファイルに保存されています。"
echo "$CSV_FILE"

3. スクリプトの実行手順

EC2 インスタンスにセッションマネージャーか SSH 接続しますし、スクリプトを実行します。

sudo chmod +x setup-code-server.sh
sudo ./setup-code-server.sh

実行が完了すると、/home/ubuntu/code-server-users.csv にアクセス情報が保存されます。

4. アクセス情報の確認

スクリプト実行後、以下のような CSV ファイルが生成されます。

code-server-users.csv
username,user_password,access_url,code_server_password
guest-1,mPvVI48GxQA7yFLk,https://203.0.113.1:50443,cxMThkySkyHjLk6w5dVX4yxKBWbUM57J
guest-2,jdDiOIIwnICTy3b2,https://203.0.113.1:50444,KXmImwIy5cl98byq7FJp1urP2jLwxiY8
guest-3,ai5RSr9vu4gCyzr9,https://203.0.113.1:50445,pDixH2RyNqtNKPqxStMQFXizxURNlROW
...

この CSV ファイルには以下の情報が保存されています。今回必要になるのは 3、4 番の code-server 用のアクセス情報です。

  1. ユーザー名
  2. パスワード
  3. code-server アクセス URL(ポート番号付き)
  4. code-server ログイン用パスワード

動作検証

複数ユーザーの同時接続

3 人のユーザーが同時に code-server にアクセスした状態にしました。

3ユーザー同時接続の様子

各ユーザーは独立した code-server にアクセスでき、他のユーザーの作業に影響を与えることなく各ユーザーのホームディレクトリにログインできました。

システムリソースの確認

htop コマンドで 3 ユーザー接続時のシステムリソース使用状況を確認しました。

htopの実行結果

各ユーザーの code-server プロセスが独立して動作していることが確認できます。アクティブなユーザー1 人につきメモリは 300MB 程度消費しています。ログインユーザー数が増えるとメモリ使用量も増えるため、インスタンスのサイズ選定に注意が必要ですね。

アクティブユーザーの確認

code-server にログインしているユーザーは、標準的な who コマンドでは確認できません。

$ who
ssm-user pts/1        2025-03-13 23:30

アクティブな code-server セッションを確認するにはプロセス一覧から確認する方法が有効でした。

$ ps aux | grep extensionHost | grep -v grep
guest-1    20174  3.4  2.4 32788644 96852 ?      Sl   00:17   0:14 /usr/lib/code-server/lib/node --dns-result-order=ipv4first /usr/lib/code-server/lib/vscode/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false
guest-2    23919 27.7  2.8 32819596 111944 ?     Sl   00:24   0:02 /usr/lib/code-server/lib/node --dns-result-order=ipv4first /usr/lib/code-server/lib/vscode/out/bootstrap-fork --type=extensionHost --transformURIs --useHostProxy=false

上記の例では、guest-1 と guest-2 のユーザーが code-server を使用していることがわかります。

注意点と制限事項

非推奨である点

code-server の公式ドキュメントでは、マルチテナント環境は推奨されていません。本記事の方法は技術的には可能でしたが推奨されていないことをご認識ください。

"Is multi-tenancy possible?"
If you want to run multiple code-servers on shared infrastructure, we recommend using virtual machines (provide one VM per user).
https://coder.com/docs/code-server/FAQ#is-multi-tenancy-possible

リソース制限

ユーザー数が増えるとシステムリソース(CPU、メモリ)の消費量も増加します。特にメモリ使用量には注意が必要です。目安として 1 ユーザーあたり最低でも約 300MB のメモリを消費していました。

SSL証明書の警告

自己署名証明書を使用しているため、ブラウザでアクセス時に警告が表示されます。

まとめ

code-server は公式にはマルチテナント環境を推奨していません。技術的には 1 台の EC2 インスタンスで複数ユーザーが利用できる環境構築は可能でした。

おわりに

Linux/Unix 初学者向けのハンズオントレーニングに利用しやすくかつ、管理が大変ではない Web IDE 環境を探しています。次は Open OnDemand の実用性を検証する予定です。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.