Azure初心者がWindowsVirtualDesktop環境つくるときにはまった穴

マルチユーザの Windows Desktop をクラウドでやってみたい。しかし、Amazon Workspaces ではWindows OSが微妙に古い。勝手はわからんが Azure でやってみよか。Active Directory経験値のあるものが社内にとぼしいので、お鉢がまわってきてしまった。

## Azure なんもわからん

そもそもなんて読むんだ？　というレベル。Azure ADのアカウント追加してもらって初めてログインしたのが 2021-02-22夜。いきなり「グローバル管理者」である

## 後知恵の最短経路

直接のゴールは Windows Virtual Desktop環境を提供する WindowsVM とホストプールをつくること。
しかし、前提とするものが多い。試行ではさんざんに手戻りを繰り返したが、ここで作業手順を整理する。

1. ドメイン設計
1. 仮想ネットのSubnet分割設計
1. リソースグループ設計
1. Azure Active Directory Domain Servicesの追加
1. DNS設定
1. RDP用Azure Bastionの追加
1. ホストプールの追加

## ドメイン設計

https://docs.microsoft.com/ja-jp/azure/active-directory-domain-services/tutorial-create-instance#create-a-managed-domain

> 既定では、ディレクトリの組み込みドメイン名が使用されます ( .onmicrosoft.com サフィックス)
> .onmicrosoft.com ドメインを所有するのは Microsoft であるため、証明機関 (CA) からは証明書が発行されません。
最も一般的な方法は、…貴社が既に所有していて、なおかつルーティング可能なものを指定します。

default のままポチポチ進めていくと、あとあと困ったことになりかねない。
今回は awvd.example.com とか。 Azure Windows Virtual Desktop in xxxx

## 仮想ネットのSubnet分割設計

事前に設計しなくても AADDS(Azure Active Directory Domain Services)を作るときに、defaultで新規作成してくれるのだが、それに任せてはいけない。
ホストプールの個々のVM HostにRDPするには、Bastion（踏み台サーバ）を使うのが安全で簡便である。
Azure は仮想ネットワークごとに、マネージドのBastionを設置できる。
ただし、 `/27` 以上の専用Subnetを必要としている。
default の v-net/subnet は `10.0.0.0/24` と `10.0.0.0/24` で subnet追加余地が皆無で、後からBastionを作成出来ないのである。

https://docs.microsoft.com/ja-jp/azure/bastion/bastion-overview

https://docs.microsoft.com/ja-jp/azure/bastion/tutorial-create-host-portal#create-a-bastion-host

- サブネットの名前は「 AzureBastionSubnet 」とする必要があります。
- サブネットは、少なくとも /27 以上である必要があります。

また default では `10.0.0.0/24` だがチュートリアルでは `10.0.2.0/24` となっている。
default のままつくると、 AADDS作成後のDNSサーバの設定がうまくいかなかった。

- v-net は /22 で4倍の拡張性をもたせる。
- 10.0.0.0/22 から subnet1 10.0.2.0/24
- AzureBastionSubnet 10.0.3.224/27
- 10.0.3.0/25 だけで 128個の拡張余地あり。10.0.0-1.* も空き地。

参考: [サブネットマスク電卓](https://note.cman.jp/network/subnetmask.cgi)


## リソースグループ設計

> リソース グループは、Azure のソリューションに関連するリソースを保持するコンテナーです。
> シンプルにするため、すべての Azure AD Domain Services 関連リソースを保持する新しいリソース グループを作成しておくと、整理が容易になります。

ただし、ライフサイクルの異なるリソースは混ぜるべきではない。
リソースグループ一括削除のような機能/UI もあり、手戻りするときには便利に使った。

Domain Services と ホストプールで２つのリソースグループを使い分けることにした。

## Azure Active Directory Domain Servicesの追加

Domain Services のデプロイには時間がかかる。WindowsServer の Domain Controllerを正副建てる内部処理を考えればそれなりにかかることも理解できよう。60分以上かかった。

前述したSubnet分割の失敗などがあると、この時間のかかる処理を2回3回とやることになって心が折れる。
前任者が無償試用サブスクリプションで試しに作ろうとした AADDSがすでに存在して、それに気づかず手戻りになったこともあった。

## DNS設定

今回の作業では、AADDSのデプロイがエラー終了したあと、ワンクリックで修復する流れになった。エラー回避の方法はわかっていない。

> マネージド ドメイン サービス IP 10.0.2.4 の DNS サーバー設定を Japan East/aadds-vnet に追加します。
> 修正は、手動で、もしくは下の [修正] をクリックすることにより実行できます。

「下の修正」ボタンで、All Green にすぐなった。

Azure portal | Azure AD Domain Services | awvd.example.com | 正常性

```
Azure AD との同期    月, 01 3 2021 10:34:36 UTC に同期されました。
```

正常に設定できるとこのような表示で同期状態を確認できる

## RDP用Azure Bastionの追加

Subnet分割さえできてからは、ここははまらなかった。

ただし、コスト分析をするとちょっと驚くかも。
同時25接続想定のRDP中継能力を、マネージドで冗長化している。AADDS の最小SKUと同程度になるわけ。小規模実験で使うには「富豪」サービスだった。

## ホストプールの追加

**join domain のトラブルシューティング**

> 少なくとも 1 つのリソースのデプロイ操作に失敗しました。詳細については、デプロイ操作の一覧を表示してください。

```json
{
    "status": "Failed",
    "error": {
        "code": "VMExtensionProvisioningError",
        "message": "拡張機能 'joindomain' の処理中に VM でエラーが報告されました。エラー メッセージ: \"Exception(s) occured while joining Domain 'wvd.example.com'\"\r\n\r\nトラブルシューティングの詳細については、https://aka.ms/vmextensionwindowstroubleshoot を参照してください"
    }
}
```

こういうときに、Bastion から RDP で VMに接続できる必要がある。

https://docs.microsoft.com/ja-jp/azure/virtual-desktop/troubleshoot-vm-configuration#vms-are-not-joined-to-the-domain

Windows Virtual Desktop | ホスト プール | <pool-name> | セッション ホスト | <vm-name>

仮想マシンのコンソールに [接続]メニューがある。
接続 | Bastion | Bastion を使用する

ユーザ・パスワードには ホスト作成時に指定したローカルユーザ名のものを使う（だってまだdomainに参加できてない）

> ポップアップ ブロックが原因で新しいウィンドウを開くことができません。ポップアップを許可してから再試行してください。

ブラウザのセキュリティガードが一度ブロックするので、許可してRDPを始める

まずはコマンドプロンプトでネットワーク疎通確認

```
C:\Users\yourname>ping awvd.example.com
Pinging awvd.example.com [10.0.2.5] with 32 bytes of data:
Reply from 10.0.2.5: bytes=32 time=2ms TTL=128
...

C:\Users\yourname>nslookup awvd.example.com
Server:  ssxxxxxxxxxxdrxe.internal.cloudapp.net
Address:  10.0.2.5
Name:    awvd.example.com
Addresses:  10.0.2.4
          10.0.2.5
```

Control Panel - System - About - Rename this PC
[Change...] で手動での Domain 参加を試みる。DomainにPCを参加させる権限のあるDomain User のUPN(プリンシパル名)と、Azure AD のパスワードを入れる。
例：`yourname@example.onmicrosoft.com`

今回の作業で、ひっかかったのは、Azure portalにはサインインできる Chrome推奨のパスワードをコピーしそこなったのか、joindomain で password が違うというエラーになってしまった。
Azure portal のマイアカウントから、記号を含まないが十分強いパスワードに変更して手入力しやすくすると、join成功した。

## あとがき

「あーそーゆーことね　Azure完全に理解した」