Amazon DCVで始めるEC2デスクトップ環境 - Amazon Linux 2023への接続と複数ユーザー管理

# はじめに
最近、Amazon DCVを使って、Linuxインスタンスにデスクトップ接続する機会があったので、そこでの試行錯誤をまとめました。
まずはAmazon DCVでAmazon Linux 2023にデスクトップ接続できることを確認して、次にデフォルトの`ec2-user`以外のユーザーで接続してみます。

なお、Amazon DCVでAmazon Linux 2023に接続できるのは、2025年4月1日に発表があった`AL2023.7`のバージョンからになります。

https://aws.amazon.com/jp/about-aws/whats-new/2025/04/general-availability-quarterly-update-amazon-linux-2023-al2023-7/

# Amazon DCVについて

## Amazon DCVとは？
https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/what-is-dcv.html

>Amazon DCV は、高性能のリモートディスプレイプロトコルです。さまざまなネットワーク条件で、リモートデスクトップやアプリケーションストリーミングをクラウドやデータセンターからあらゆるデバイスへ安全に配信できます。Amazon DCV と Amazon EC2 を使用すると、グラフィックスを多用するアプリケーションを Amazon EC2 インスタンス上でリモートで実行できます。結果をより控えめなクライアントマシンにストリーミングできるため、高価な専用ワークステーションが不要になります。

簡単に言えば、「サーバーにグラフィカルなデスクトップ環境で接続できるようにするサービス」です。EC2でLinuxサーバーを構築した場合、通常デスクトップ接続できませんが、このAmazon DCVを使うとデスクトップ環境に接続することが出来ます。

ちなみに、以前はNICE DCVという名前でしたが、2024年10月1日から、**Amazon DCV**に名前が変わりました。

https://aws.amazon.com/jp/blogs/news/nice-desktop-cloud-visualization-dcv-is-now-amazon-dcv/

## セッションについて
Amazon DCVサーバーをLinuxに構築してアクセスするわけですが、アクセスする前に**セッション**を作成する必要があります。セッションには2種類あります。
- コンソールセッション
    - セッションは同時に1つしか作成できない。つまり、1つのインスタンスに接続できるのは1人のみ
    - デフォルトで作成されるのはこちら
    - `sudo`つけないとcreateコマンドが実行できない
- 仮想セッション
    - セッションは複数作成できる
    - ただし、複数接続する場合は、コンソールセッションよりリソースを使う。つまり、より高スペックのインスタンスが必要
        - 検証でt2.smallを使ったとき、仮想セッションだとフリーズした
    - `sudo`つけなくてもcreateコマンド実行できる

今回は、コンソールセッションを利用します。

# Amazon Linux 2023にDCVで接続してみる

https://repost.aws/ja/articles/ARq0LbVvRwTRukVpS6Zt1uZw/how-do-i-install-gui-graphical-desktop-on-amazon-ec2-instances-running-amazon-linux-2023-al2023

こちらの記事通りに、以下を実行します。

- EC2インスタンスを作成（Amazon Linux 2023）
    - この時、`t2.small`以上のインスタンスタイプにする
- セキュリティグループを修正
    - 8443ポートへの接続を許可する
- GNOME Desktopをインストール
- DCV serverをインストール
- XDummy driverをインストール
    - コンソールセッション、またはGPUの共有を利用するときはこれを使う必要あり
- DCVサーバーの設定ファイル（`dcv.conf`）の修正
    - DCVサーバー起動時に、`ec2-user`のユーザーでコンソールセッションを自動で作成する設定を追加
- EC2の再起動
- `ec2-user`のパスワード設定
    - 通常、EC2では`ec2-user`でログインするとき秘密鍵を使いますが、DCVではパスワード認証のため、パスワードを設定する

上記を実行した後、`https://<EC2のIPアドレス>:8443` にアクセスすると、以下のようにDCVの認証画面が表示されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/05ada78b-cf7b-4fc6-8f5c-9e326b9c430c.png)

その後、Amazon Linux 2023の認証画面が表示されるのでその認証も実施すると、デスクトップ画面が表示されました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/c64d5fc9-fcc6-4fde-af62-5242a17ccbf2.png)

デスクトップなので、ディレクトリをウィンドウで見たり、テキストエディタで編集ができます。もちろんターミナルも開くことが出来ます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/cf189c3c-6d37-4714-a74a-c3115ee7c2bf.png)

最後に、一旦Log Outをしておきましょう。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/225ad8b7-c4f0-4b8d-ae1f-f4adfcb8bf0f.png)

以上で、`ec2-user`でAmazon Linux 2023にデスクトップ接続することが出来ました。
次は、デフォルトのユーザー以外で接続を試してみます。

# デフォルトユーザー以外で接続してみる
EC2インスタンス1台に対して複数のユーザーがアクセスする場合や、1台を1名が使うとしても複数ユーザーを作成して接続したい場合はあると思います。
それを想定して、デフォルトの`ec2-user`以外のユーザーを作成して、このEC2インスタンスに接続してみます。

前提として、今回は**1台のEC2には1人しか同時にアクセスしない**とします。複数ユーザーが同時に1台のEC2インスタンスにアクセスすることは考えません。つまり、**コンソールセッション**を利用するということです。
セッションの違いについては、[本記事のこちら](##セッションについて)をご覧ください。

## ユーザー作成&パスワード変更
以下を実施して、`user1`という名前のユーザーを作成します。
```bash
sudo adduser user1
```

作成したユーザーのパスワードを変更します。
```bash
sudo passwd user1
```

## パスワード認証を許可する
デフォルトでは、SSHではパスワード認証はできないようになっています。それを変更します。
以下を実施して、SSHサーバーの設定ファイルを開きます。
```bash
sudo vi /etc/ssh/sshd_config
```

以下の部分が元々noになっているはずなので、yesに変更します。
```bash
PasswordAuthentication yes
```

私の環境では、こんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/14ed4c93-a7c5-4330-bac4-d81995b64a0e.png)

:::note info
この設定は、DCVで接続する際には不要です。この後、新しいユーザーでDCVの接続をする際に、SSHでまず接続してからコンソールセッションを作成するために実施しています。
それも秘密鍵で接続することも可能だと思いますが、より簡単な方法で実施するために、パスワード認証でログインしようとしています。
:::

## sudoの実行を許可する
先ほどのユーザーはsudoで実行する権限を持っていないので、付与します。
以下を実行して、sudo権限周りの設定ファイルを開きます（こちらはnanoエディタで開きます）。
```bash
sudo visudo
```

以下を最後の1行として追加します。
```bash
user1    ALL=(ALL)    ALL
```

私の環境では、こんな感じになりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/6fcdbfb5-da2d-4411-ab71-5bfe6fcea0aa.png)

## 新しいユーザーSSH接続する
私はTera Termで接続していますが、先ほどのユーザー名とパスワードの認証で接続ができました（秘密鍵は使っていません）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/5988a29f-e86c-4ca1-b478-a48943c155b9.png)

## コンソールセッションの終了
現在、`ec2-user`がOwnerのコンソールセッションが作成されています。このままだと、DCVで認証できるのは`ec2-user`だけです。`user1`でコンソールセッションを作成するために、まずは既存のセッションを終了します。

現在、サーバーが起動するたびに自動で`ec2-user`がOwnerのコンソールセッションを作成するように設定されています。以下を実施することで、自動で作成されたコンソールセッション（名前は`console`）を終了します。
```
sudo dcv close-session console
```
## コンソールセッション（Owner:user1）を作成
以下を実施して、コンソールセッションを作成します。
```
sudo dcv create-session "console" --type=console --owner "user1"
```

ちなみに、セッション作成で指定できるオプションなどは以下の公式ドキュメントで確認できます。

https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html#managing-sessions-start-manual

また、現在有効なセッションは、以下のコマンドで確認できます。
```
dcv list-sessions
```

私の環境では、以下のように表示されています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/b2bc5e46-5ee9-49e8-995b-4fcfb63ea994.png)

## 新しいユーザーでDCVに接続
先ほどのDCV認証画面のページで、`user1`ユーザーでログインしてみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/273aefa9-0dd2-4f4e-b0f9-df446d4b0e04.png)

Linuxの認証を実施すると、こちらのユーザーでもログインすることが出来ました！
先ほどとユーザーが異なるので、作成したテキストファイルも存在していません。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/77fac925-57ca-44e6-b504-2366ee6a01b3.png)

ちなみに、今の`user1`のコンソールセッションが存在する状態で、`ec2-user`でDCVの認証してみようとすると、以下のような表示が出て接続されません。Ownerで指定されているユーザーのみが、DCVでログインできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/8db40315-a387-4867-bf49-6afc1094b675.png)

## (任意)セッション自動作成の無効化
今回のように、複数の別ユーザーがセッションを作成する場合は、DCVサーバー起動時に自動で`ec2-user`がOwnerのコンソールセッションが作成されてほしくありません。
そのため、以下を実行して、セッション自動作成を無効化します。

```
sudo vi /etc/dcv/dcv.conf
```

以下のように、falseに変更します。
```
create-session = false
```

私の環境では、以下のようになっています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2949357/00c1445a-51e9-4881-9a48-443bcc141286.png)

また、この`dcv.conf`で指定できるパラメータは、以下に細かく載っているので、参考にしてください。

https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/config-param-ref.html

# おわりに
今回は、Amazon DCVを使ってAmazon Linux 2023にデスクトップ接続してみました。
DCVについてはあまり使用例が多くなく、色々と手探りなところもあるので、今後も検証していきたいと思います。
最後に、よく使うセッション関連のコマンドをまとめておきます。

```bash
# コンソールセッションの作成
sudo dcv create-session "console" --type=console --owner "user1"

# セッションの終了
sudo dcv close-session console

# セッションの確認
dcv list-sessions
```