Azure の Windows 11 マルチセッション仮想マシンで FSLogix ユーザープロファイルを使う構成を Azure CLI で作ってみた

## 背景と目的

Azure Virtual Desktop 環境に適用する前に、FSLogix ユーザープロファイル機能だけを動作検証したく、Azure CLI で検証環境を作ってみました。

## 検証用の仮想ネットワークを作る

```bash:bash
# 環境変数をセットします
region=japaneast
prefix=mnrfsl
adgroup=mnravd-group

# リソースグループを作成します
az group create \
  --name ${prefix}-rg \
  --location $region

# VNET を作成します
az network vnet create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-vnet \
  --address-prefixes 10.1.0.0/16 \
  --subnet-name default-subnet \
  --subnet-prefix 10.1.0.0/24

# NSG を作成します
az network nsg create \
  --resource-group ${prefix}-rg \
  --name ${prefix}-nsg

# NSG ルールを作成します
az network nsg rule create \
  --resource-group ${prefix}-rg \
  --name Allow-RDP \
  --nsg-name ${prefix}-nsg \
  --priority 100 \
  --source-address-prefixes $(curl -s inet-ip.info) \
  --destination-port-ranges 3389 \
  --access Allow \
  --protocol Tcp

# サブネットに NSG を紐付け Storage サービスエンドポイントを有効にします
az network vnet subnet update \
  --resource-group ${prefix}-rg \
  --vnet-name ${prefix}-vnet \
  --name default-subnet \
  --network-security-group ${prefix}-nsg \
  --service-endpoints Microsoft.Storage
```

## FSLogix プロファイルを格納するストレージアカウントを作成

```bash:bash
# ストレージアカウントを作成します
az storage account create \
  --resource-group ${prefix}-rg \
  --name ${prefix}stor \
  --kind StorageV2 \
  --sku Standard_LRS \
  --default-action Deny

# サブネットからのみアクセス可能にします
az storage account network-rule add \
  --resource-group ${prefix}-rg \
  --account-name ${prefix}stor \
  --vnet-name ${prefix}-vnet \
  --subnet default-subnet \
  --ip-address $(curl -s inet-ip.info)

# アクセスキーを取得します
storagekey=$(az storage account keys list \
  --account-name ${prefix}stor \
  --resource-group ${prefix}-rg \
  --query "[0].value" \
  --output tsv)
```

## 検証用の仮想マシンを作成

```bash:bash
# azureuser 用のパスワードを生成します
vmpasswd=$(openssl rand -base64 16)
echo $vmpasswd

# 仮想マシンを 2 つ作成します
for i in {1..2}; do
  az vm create \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --os-disk-name ${prefix}-vm${i}OSDisk \
    --image microsoftwindowsdesktop:windows-11:win11-21h2-avd:latest \
    --license-type Windows_Client \
    --size Standard_D2as_v4 \
    --storage-sku Standard_LRS \
    --admin-username azureuser \
    --admin-password $vmpasswd \
    --assign-identity \
    --vnet-name ${prefix}-vnet \
    --subnet default-subnet \
    --nsg "" \
    --public-ip-address-dns-name ${prefix}${i} \
    --zone ${i}
done

# AzureAD Join 拡張をインストールします
for i in {1..2}; do
  az vm extension set \
    --resource-group ${prefix}-rg \
    --vm-name ${prefix}-vm${i} \
    --name AADLoginForWindows \
    --publisher Microsoft.Azure.ActiveDirectory
done

# NLA を無効にします
for i in {1..2}; do
  az vm run-command invoke \
    --command-id DisableNLA \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i}
done

# セキュリティグループのユーザーに仮想マシンユーザー権限を付与します
for i in {1..2}; do
  az role assignment create \
    --assignee $(az ad group list \
    --display-name $adgroup \
    --query [0].id \
    --output tsv) \
    --role "Virtual Machine Administrator Login" \
    --scope $(az vm show \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --query id \
    --output tsv)
done
```

## FSLogix を設定

```bash:bash
# 各仮想マシンの FSLogix を有効にします
for i in {1..2}; do
  az vm run-command invoke \
    --command-id RunPowerShellScript \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --script "Set-ItemProperty -Path HKLM:\SOFTWARE\FSLogix\Profiles -Name Enabled -Type DWord -Value 1"
done

# 新しく作成される VHD サイズを 5000 メガバイトにします
for i in {1..2}; do
  az vm run-command invoke \
    --command-id RunPowerShellScript \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --script "Set-ItemProperty -Path HKLM:\SOFTWARE\FSLogix\Profiles -Name SizeInMBs -Type DWord -Value 5000"
done

# ローカルプロファイルの削除を有効にします
for i in {1..2}; do
  az vm run-command invoke \
    --command-id RunPowerShellScript \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --script "Set-ItemProperty -Path HKLM:\SOFTWARE\FSLogix\Profiles -Name DeleteLocalProfileWhenVHDShouldApply -Type DWord -Value 1"
done

# Cloud Cache 構成を設定します
for i in {1..2}; do
  az vm run-command invoke \
    --command-id RunPowerShellScript \
    --resource-group ${prefix}-rg \
    --name ${prefix}-vm${i} \
    --script "Set-ItemProperty -Path HKLM:\SOFTWARE\FSLogix\Profiles -Name CCDLocations -Type String -Value 'type=azure,connectionString=\"DefaultEndpointsProtocol=https;AccountName=mnrfslstor;AccountKey=${storagekey};EndpointSuffix=core.windows.net\"'"
done
```

## AzureAD 資格情報を使用して RDP 接続

資格情報を AzureAD\UPN の形式で入力する必要があります (例: AzureAD\john@contoso.com)

### Mac の Microsoft Remote Deesktop に仮想マシンを登録する

![fslogix-vm-storage-01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/eef523e8-c079-63bf-2297-e271f6961bd2.png)

### RDP 接続するとストレージアカウントにコンテナーが作成される

![fslogix-vm-storage-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/e82155ba-d22d-d5d8-3b8e-f517ca844752.png)

### コンテナー内に VHD が作成される

![fslogix-vm-storage-04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/0a6e17fa-84dc-336e-4454-1bc339288d4a.png)

### 仮想マシンに VHD がマウントされる

![fslogix-vm-storage-03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/5a3b1899-89d8-6b8c-4606-81af1a62813b.png)

### もう 1 つの仮想マシンにも RDP 接続できるがプロファイルがロックされているのでローカルプロファイルが作成される

左の仮想マシンはテーマを変更しており、右の仮想マシンは同じユーザーでサインインしてもテーマはデフォルトのまま。

![fslogix-vm-storage-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/a8104427-7a8d-f5f2-9a5c-1d5ff82c7b0c.png)

### 2 つの仮想マシンからサインアウトするとロックファイルが消える

![fslogix-vm-storage-06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/2c2b0d0f-8dd7-afee-a4b6-b99735f4c9b3.png)

### 先ほどローカルプロファイルが使用された仮想マシンに RDP 接続してユーザープロファイルが適用されたことを確認する

![fslogix-vm-storage-07.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/675885/fc1a23d9-3a6f-6586-7bf9-ff74e23d23c5.png)

## 検証環境を削除

```bash:bash
# リソースグループを削除します
az group delete \
  --name ${prefix}-rg \
  --yes
```

## 参考

https://learn.microsoft.com/ja-jp/fslogix/cloud-cache-configuration-reference

https://qiita.com/mnrst/items/412dac20ca6beabe7513