GPU なしの Ubuntu 24.04 に Amazon DCV でリモートデスクトップ環境を作る手順

GPU なしの Ubuntu 24.04 に Amazon DCV でリモートデスクトップ環境を作る手順

GPU なしの EC2 インスタンスに Amazon DCV を導入し、リモートデスクトップとして使えるようにする手順を紹介します。Ubuntu 24.04 と Amazon DCV 2025.0 の最新版で動作検証済みです。
2026.09.26

はじめに

GPU なしの Amazon EC2 に Amazon DCV を導入し、リモートデスクトップとして使えるようにします。Amazon DCV は、リモートのデスクトップやアプリケーションの画面を配信するリモートディスプレイプロトコルです。Amazon EC2 上で使う場合はライセンスサーバーが不要で追加のライセンス料もかかりません。

次の記事の Ubuntu 22.04 と NICE DCV 2023.1 の組み合わせのユーザーデータをベースにしています。これを 24.04 と Amazon DCV 2025.0 用に移植、検証しました。主に研究者向けにデスクトップ環境が必要になった方が、手順どおりに進めれば使い始められる形にしました。

https://dev.classmethod.jp/articles/building-ubuntu-instance-with-nice-dcv-server-setup-using-aws-cdk/

検証環境

前提条件

VPC とサブネットは作成済みのものを使います。この記事で扱うのは Amazon DCV のセットアップと接続です。

インスタンスはインターネットへ出られるサブネットで起動してください。

手元の端末には次の 3 つを用意します。aws ssm start-session の実行には Session Manager プラグインが必要です。デスクトップの表示には Amazon DCV のクライアント(DCV Viewer)を使います。

  • AWS CLI
  • Session Manager プラグイン
  • DCV Viewer

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

https://docs.aws.amazon.com/ja_jp/dcv/latest/userguide/client.html

検証環境情報

項目 値
リージョン ap-northeast-1
OS Ubuntu 24.04.5 LTS
インスタンスタイプ m7i.xlarge
ルートボリューム gp3 50 GiB
Amazon DCV サーバー 2025.0(r20103)
接続元 macOS
AWS CLI 2.37.3
Session Manager プラグイン 1.2.835.0
DCV Viewer 2025.0(r8846)
確認日 2026/09/25

設定の流れ

設定が終わったら手元の DCV Viewer から接続します。

# 実施内容 AWS の設定画面
1 EC2 用の IAM ロールを作成する IAM のロール
2 ユーザーデータを指定して EC2 インスタンスを起動する Amazon EC2 のインスタンス起動画面
3 OS ユーザーのパスワードを設定する Systems Manager の Session Manager

EC2 用の IAM ロールを作成する

EC2 インスタンスにアタッチする IAM ロールを作ります。必要な権限は 2 つです。

  • AmazonSSMManagedInstanceCore: Session Manager で接続するため
  • S3 の読み取り権限: Amazon DCV がライセンスを取得するため

コンソール上部の検索ボックスから IAM を開きます。信頼されたエンティティに EC2 を選び、許可ポリシーで AmazonSSMManagedInstanceCore をアタッチしてロールを作成します。

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/setup-instance-permissions.html

残る S3 の読み取り権限はインラインポリシーで足します。Amazon DCV サーバーは Amazon EC2 上で動いていることを自動で検知します。ライセンスの有無は S3 バケットへ定期的に確認しに行きます。公式ドキュメントはこの S3 オブジェクトへの読み取り権限をインスタンスの要件として挙げています。

作成したロールの「許可」タブで「許可を追加」から「インラインポリシーを作成」を選びます。

ロールの「許可」タブで「許可を追加」から「インラインポリシーを作成」を選ぶ画面

ポリシーエディタを JSON へ切り替えて次のポリシーを貼り付けます。ここを間違えるとライセンスを取得できません。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dcv-license.ap-northeast-1/*"
        }
    ]
}

別のリージョンで作る場合は、バケット名のリージョン部分を置き換えてください。貼り付けると次の状態になります。

ポリシーエディタを JSON に切り替えてポリシーを貼り付けた画面

「次へ」で進み、ポリシー名を入力して「ポリシーの作成」を選びます。画面ではポリシー名を dcv-license-access にしています。

「確認して作成」でポリシー名を入力する画面

ユーザーデータを指定して EC2 インスタンスを起動する

コンソール上部の検索ボックスから EC2 を開き、インスタンスの起動画面へ進みます。指定するのは次の項目です。

  • AMI: Ubuntu Server 24.04 LTS(amd64)
  • インスタンスタイプ: お好みで
  • キーペア: お好みで
  • セキュリティグループ: インバウンドルールを削除する
  • ストレージ: gp3 50 GiB
  • IAM インスタンスプロファイル: 先ほどポリシーを追加した IAM ロール
  • ユーザーデータ: 次のスクリプト

IAM インスタンスプロファイルとユーザーデータは「高度な詳細」を展開すると現れますので注意してください。

ルートボリュームは既定の 8 GiB から拡張してください。DCV 導入が終わった時点の使用量は df の表示で 48G 中 6.4G でした。既定の 8 GiB では枯渇して失敗します。今回は 50 GiB を指定しました。

ユーザーデータに次のスクリプトを貼り付けます。スクリプトは 3 つの部分に分かれています。

  • デスクトップ環境(ubuntu-desktop、GDM3)と X サーバーを入れる
  • Amazon DCV サーバーと Web ブラウザクライアント用のパッケージをインストールする
  • 自動コンソールセッションを有効にして dcvserver を起動する
#!/bin/bash
#
# 実行ログは /var/log/cloud-init-output.log に出るので何か不都合でたときに確認
#
set -x
export DEBIAN_FRONTEND=noninteractive

DCV_VERSION="2025.0-20103"
DCV_ARCHIVE="nice-dcv-${DCV_VERSION}-ubuntu2404-x86_64"
DCV_BASE_URL="https://d1uj6qtbmh3dt5.cloudfront.net"

# =============================================================================
# Linux Amazon DCV サーバーの前提条件
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-prereq.html
# =============================================================================

## デスクトップ環境とデスクトップマネージャーをインストールする
if [ -f /etc/needrestart/needrestart.conf ]; then
    sudo sed -i "s/#\$nrconf{restart} = 'i';/\$nrconf{restart} = 'l';/g" /etc/needrestart/needrestart.conf
    sudo sed -i "s/#\$nrconf{kernelhints} = -1;/\$nrconf{kernelhints} = -1;/g" /etc/needrestart/needrestart.conf
    ### 確認コマンド: 2 行ともコメントアウトが外れていること
    grep -nE 'nrconf\{(restart|kernelhints)\}' /etc/needrestart/needrestart.conf
fi

### デスクトップ環境とデスクトップマネージャーをインストールする
sudo DEBIAN_FRONTEND=noninteractive apt update
sudo DEBIAN_FRONTEND=noninteractive apt install -y ubuntu-desktop
sudo DEBIAN_FRONTEND=noninteractive apt install -y gdm3

### GDM3 を起動する(GDM3 がアクティブでない場合があるため)
sudo systemctl start gdm3

### GDM3 をデフォルトのデスクトップマネージャーに設定する
sudo dpkg-reconfigure -f noninteractive gdm3

### 確認コマンド: /usr/sbin/gdm3 が返ること
cat /etc/X11/default-display-manager

### ソフトウェアパッケージをアップグレードする
sudo DEBIAN_FRONTEND=noninteractive apt upgrade -y

## Wayland プロトコルを無効にする
### Amazon DCV は Wayland に対応しないため、GDM 利用時は無効化が必須
### コメント行の有無に関わらず WaylandEnable=false を確実に置く
if grep -q '^#WaylandEnable=false' /etc/gdm3/custom.conf; then
    sudo sed -i 's/^#WaylandEnable=false/WaylandEnable=false/' /etc/gdm3/custom.conf
elif ! grep -q '^WaylandEnable=false' /etc/gdm3/custom.conf; then
    sudo sed -i '/^\[daemon\]/a WaylandEnable=false' /etc/gdm3/custom.conf
fi

### 確認コマンド: WaylandEnable=false がコメントアウトされずに存在すること
grep -n 'WaylandEnable' /etc/gdm3/custom.conf

### GDM サービスを再起動する
sudo systemctl restart gdm3

## X サーバーを設定する
### コンソールセッションを使うため X サーバーが必要
### (仮想セッションのみを使う構成なら、このセクションと XDummy は不要になる)
sudo systemctl set-default graphical.target
sudo systemctl isolate graphical.target

### 確認コマンド: 出力があること(X サーバーが実行中であること)
ps aux | grep X | grep -v grep

## glxinfo ユーティリティをインストールする
sudo DEBIAN_FRONTEND=noninteractive apt install -y mesa-utils

## グラフィックスインスタンス用の GPU ドライバーをインストールする
### ※ GPU インスタンスの場合のみ。CPU インスタンスでは Mesa による
###    ソフトウェアレンダリングのみがサポートされる

## GPU 以外のインスタンスに XDummy ドライバーをインストールする
sudo DEBIAN_FRONTEND=noninteractive apt install -y xserver-xorg-video-dummy

### xorg.conf で XDummy を設定する
sudo bash -c 'cat > /etc/X11/xorg.conf' << 'EOF'
Section "Device"
    Identifier "DummyDevice"
    Driver "dummy"
    Option "UseEDID" "false"
    VideoRam 512000
EndSection

Section "Monitor"
    Identifier "DummyMonitor"
    HorizSync   5.0 - 1000.0
    VertRefresh 5.0 - 200.0
    Option "ReducedBlanking"
EndSection

Section "Screen"
    Identifier "DummyScreen"
    Device "DummyDevice"
    Monitor "DummyMonitor"
    DefaultDepth 24
    SubSection "Display"
        Viewport 0 0
        Depth 24
        Virtual 4096 2160
    EndSubSection
EndSection
EOF

### X サーバーを再起動して、変更を有効にする
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target

# =============================================================================
# Linux に Amazon DCV サーバーをインストールする
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-server.html
# =============================================================================

## 作業ディレクトリを作成して移動する
mkdir -p /home/ubuntu/dcv && cd /home/ubuntu/dcv

## GPG キーをインポートする
### Ubuntu は rpm --import ではなく wget + gpg --import
### なおこの鍵はユーザーキーリングに入るだけで、ローカルファイル指定の
### apt install では署名検証に使われない
wget "${DCV_BASE_URL}/NICE-GPG-KEY"
gpg --import NICE-GPG-KEY

## Amazon DCV パッケージをダウンロードする
### 例: https://d1uj6qtbmh3dt5.cloudfront.net/2025.0/Servers/nice-dcv-2025.0-20103-ubuntu2404-x86_64.tgz
wget "${DCV_BASE_URL}/${DCV_VERSION%%-*}/Servers/${DCV_ARCHIVE}.tgz"

## .tgz アーカイブを展開し、展開されたディレクトリに移動する
tar -xvzf "${DCV_ARCHIVE}.tgz" && cd "${DCV_ARCHIVE}"

## Amazon DCV サーバーをインストールする
### nice-dcv-server_2025.0.20103-1_amd64.ubuntu2404.deb
sudo DEBIAN_FRONTEND=noninteractive apt install -y ./nice-dcv-server_*_amd64.ubuntu2404.deb

## Web ブラウザクライアント用のパッケージをインストールする
### nice-dcv-web-viewer_2025.0.20103-1_amd64.ubuntu2404.deb
### クライアント側のインストールは不要。サーバー側にこれを入れる
sudo DEBIAN_FRONTEND=noninteractive apt install -y ./nice-dcv-web-viewer_*_amd64.ubuntu2404.deb

## dcv ユーザーを video グループに追加する
### 公式手順ではサーバー → web-viewer の後、nice-xdcv の前に置かれている
sudo usermod -aG video dcv

## 仮想セッションを使う場合は nice-xdcv を入れる
### 今回はコンソールセッション構成のため導入しない
# sudo DEBIAN_FRONTEND=noninteractive apt install -y ./nice-xdcv_*_amd64.ubuntu2404.deb

## GPU 共有を使う場合は nice-dcv-gl を入れる
### CPU インスタンスでは不要
# sudo DEBIAN_FRONTEND=noninteractive apt install -y ./nice-dcv-gl_*_amd64.ubuntu2404.deb

## ホームディレクトリに戻り、ダウンロードした .tgz アーカイブを削除する
cd /home/ubuntu
sudo rm -f "dcv/${DCV_ARCHIVE}.tgz"

# =============================================================================
# インストール後のチェック
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-linux-checks.html
# =============================================================================

## X サーバーがアクセス可能であることを確認する
### X サーバーを再起動する
sudo systemctl isolate multi-user.target
sudo systemctl isolate graphical.target

### isolate の直後は Xorg がまだ起動しておらず、-auth 付きのプロセスが見つからない
### 確認コマンドが空振りしないよう、プロセスが現れるまで最大 60 秒待つ
for i in $(seq 1 30); do
    ps aux | grep "X.*\-auth" | grep -v Xdcv | grep -v grep > /dev/null && break
    sleep 2
done

### 確認コマンド: "SI:localuser:dcv" が返ること
### 公式の現行版は Xdcv プロセスを拾わないよう grep -v Xdcv を挟む
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v Xdcv | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$"

### 同コマンドを 2 回実行しなければ "SI:localuser:dcv" が返らない場合がある
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v Xdcv | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') xhost | grep "SI:localuser:dcv$"

## GPU なしのため OpenGL がソフトウェアレンダリングで使えることを確認する
sudo DISPLAY=:0 XAUTHORITY=$(ps aux | grep "X.*\-auth" | grep -v Xdcv | grep -v grep | sed -n 's/.*-auth \([^ ]\+\).*/\1/p') glxinfo | grep -i "opengl.*version"

# =============================================================================
# Amazon DCV サーバーが自動的に起動するように設定する
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/manage-start.html
# =============================================================================
sudo systemctl enable dcvserver

# =============================================================================
# 自動コンソールセッションの有効化
# @see: https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html#managing-sessions-start-auto
# =============================================================================

## [session-management] の create-session を有効にする
### コメント行があれば外し、無ければセクションへ追記する
### (セクションごと無ければ末尾に作る)
if grep -q '^#create-session' /etc/dcv/dcv.conf; then
    sudo sed -i 's/^#create-session.*/create-session = true/' /etc/dcv/dcv.conf
elif ! grep -q '^create-session' /etc/dcv/dcv.conf; then
    if grep -q '^\[session-management\]' /etc/dcv/dcv.conf; then
        sudo sed -i '/^\[session-management\]/a create-session = true' /etc/dcv/dcv.conf
    else
        printf '\n[session-management]\ncreate-session = true\n' | sudo tee -a /etc/dcv/dcv.conf
    fi
fi

## [session-management/automatic-console-session] の owner を ubuntu にする
### 所有者を ubuntu にしないと、コンソールセッションの所有者が root になる
if grep -q '^#owner' /etc/dcv/dcv.conf; then
    sudo sed -i 's/^#owner.*/owner = "ubuntu"/' /etc/dcv/dcv.conf
elif ! grep -q '^owner' /etc/dcv/dcv.conf; then
    if grep -q '^\[session-management/automatic-console-session\]' /etc/dcv/dcv.conf; then
        sudo sed -i '/^\[session-management\/automatic-console-session\]/a owner = "ubuntu"' /etc/dcv/dcv.conf
    else
        printf '\n[session-management/automatic-console-session]\nowner = "ubuntu"\n' | sudo tee -a /etc/dcv/dcv.conf
    fi
fi

### 確認コマンド: create-session と owner がコメントアウトされずに存在すること
### ここが空振りすると自動コンソールセッションが作られない
grep -nE '^\[|^create-session|^owner' /etc/dcv/dcv.conf

## Amazon DCV サービスを再起動する
sudo systemctl restart dcvserver

## 確認コマンド: 'console' セッションが作成されていること
### 起動直後は一覧に出ないことがある。空振りしたら数十秒後に再実行する
sleep 5
sudo dcv list-sessions

インスタンスを起動すると cloud-init がこのスクリプトを実行します。完了まで約 5 分かかりました。

OS ユーザーのパスワードを設定する

Amazon DCV の既定の認証方式は OS のユーザー認証(PAM)に委ねる system です。Ubuntu 公式 AMI の ubuntu はパスワードが未設定のため、このままではサインインできません。

コンソール上部の検索ボックスから Systems Manager を開きます。左のナビゲーションペインの Session Manager からインスタンスへ接続します。ターミナルで接続する場合は次のコマンドです。インスタンス ID は先ほど起動したインスタンスのものです。

aws ssm start-session --target <インスタンスID> --region ap-northeast-1

接続したら、まずユーザーデータが最後まで通ったことを確認します。status: done と console のセッションが返れば準備完了です。

cloud-init status
sudo dcv list-sessions
実行結果
status: done
Session: 'console' (owner:ubuntu type:console)

status: running のままなら完了まで待ちます。console のセッションが出ない場合は /var/log/cloud-init-output.log を確認します。

確認できたらパスワードを設定します。

sudo passwd ubuntu

Ubuntu のデスクトップへ NICE Viewer で接続する

ポートフォワーディングを開始する

手元のターミナルで次のコマンドを実行します。ローカルの 8443 番をインスタンスの 8443 番へ転送します。

aws ssm start-session --target <インスタンスID> \
  --document-name AWS-StartPortForwardingSession \
  --parameters '{"portNumber":["8443"],"localPortNumber":["8443"]}' \
  --region ap-northeast-1

Waiting for connections... が出れば準備完了です。このターミナルは接続中ずっと開いたままにします。

実行結果
Starting session with SessionId: <セッションID>
Port 8443 opened for sessionId <セッションID>.
Waiting for connections...

DCV Viewer で EC2 のデスクトップ画面へ接続する

DCV Viewer を起動し、接続先に localhost:8443#console を入力して Connect を押します。接続先は ホスト:ポート#セッション ID の形式です。自動コンソールセッションのセッション ID は常に console になります。

DCV Viewer の接続先入力画面

Amazon DCV の認証画面が出たら、ユーザー名 ubuntu と設定したパスワードを入力し、Login を押します。

Amazon DCV の認証画面

パスワードの入力は 2 回必要です。今回作ったのはコンソールセッションで、サーバーのデスクトップ画面をそのまま取り込みます。接続した時点で OS のログイン画面が表示されているため、そこでもう一度サインインします。

認証を通ると、ユーザーデータで入れた GDM3 のログイン画面が出ます。Ubuntu を選びます。

GDM3 のログイン画面

もう一度パスワードを入力します。

GDM3 のパスワード入力画面

サインインすると Ubuntu 24.04 のデスクトップが表示されます。左側のドックから Firefox やファイルマネージャーを起動できます。

Amazon DCV で表示した Ubuntu 24.04 のデスクトップ

デスクトップの解像度は DCV Viewer のウィンドウサイズに追従します。接続直後は小さく表示されることがあるので、その場合はウィンドウを広げてください。

インスタンスを再起動するとポートフォワーディングのセッションが切れます。ポートフォワーディングのコマンドを実行し直せば接続できます。

気になって調べたこと

Amazon DCV は 2024.0 以降、QUIC(UDP 8443)が既定で有効です。今回の構成でも UDP 8443 は待ち受けていました。ポートフォワーディング経由でも QUIC を使うのかが気になりサーバーログを見てみました。

通信方式は WebSocket でした。QUIC は使われていませんでした。

おわりに

Ubuntu 24.04 と Amazon DCV 2025.0 の組み合わせは GPU なしでも動きました。接続も Session Manager のポートフォワーディング経由で通りました。研究用途のアプリケーションをサーバー側で動かしたいという相談を受けるので、動作実績と手順を残しておきたくまとめました。

Ubuntu への Amazon DCV の導入は 2021 年の記事が詳しく書いています。ただし OS と Amazon DCV のバージョンが古いです。私の場合は数年に 1 度なのですが需要があるのですよね。

https://dev.classmethod.jp/articles/nice-dcv-install-on-ec2-ubuntu/

参考

この記事をシェアする

AWSのお困り事はクラスメソッドへ

関連記事