EC2のUserDataで自動インストールしたNICE DCVサーバーでAdministratorが認証されない

# 概要

EC2のUserDataで以下のコマンド実行により自動インストールしたNICE DCVサーバーでは、自動起動されるセッションのオーナーが `ContainerAdministrator` となるため `Administrator` でアクセスしようとしても認証されない。

```
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/2021.1/Servers/nice-dcv-server-x64-Release-2021.1-10557.msi ADDLOCAL=ALL AUTOMATIC_SESSION_OWNER=Administrator /quiet /norestart /l*v dcv_install_msi.log
```

以下のように `AUTOMATIC_SESSION_OWNER` を明示的に指定して自動インストールさせることで `Administrator` で認証されるようになる。

```
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/2021.1/Servers/nice-dcv-server-x64-Release-2021.1-10557.msi ADDLOCAL=ALL AUTOMATIC_SESSION_OWNER=Administrator /quiet /norestart /l*v dcv_install_msi.log
```

# 詳細

## 経緯

Windows Server 2019のEC2インスタンス作成時、CloudFormationテンプレートで以下のようなUserDataを指定して、NICE DCVの仮想ディスプレイドライバーとサーバーをインストールした。

```
<script>
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/Drivers/nice-dcv-virtual-display-x64-Release-38.msi /quiet
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/2021.1/Servers/nice-dcv-server-x64-Release-2021.1-10557.msi ADDLOCAL=ALL /quiet /norestart /l*v dcv_install_msi.log
</script>
```

またNICE DCVの動作要件に合わせて、セキュリティグループで `8443` ポートのインバウンド通信を許可し、次のようなステートメントを持つポリシーをロールにより付与している。

```
Effect: Allow
Action: s3:GetObject
Resource: !Sub arn:aws:s3:::dcv-license.${AWS::Region}*
```

CloudFormationによりデプロイされたEC2インスタンスにまずRDPで接続し、Administratorでサインインできること、DCV Serverサービスが立ち上がっていることを確認した。この後、NICE DCVクライアントでこのEC2インスタンスに接続し、Administratorでサインインしようとしたところ、以下のエラーが表示された。

```
connection authentication failed
```

## 問題の調査

NICE DCVサーバーは以下にログを出力している（「[ログファイルの使用 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/troubleshooting-logs.html)」参照）。

* Windows … `C:\ProgramData\NICE\dcv\log\server.log`
* Linux … `/var/log/dcv/server.log`

確認したところ、次のようなログが記録されていた。

```
2021-06-09 13:56:06,108929 [  2736:2812  ] WARN  frontend-handler - Cannot create connection from client 'xxx.xxx.xxx.xxx:xxxxx' to session 'console': User 'Administrator' not authorized on any channel
```

構築時に参考にしたページに次のような記述がある。

>DCV Session Management Configurationではセッションを自動/手動での作成を選択できます。セッションが無いと接続が出来ないため、今回は自動で作成しました。
>（[リモートでのゲーム開発にオススメ？EC2にNICE DCVを導入してみた | DevelopersIO](https://dev.classmethod.jp/articles/nice-dcv-install-on-ec2-windows/#toc-2)）

[自動インストールの説明](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-wininstall.html#setting-up-installing-windows-unattended)では次のように書かれており、この辺りは問題ないつもりでいた。

* 自動コンソールセッションを作成します。
* コンソールセッションの所有者を、インストールを実行するユーザーに設定します。

でもエラーメッセージと合わせて考えると、セッションがどんなふうになっているかが気になる。スタートメニューとか見ても管理画面らしきものがないなと思ってドキュメントを探したところ、NICE DCVサーバーでのセッション管理はコマンドラインのみらしい。

* [コマンドラインツールを使用した NICE DCV セッションの管理 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-cli.html)

[セッション情報を表示](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-lifecycle-view.html)してみる。

```
C:\Users\Administrator> cd "C:\Program Files\NICE\DCV\Server\bin"
C:\Program Files\NICE\DCV\Server\bin> dcv list-sessions
Session: 'console' (owner:ContainerAdministrator type:console)
```

オーナーが `ContainerAdministrator` になっている…これは `Administrator` のことなのか、それともここが間違ってるのか？

## 切り分け

既存セッションを停止し、オーナーが `Administrator` のセッションを起動して試してみることにする。まず既存の `console` [セッションの停止](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-lifecycle-stop.html)。

```
C:\Program Files\NICE\DCV\Server\bin> dcv close-session console
```

次に[新規セッションの開始](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html)。

```
C:\Program Files\NICE\DCV\Server\bin> dcv create-session --name console --owner Administrator console
```

もう一度、セッション情報を表示。

```
c:\Program Files\NICE\DCV\Server\bin>dcv list-sessions
Session: 'console' (owner:Administrator type:console name:console)
```

オーナーが `Administrator` に変わった。やはり `ContainerAdministrator` は別物らしい。

この状態でNICE DCVクライアントで接続し `Administrator` でサインインを試みたところ、今度は成功した。

## 解決策

ここまでで、以下のことが確認できている。

* オーナーが `Administrator` のセッションがないとサインインできない。
* CloudFormationのUsetDataでNICE DCVの自動インストールを指定したEC2インスタンスデプロイでは、 `ContainerAdministrator` でセッションが作成されてしまう。
* ひとまずのワークアラウンドとしては、セッションをオーナー `Administrator` で再作成すると、サインイン可能になる。

自動インストールでは、この自動起動されるセッションのオーナーをコマンドラインオプションで指定できる。

> インストールコマンドに次のオプションを追加することで、デフォルトのアクションを上書きすることができます。
> ・(略)
> ・AUTOMATIC_SESSION_OWNER=owner_name - 自動コンソールセッションの別の所有者を指定します。
> （[自動インストール - Windows での NICE DCV サーバのインストール - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-wininstall.html#setting-up-installing-windows-unattended)）

NICE DCVサーバーのインストーラーの実行行に、以下のように `AUTOMATIC_SESSION_OWNER` の指定を追加することで、問題が解消される。

```
<script>
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/Drivers/nice-dcv-virtual-display-x64-Release-38.msi /quiet
msiexec.exe /i https://d1uj6qtbmh3dt5.cloudfront.net/2021.1/Servers/nice-dcv-server-x64-Release-2021.1-10557.msi ADDLOCAL=ALL AUTOMATIC_SESSION_OWNER=Administrator /quiet /norestart /l*v dcv_install_msi.log
</script>
```

実際にこのUserDataでデプロイされたEC2インスタンスでは、そのまま `administrator` ユーザーで認証された。

# 参考

* [リモートでのゲーム開発にオススメ？EC2にNICE DCVを導入してみた | DevelopersIO](https://dev.classmethod.jp/articles/nice-dcv-install-on-ec2-windows/#toc-2)
* [自動インストール - Windows での NICE DCV サーバのインストール - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/setting-up-installing-wininstall.html#setting-up-installing-windows-unattended)
* [Windows クライアントを使用した NICE DCV セッションへの接続 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/userguide/using-connecting-win.html)
* [NICE DCV セッションの開始 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html)
* [コマンドラインツールを使用した NICE DCV セッションの管理 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-cli.html)
    * [新規セッションの開始](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-start.html)
    * [セッションの停止](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-lifecycle-stop.html)
    * [セッション情報を表示](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/managing-sessions-lifecycle-view.html)
* [ログファイルの使用 - NICE DCV](https://docs.aws.amazon.com/ja_jp/dcv/latest/adminguide/troubleshooting-logs.html)