🖥️

WorkSpaces で FSLogix を利用してプロファイル管理を構成し、東京と大阪リージョンで DR 環境を組む

に公開

はじめに

この記事では、Amazon WorkSpaces 環境で FSLogix を利用したユーザープロファイル管理を構成し、東京リージョンと大阪リージョン間で災害復旧 (DR) 環境を構築する手順を紹介します。

大阪リージョンでは Amazon WorkSpaces は 2025 年 11 月時点では提供されていないため、FSLogix と EC2 インスタンスを組み合わせて DR 環境を構築する仕組みです。WorkSpaces とは違いますが、縮退しながら継続性を高める方法です。

構成図

image-20251124131224049

FSLogix について
Windows OS 上の プロファイルを管理するソフトウェアです。ユーザープロファイルを VHDX ファイルとしてネットワーク共有 (FSx for Windows File Server) に保存し、複数の環境間でプロファイルを共有できるようにします。Cloud Cache 機能を利用することで、複数のリージョンに同時にプロファイルを書き込むことができ、災害復旧時にも別リージョンから同じプロファイルにアクセス可能です。

FSx for Windows File Server の作成

FSLogix のプロファイルを格納するために、FSx for Windows File Server を東京と大阪の両リージョンに作成します。FSLogix Cloud Cache 機能を利用することで、両リージョンのストレージに同時にプロファイルを書き込むことができます。

東京リージョンでの FSx 作成

AWS マネジメントコンソールから FSx for Windows File Server の作成画面を開きます。

image-20251123014519394

FSx for Windows File Server を選択します。

image-20251123014616322

各種パラメーターを指定していきます。

image-20251123015039037

FSx for Windows File Server の作成処理が実行されます。完了まで数分かかります。

image-20251123015114402

大阪リージョンでの FSx 作成

東京リージョンと同様の手順で、大阪リージョンにも FSx for Windows File Server を作成します。

image-20251123015243550

両リージョンで FSx for Windows File Server の作成が完了しました。

image-20251123015306822

FSx への Alias の付与

FSx for Windows File Server に対して覚えやすい Alias を設定します。これにより、FSx の DNS 名ではなく、分かりやすい名前 (例: fsx-tokyo.example.local) でアクセスできるようになります。

参考: https://iret.media/96476

FSx のコンソールから Alias の設定画面を開きます。

image-20251123102559580

Alias として fsx-tokyo.example.local を指定します。

image-20251123102800389

Alias の設定が完了しました。ただし、この時点では Active Directory 側の設定が不足しているため、まだこの Alias ではアクセスできません。次のステップで SPN と DNS レコードを追加します。

image-20251123102829219

Active Directory への SPN と DNS レコードの登録

FSx に設定した Alias を実際に使用するためには、Active Directory 側で以下の 2 つの設定が必要です

  1. SPN (Service Principal Name) の登録: Kerberos 認証を利用するために必要
  2. DNS レコードの登録: 名前解決を可能にするために必要

PowerShell を管理者として開き、Active Directory 管理用のモジュールをインストールします。

Install-WindowsFeature RSAT-AD-PowerShell

image-20251123103850341

以下のコマンドを実行して、既存の SPN (Service Principal Name) が登録されているか確認します。新たに設定した Alias に対する SPN が登録されていない場合、Kerberos 認証が機能せず、アクセスできません。

$ALIAS = "fsx-tokyo.example.local"
SetSPN /Q ("HOST/" + $ALIAS)
SetSPN /Q ("HOST/" + $ALIAS.Split(".")[0])

実行例 : 登録されていない

PS C:\Windows\system32> $ALIAS = "fsx-tokyo.example.local"
PS C:\Windows\system32> SetSPN /Q ("HOST/" + $ALIAS)
Checking domain DC=example,DC=local

No such SPN found.
PS C:\Windows\system32> SetSPN /Q ("HOST/" + $ALIAS.Split(".")[0])
Checking domain DC=example,DC=local

No such SPN found.
PS C:\Windows\system32>

以下のコマンドを実行して、Alias を登録します

$FSxDnsName = "amznfsxhlnix4p1.example.local"  #FSxのDNS名
$ALIAS = "fsx-tokyo.example.local"  #新たに設定したいAlias名
$FileSystemHost = (Resolve-DnsName $FSxDnsName | Where Type -eq 'A')[0].Name.Split(".")[0]  #ホスト名を変数として格納
$FSxAdComputer = (Get-AdComputer -Identity $FileSystemHost)  #FSxのComputerオブジェクトを取得
Set-AdComputer -Identity $FSxAdComputer -Add @{"msDS-AdditionalDnsHostname"="$Alias"}  #omputerオブジェクトに追加のDNSホスト名を設定

確認します。コンピューターオブジェクトを取得

$FSxAdComputer = (Get-AdComputer -Identity ${FileSystemHost})

SPN 一覧を確認すると、登録した fsx-tokyo.example.local の Alias が確認できました。

PS C:\Windows\system32> SetSpn /L $FSxAdComputer.Name
Registered ServicePrincipalNames for CN=amznfsxhlnix4p1,CN=Computers,DC=example,DC=local:
        MSServerClusterMgmtAPI/fsx-tokyo.example.local
        MSServerClusterMgmtAPI/FSX-TOKYO
        MSClusterVirtualServer/fsx-tokyo.example.local
        MSClusterVirtualServer/FSX-TOKYO
        HOST/fsx-tokyo.example.local
        HOST/FSX-TOKYO
        MSServerClusterMgmtAPI/amznfsxhlnix4p1.example.local
        MSServerClusterMgmtAPI/amznfsxhlnix4p1
        MSClusterVirtualServer/amznfsxhlnix4p1.example.local
        MSClusterVirtualServer/amznfsxhlnix4p1
        HOST/amznfsxhlnix4p1.example.local
        HOST/amznfsxhlnix4p1

同様に DNS レコードも登録します。DNS 用の Module を Powershell にインストールします。

Install-WindowsFeature RSAT-DNS-Server

各種変数の定義

$FSxDnsName = "amznfsxhlnix4p1.example.local"  #FSxのDNS名
$ALIAS = "fsx-tokyo.example.local"  #新たに設定したいAlias名
$AliasHost=$Alias.Split('.')[0]
$ZoneName=((Get-WmiObject Win32_ComputerSystem).Domain)
$DnsServerComputerName = (Resolve-DnsName $ZoneName -Type NS | Select-Object -First 1).NameHost

DNS Server の Computer Name が取得できている。

PS C:\Windows\system32> echo $DnsServerComputerName
ec2amaz-20fkom5.example.local

CNAME レコードの設定

Add-DnsServerResourceRecordCName -Name $AliasHost -ComputerName $DnsServerComputerName -HostNameAlias $FSxDnsName -ZoneName $ZoneName

次のレコードが登録されました。

image-20251123105851458

以下のホスト名で、無事に東京の FSx へアクセスできました。

\\fsx-tokyo.example.local

image-20251123105936342

上記の手順を繰り返して、同様に大阪も Alias を設定しました。

  • \\fsx-osaka.example.local

image-20251123110241804

[東京] WorkSpaces Directories の作成

WorkSpaces を利用するために、WorkSpaces Directories を作成します。この Directories は、Active Directory と WorkSpaces を連携させるために必要な設定です。

AWS マネジメントコンソールから WorkSpaces Directories の作成画面を開きます。

image-20251123015454589

既存の Active Directory (AD Connector または AWS Managed Microsoft AD) を選択し、WorkSpaces を配置する VPC とサブネットを指定します。

image-20251123015545188

WorkSpaces Directories の作成が完了しました。この Directories を利用して WorkSpaces を起動できます。

image-20251123015703323

[東京] WorkSpaces の作成

まずは正常に WorkSpaces にアクセスできるかを確認するための環境を作成します。

image-20251123020220548

WorkSpace の Bundle を選択します。Standard Bundle (2 vCPU、4 GB メモリ) を選択します。

image-20251123020511237

WorkSpace の基本設定を行います。WorkSpace タイプは Personal を選択し、Bundle として Standard with Windows 10 (Server 2022 based) を選択します。

image-20251123020534001

Directory とユーザーを選択します。example.local ドメインの Registered 状態の Directory を選択し、wsuser001 ユーザーを選択します。

image-20251123020816684

Customization 画面でボリュームサイズを設定します。

image-20251123020851623

WorkSpace の作成が完了しました。WorkSpaces Personal の一覧画面で、wsuser001 ユーザーの WorkSpace が Stopped 状態で表示されています。

image-20251123110607593

[東京] Workspaces に接続

WorkSpaces に接続するため、WorkSpaces Client をインストールします。

https://clients.amazonworkspaces.com/

Amazon WorkSpaces Setup Wizard が起動します。Next をクリックしてインストールを進めます。

image-20251123111402949

インストールが完了したら、Amazon WorkSpaces Client を起動します。Registration Code の入力画面が表示されます。

image-20251123111518089

Registration Code は AWS マネジメントコンソールの WorkSpaces Directories の詳細画面で確認できます。

image-20251123111620108

Registration Code を入力して Register ボタンをクリックすると、ログイン画面が表示されます。wsuser001 ユーザーの認証情報を入力します。

image-20251123112136003

WorkSpaces への接続が完了しました。

image-20251123112454141

Active Directory に FSLogix の管理テンプレートを導入

FSLogix の設定を Active Directory のグループポリシーで管理するため、管理テンプレートを導入します。

参考: https://learn.microsoft.com/ja-jp/fslogix/how-to-install-fslogix

管理テンプレートファイルの準備

FSLogix の公式サイトからダウンロードしたインストーラに含まれている、以下の 2 つのファイルを使用します:

  • fslogix.adml
  • fslogix.admx

これらのファイルを Active Directory 管理サーバーに配置します。

ダウンロードした FSLogix_25.09 フォルダ内に、fslogix.adml (言語ファイル) と fslogix.admx (ポリシー定義ファイル) が含まれています。これらのファイルを Active Directory のグループポリシー管理テンプレートフォルダに配置します。

image-20251123120206378

管理テンプレートファイルの配置

Explorer で、以下のフォルダを開きます。「PolicyDefinitions」フォルダがない場合は手動で作成します。

# 書式
\\ドメイン名\SYSVOL\ドメイン名\Policies\PolicyDefinitions

# サンプル
\\example.local\SYSVOL\example.local\Policies\PolicyDefinitions

ここに fslogix.admx ファイルを配置します。

PolicyDefinitions フォルダに fslogix.admx ファイルを配置しました。このファイルには FSLogix のグループポリシー設定項目が定義されています。

image-20251123120736372

同様に、en-US フォルダを開いて、fslogix.adml ファイルを格納します。

\\example.local\SYSVOL\example.local\Policies\PolicyDefinitions\en-US

en-US フォルダに fslogix.adml ファイルを配置しました。このファイルには FSLogix のグループポリシー設定項目の英語の表示名と説明が含まれています。

image-20251123120902050

Active Directory で、Workspaces 用の OU を作成して、そこに Group Policy を適用

まず、FSLogix のグループポリシーに関して、Workspaces 上のユーザーにしか適用させたくないので、Workspaces 用の専用の OU を作成します。(これは環境によって、良し悪しがあると思います。)

Active Directory Users and Computers を開き、example.local ドメインを右クリックして、New > Organizational Unit を選択します。

image-20251123122434602

OU の名前として MyAmazonWorkspacesOU を入力します。この OU 配下に WorkSpaces 関連のユーザーとコンピューターを配置し、FSLogix のグループポリシーを適用します。

image-20251123122532651

MyAmazonWorkspacesOU が作成されました。この OU は現在空の状態です。

image-20251123122548267

ユーザーの OU への移動

既存のユーザーを、作成した OU 配下に移動します。Users コンテナから wsuser001 ユーザーを右クリックして Move を選択します。

image-20251123122633481

移動先として MyAmazonWorkspacesOU を選択します。

image-20251123122659341

wsuser001 ユーザーが MyAmazonWorkspacesOU に移動されました。この OU に対して FSLogix のグループポリシーを適用します。

image-20251123122721006

グループポリシー管理コンソールの起動

グループポリシーを編集します。Windows の検索で gpmc.msc を実行して、Group Policy Management Console を起動します。

image-20251123122801821

新しい GPO の作成

Group Policy Management で、Group Policy Objects を右クリックして New を選択します。

image-20251123133719951

GPO の名前として WorkspacesUserFSLogixPolicy を入力します。この GPO に FSLogix の設定を追加します。

WorkspacesUserFSLogixPolicy

image-20251123133804855

WorkspacesUserFSLogixPolicy という名前の Group Policy Object が作成されました。

image-20251123134011389

GPO の OU へのリンク

作成した GPO を、Workspaces 用の OU MyAmazonWorkspacesOU に紐づけます。MyAmazonWorkspacesOU を右クリックして、Link an Existing GPO を選択します。

image-20251123134134215

example.local ドメイン内の GPO 一覧から、WorkspacesUserFSLogixPolicy を選択して OK をクリックします。

image-20251123134201482

GPO が OU に正常にリンクされました。

image-20251123134224156

GPO の編集

GPO の中身を編集します。WorkspacesUserFSLogixPolicy を右クリックして Edit を選択します。

image-20251123134527398

Group Policy Management Editor が起動します。Computer Configuration > Policies > Administrative Templates に FSLogix の設定項目が表示されています。先ほど配置した fslogix.admx ファイルが正しく読み込まれています。

image-20251123134652699

以下の設定を適用します。この設定により、東京と大阪の両リージョンに同時にプロファイルを書き込む Cloud Cache 機能が有効になります。

# VHD/VHDX ファイルの自動圧縮を有効化
FSLogix > VHD Compact Disk – Enabled

# FSLogix プロファイル使用時、ローカルプロファイルを削除
FSLogix > Profile Containers > Delete Local Profile When VHD Should Apply – Enabled

# FSLogix を有効化 (この設定がないと FSLogix は動作しません)
FSLogix > Profile Containers > Enabled – Enabled

# 動的に拡張する VHD/VHDX を使用
FSLogix > Profile Containers > Is Dynamic (VHD) – Enabled

# プロファイルのタイプを指定 (通常の Normal Profile を使用)
FSLogix > Profile Containers > Profile Type - Normal Profile

# FSLogix Cloud Cache の保存先を指定 (東京と大阪の両リージョンの FSx を指定)
# この設定により、両リージョンに同時にプロファイルが書き込まれます
FSLogix > Profile Containers > Cloud Cache > CCD Locations - type=smb,connectionString=\\fsx-tokyo.example.local\share;type=smb,connectionString=\\fsx-osaka.example.local\share

# ログオフ時にローカルキャッシュをクリア
FSLogix > Profile Containers > Cloud Cache > Clear Cache on Logoff – Enabled

# プロファイルディレクトリ名を逆順で作成
FSLogix > Profile Containers > Container and Directory Naming > Flip Flop Profile Directory Name – Enabled

# 仮想ディスクのフォーマット形式 (新しい世代の VHDX を指定)
FSLogix > Profile Containers > Container and Directory Naming > Volume Type (VHD or VHDX) - VHDX

設定を入れたあと、Group Policy Management で設定変更した箇所が見えます。Settings タブで、FSLogix の各種ポリシー設定が Enabled になっていることを確認できます。

image-20251123151743166

[東京] Workspaces で Active Directory の OU を指定

User だけではなくて、Computer も OU 配下に移動しないと、GPO が反映されません。すでに Computer が作成されている場合は、OU 配下に手動で Move します。

AWS マネジメントコンソールの WorkSpaces Directories 設定画面で、Target domain and organizational unit セクションを確認します。OU common name を OU=MyAmazonWorkspacesOU,DC=example,DC=local に設定します。WorkSpaces で新たな環境が作成された際に、自動的にこの OU 配下にコンピューターオブジェクトとして登録されます。

image-20251123154627992

[東京] FSLogix の動作確認

FSLogix のインストール

FSLogix を WorkSpace にインストールして、動作を確認します。まず、Microsoft Learn のドキュメントから FSLogix のインストール手順を確認します。

https://learn.microsoft.com/ja-jp/fslogix/how-to-install-fslogix

Microsoft Learn の「FSLogix アプリケーションをインストールする」ページが表示されます。このページから FSLogix のインストーラをダウンロードできます。

image-20251123112718601

ダウンロードした zip ファイルを展開して、Release フォルダ内の FSLogixAppsSetup.exe を実行します。このファイルが FSLogix のメインインストーラです。

image-20251123115910231

Microsoft FSLogix Apps Setup のライセンス条項画面が表示されます。"I agree to the license terms and conditions" をチェックして、Install ボタンをクリックします。

image-20251123115940539

FSLogix のインストールが完了しました。"Setup Successful" と表示されます。Close ボタンをクリックしてセットアップを終了します。

image-20251123120003441

その後、Workspaces 環境を停止して、新たに、Workspaces を接続します。WorkspacesUserFSLogixPolicy が、この WorkSpaces の Computer に有効化されている様子が確認できます。

PS C:\Windows\system32> gpresult /r

Microsoft (R) Windows (R) Operating System Group Policy Result tool v2.0
© Microsoft Corporation. All rights reserved.

Created on ‎11/‎23/‎2025 at 6:50:27 AM


RSOP data for EXAMPLE\wsuser001 on WSAMZN-4HI44ADQ : Logging Mode
------------------------------------------------------------------

OS Configuration:            Member Server
OS Version:                  10.0.20348
Site Name:                   Default-First-Site-Name
Roaming Profile:             N/A
Local Profile:               D:\Users\wsuser001
Connected over a slow link?: No


COMPUTER SETTINGS
------------------
    CN=WSAMZN-4HI44ADQ,OU=MyAmazonWorkspacesOU,DC=example,DC=local
    Last time Group Policy was applied: 11/23/2025 at 6:49:49 AM
    Group Policy was applied from:      EC2AMAZ-20FKOM5.example.local
    Group Policy slow link threshold:   500 kbps
    Domain Name:                        EXAMPLE
    Domain Type:                        Windows 2008 or later

    Applied Group Policy Objects
    -----------------------------
        WorkspacesUserFSLogixPolicy
        Default Domain Policy

    The following GPOs were not applied because they were filtered out
    -------------------------------------------------------------------
        Local Group Policy
            Filtering:  Not Applied (Empty)

    The computer is a part of the following security groups
    -------------------------------------------------------
        BUILTIN\Administrators
        Everyone
        FSLogix Profile Include List
        FSLogix ODFC Include List
        BUILTIN\Users
        NT AUTHORITY\NETWORK
        NT AUTHORITY\Authenticated Users
        This Organization
        WSAMZN-4HI44ADQ$
        Domain Computers
        Authentication authority asserted identity
        System Mandatory Level


USER SETTINGS
--------------
    CN=wsuser001,OU=MyAmazonWorkspacesOU,DC=example,DC=local
    Last time Group Policy was applied: 11/23/2025 at 6:49:50 AM
    Group Policy was applied from:      EC2AMAZ-20FKOM5.example.local
    Group Policy slow link threshold:   500 kbps
    Domain Name:                        EXAMPLE
    Domain Type:                        Windows 2008 or later

    Applied Group Policy Objects
    -----------------------------
        N/A

    The following GPOs were not applied because they were filtered out
    -------------------------------------------------------------------
        Local Group Policy
            Filtering:  Not Applied (Empty)

    The user is a part of the following security groups
    ---------------------------------------------------
        Domain Users
        Everyone
        FSLogix ODFC Include List
        FSLogix Profile Include List
        BUILTIN\Administrators
        Remote Desktop Users
        BUILTIN\Users
        NT AUTHORITY\INTERACTIVE
        CONSOLE LOGON
        NT AUTHORITY\Authenticated Users
        This Organization
        LOCAL
        Authentication authority asserted identity
        High Mandatory Level

PS C:\Windows\system32>

FSx でのプロファイル確認

実際の FSx 上にも、FSLogix 経由で Profile が作成されています。東京と大阪の両方の FSx に、wsuser001 ユーザーのプロファイル VHDX ファイル (Profile_wsuser001.VHDX) が作成されています。これは FSLogix Cloud Cache 機能により、両リージョンに同時に書き込まれたプロファイルです。各ファイルは約167MB のサイズです。

image-20251123160151402

[東京] Image の作成

FSLogix と Custom Image の制約

FSLogix をインストールして再起動すると、ユーザープロファイルが C ドライブに作成されます。しかし、WorkSpaces は D ドライブにユーザープロファイルが存在することを期待するため、FSLogix インストール済みの環境から Custom Image を作成しようとすると、ImageChecker でエラーが発生します。

この制約を回避するため、本検証では以下の方針を採用します:

  • Image 作成用の特定ユーザーの環境 (例: imagecreator001) は FSLogix をインストールしない
  • 一般ユーザーがログオンした際に、自動的に FSLogix をインストールするスクリプトを配置する

前提知識: ImageChecker によるプロファイル制約の確認

Custom Image 作成時の制約を確認するため、Amazon ImageChecker ツールを実行します。

C:\Program Files\Amazon\ImageChecker.exe

C:\Program Files\Amazon フォルダ内に、ImageChecker.exe という実行ファイルが存在します。この ImageChecker は、WorkSpaces の Custom Image を作成する前に、環境が要件を満たしているかをチェックするツールです。

image-20251123171100071

ImageChecker を実行すると、以下のエラーメッセージが確認できます。

There is more than one user profile on the WorkSpace. This might cause an error during the Create Image process.

Amazon WorkSpaces Image Checker Tool の実行結果が表示されます。"Only one user profile can exist on a WorkSpace" のチェックが FAILED となっており、"A user profile must exist" も FAILED です。これは、FSLogix をインストールすることで C:\Users にプロファイルが作成され、複数のユーザープロファイルが存在する状態になったためです。

image-20251123171139385

プロファイルの場所の問題

FSLogix をインストールすると、User Profile が C:\Users\wsuser001 に作成されます。しかし、WorkSpaces は D:\Users\wsuser001 にプロファイルが存在することを期待しています。C:\Users フォルダを確認すると、local_wsuser001、Public、wsuser001 の 3 つのフォルダが存在しており、これが ImageChecker のエラーの原因です。

image-20251123174838803

Image 作成

FSLogix 用の Image を作成していきます。まず、以下の URL からインストーラーをダウンロードします。

https://learn.microsoft.com/ja-jp/fslogix/how-to-install-fslogix

その後、以下のフォルダを作成します。

C:\FSLogixInstaller

そこに、以下のように Installer を解凍して配置します。

C:\FSLogixInstaller\FSLogix_25.09\x64\Release\FSLogixAppsSetup.exe

また、Install Script も配置します。

C:\FSLogixInstaller\Install-FSLogix.ps1

このファイルの中身です。「imagecreator001」のユーザー名の場合のみ、FSLogix のサイレントインストールをスキップしています。環境によっていろいろ書き換えてみてください。

# ========================================
# FSLogix Conditional Installation Script
# SYSTEM アカウント実行対応版
# ========================================

$LogFile = "C:\FSLogixInstaller\FSLogix_Install.log"

function Write-Log {
    param([string]$Message)
    $Timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $LogMessage = "[$Timestamp] $Message"
    Add-Content -Path $LogFile -Value $LogMessage
    Write-Host $LogMessage
}

Write-Log "=========================================="
Write-Log "FSLogix Conditional Installation Started"
Write-Log "=========================================="

# ========================================
# 1. ユーザー名チェック
# ========================================
# SYSTEM アカウントで実行される場合、実際のログインユーザーを取得
$CurrentUser = [System.Security.Principal.WindowsIdentity]::GetCurrent().Name
Write-Log "Task execution user: $CurrentUser"

# 実際にログインしているユーザーを取得
try {
    $LoggedInUser = (Get-WmiObject -Class Win32_ComputerSystem).UserName
    if ($LoggedInUser) {
        Write-Log "Logged-in user: $LoggedInUser"
        $UserToCheck = $LoggedInUser
    } else {
        Write-Log "Could not detect logged-in user. Using task execution user."
        $UserToCheck = $CurrentUser
    }
} catch {
    Write-Log "Error detecting logged-in user: $_"
    $UserToCheck = $CurrentUser
}

Write-Log "User to check: $UserToCheck"

$ExcludedUsers = @(
    "example\imagecreator001",
    "EXAMPLE\imagecreator001"
)

$IsExcluded = $false
foreach ($ExcludedUser in $ExcludedUsers) {
    if ($UserToCheck -like "*$ExcludedUser*" -or $UserToCheck -eq $ExcludedUser) {
        $IsExcluded = $true
        break
    }
}

if ($IsExcluded) {
    Write-Log "[CHECK] User '$UserToCheck' is excluded from FSLogix installation."
    Write-Log "[RESULT] Installation skipped."
    Write-Log "=========================================="
    exit 0
}

Write-Log "[CHECK] User '$UserToCheck' is not excluded. Proceeding..."

# ========================================
# 2. FSLogix インストール済みチェック
# ========================================
$FSLogixPath = "C:\Program Files\FSLogix\Apps\frx.exe"

if (Test-Path $FSLogixPath) {
    Write-Log "[CHECK] FSLogix is already installed at: $FSLogixPath"
    Write-Log "[RESULT] Installation skipped."
    Write-Log "=========================================="
    exit 0
}

Write-Log "[CHECK] FSLogix is not installed. Proceeding with installation..."

# ========================================
# 3. インストーラー存在チェック
# ========================================
$InstallerPath = "C:\FSLogixInstaller\FSLogix_25.09\x64\Release\FSLogixAppsSetup.exe"

if (-not (Test-Path $InstallerPath)) {
    Write-Log "[ERROR] FSLogix installer not found at: $InstallerPath"
    Write-Log "=========================================="
    exit 1
}

Write-Log "[INFO] FSLogix installer found: $InstallerPath"

# ========================================
# 4. FSLogix サイレントインストール実行
# ========================================
Write-Log "[INFO] Starting FSLogix installation..."

try {
    # SYSTEM アカウントで実行するため、UAC プロンプトは表示されない
    $Process = Start-Process -FilePath $InstallerPath `
                             -ArgumentList "/install", "/quiet", "/norestart" `
                             -Wait `
                             -PassThru `
                             -NoNewWindow

    $ExitCode = $Process.ExitCode
    Write-Log "[INFO] FSLogix installer exit code: $ExitCode"

    if ($ExitCode -eq 0 -or $ExitCode -eq 3010) {
        Write-Log "[SUCCESS] FSLogix installed successfully."
        
        # ========================================
        # 5. 除外リストに管理ユーザーを追加
        # ========================================
        Write-Log "[INFO] Adding admin users to FSLogix exclude lists..."
        
        try {
            Add-LocalGroupMember -Group "FSLogix Profile Exclude List" -Member "imagecreator001" -ErrorAction SilentlyContinue
            Write-Log "[INFO] Added 'imagecreator001' to FSLogix Profile Exclude List"
            
            Add-LocalGroupMember -Group "FSLogix Profile Exclude List" -Member "Administrator" -ErrorAction SilentlyContinue
            Write-Log "[INFO] Added 'Administrator' to FSLogix Profile Exclude List"
            
            Add-LocalGroupMember -Group "FSLogix ODFC Exclude List" -Member "imagecreator001" -ErrorAction SilentlyContinue
            Write-Log "[INFO] Added 'imagecreator001' to FSLogix ODFC Exclude List"
            
            Add-LocalGroupMember -Group "FSLogix ODFC Exclude List" -Member "Administrator" -ErrorAction SilentlyContinue
            Write-Log "[INFO] Added 'Administrator' to FSLogix ODFC Exclude List"
            
        } catch {
            Write-Log "[WARNING] Failed to add users to exclude lists: $_"
        }
        
        # ========================================
        # 6. 完了(再起動なし)
        # ========================================
        Write-Log "[INFO] FSLogix installation completed successfully."
        Write-Log "[INFO] Please reboot manually to activate FSLogix."
        Write-Log "=========================================="
        
    } else {
        Write-Log "[ERROR] FSLogix installation failed with exit code: $ExitCode"
        Write-Log "=========================================="
        exit 1
    }
    
} catch {
    Write-Log "[ERROR] Exception occurred during installation: $_"
    Write-Log "=========================================="
    exit 1
}

次に、Task 登録用の ps1 ファイルを作成します。

C:\FSLogixInstaller\Register-FSLogixTask.ps1

このファイルの中身です。

# ========================================
# FSLogix タスク登録スクリプト
# SYSTEM アカウント + ログオン時トリガー
# ========================================

$TaskName = "FSLogix_Auto_Install_On_Logon"
$ScriptPath = "C:\FSLogixInstaller\Install-FSLogix.ps1"

Write-Host "========================================" -ForegroundColor Cyan
Write-Host "FSLogix Task Registration" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host ""

# ========================================
# 1. スクリプト存在チェック
# ========================================
if (-not (Test-Path $ScriptPath)) {
    Write-Host "[ERROR] Script not found: $ScriptPath" -ForegroundColor Red
    Write-Host "Please create Install-FSLogix.ps1 first." -ForegroundColor Yellow
    exit 1
}

Write-Host "[OK] Script found: $ScriptPath" -ForegroundColor Green

# ========================================
# 2. 既存タスクの削除(存在する場合)
# ========================================
$ExistingTask = Get-ScheduledTask -TaskName $TaskName -ErrorAction SilentlyContinue

if ($ExistingTask) {
    Write-Host "[INFO] Existing task found. Removing..." -ForegroundColor Yellow
    Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
    Write-Host "[OK] Existing task removed." -ForegroundColor Green
}

# ========================================
# 3. タスクアクションの作成
# ========================================
Write-Host "[INFO] Creating task action..." -ForegroundColor Yellow

$Action = New-ScheduledTaskAction `
    -Execute "PowerShell.exe" `
    -Argument "-NoProfile -ExecutionPolicy Bypass -WindowStyle Hidden -File `"$ScriptPath`""

Write-Host "[OK] Task action created." -ForegroundColor Green

# ========================================
# 4. タスクトリガーの作成(ログオン時)
# ========================================
Write-Host "[INFO] Creating task trigger (At logon)..." -ForegroundColor Yellow

$Trigger = New-ScheduledTaskTrigger -AtLogOn

Write-Host "[OK] Task trigger created." -ForegroundColor Green

# ========================================
# 5. タスク設定の作成
# ========================================
Write-Host "[INFO] Creating task settings..." -ForegroundColor Yellow

$Settings = New-ScheduledTaskSettingsSet `
    -AllowStartIfOnBatteries `
    -DontStopIfGoingOnBatteries `
    -StartWhenAvailable `
    -RunOnlyIfNetworkAvailable:$false `
    -DontStopOnIdleEnd `
    -ExecutionTimeLimit (New-TimeSpan -Minutes 30)

Write-Host "[OK] Task settings created." -ForegroundColor Green

# ========================================
# 6. タスクプリンシパルの作成(SYSTEM アカウント)
# ========================================
Write-Host "[INFO] Creating task principal (SYSTEM account)..." -ForegroundColor Yellow

$Principal = New-ScheduledTaskPrincipal `
    -UserId "SYSTEM" `
    -LogonType ServiceAccount `
    -RunLevel Highest

Write-Host "[OK] Task principal created." -ForegroundColor Green

# ========================================
# 7. タスクの登録
# ========================================
Write-Host "[INFO] Registering scheduled task..." -ForegroundColor Yellow

try {
    Register-ScheduledTask `
        -TaskName $TaskName `
        -Action $Action `
        -Trigger $Trigger `
        -Settings $Settings `
        -Principal $Principal `
        -Description "FSLogix auto-installation script. Runs at user logon with SYSTEM privileges." `
        -Force | Out-Null
    
    Write-Host "[SUCCESS] Task registered successfully!" -ForegroundColor Green
    
} catch {
    Write-Host "[ERROR] Failed to register task: $_" -ForegroundColor Red
    exit 1
}

# ========================================
# 8. 登録内容の確認
# ========================================
Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Task Registration Summary" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan

$RegisteredTask = Get-ScheduledTask -TaskName $TaskName

Write-Host "Task Name       : $TaskName" -ForegroundColor White
Write-Host "State           : $($RegisteredTask.State)" -ForegroundColor White
Write-Host "Trigger         : At user logon" -ForegroundColor White
Write-Host "Run as          : SYSTEM" -ForegroundColor White
Write-Host "Run level       : Highest" -ForegroundColor White
Write-Host "Script          : $ScriptPath" -ForegroundColor White
Write-Host "UAC Prompt      : None (silent execution)" -ForegroundColor Green

Write-Host ""
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "Next Steps" -ForegroundColor Cyan
Write-Host "========================================" -ForegroundColor Cyan
Write-Host "1. Log off current user" -ForegroundColor Yellow
Write-Host "2. Log in with any user account" -ForegroundColor Yellow
Write-Host "3. Task will run automatically" -ForegroundColor Yellow
Write-Host "4. Check log: C:\FSLogixInstaller\FSLogix_Install.log" -ForegroundColor Yellow
Write-Host ""

# ========================================
# 9. タスク詳細表示(オプション)
# ========================================
$ShowDetails = Read-Host "Do you want to see detailed task information? (Y/N)"

if ($ShowDetails -eq "Y" -or $ShowDetails -eq "y") {
    Write-Host ""
    Write-Host "========================================" -ForegroundColor Cyan
    Write-Host "Detailed Task Information" -ForegroundColor Cyan
    Write-Host "========================================" -ForegroundColor Cyan
    
    Get-ScheduledTask -TaskName $TaskName | Format-List *
    
    Write-Host ""
    Write-Host "Task Principal:" -ForegroundColor Cyan
    Get-ScheduledTask -TaskName $TaskName | Select-Object -ExpandProperty Principal | Format-List *
    
    Write-Host ""
    Write-Host "Task Trigger:" -ForegroundColor Cyan
    Get-ScheduledTask -TaskName $TaskName | Select-Object -ExpandProperty Triggers | Format-List *
    
    Write-Host ""
    Write-Host "Task Action:" -ForegroundColor Cyan
    Get-ScheduledTask -TaskName $TaskName | Select-Object -ExpandProperty Actions | Format-List *
}

Write-Host ""
Write-Host "Press any key to exit..." -ForegroundColor Gray
$null = $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

タスク登録用の ps1 ファイルのみ実行して、Task として登録します。

# 管理者権限の PowerShell で実行
cd C:\FSLogixInstaller
.\Register-FSLogixTask.ps1

実行例

PS C:\FSLogixInstaller> .\Register-FSLogixTask.ps1
========================================
FSLogix Task Registration
========================================

[OK] Script found: C:\FSLogixInstaller\Install-FSLogix.ps1
[INFO] Creating task action...
[OK] Task action created.
[INFO] Creating task trigger (At logon)...
[OK] Task trigger created.
[INFO] Creating task settings...
[OK] Task settings created.
[INFO] Creating task principal (SYSTEM account)...
[OK] Task principal created.
[INFO] Registering scheduled task...
[SUCCESS] Task registered successfully!

========================================
Task Registration Summary
========================================
Task Name       : FSLogix_Auto_Install_On_Logon

また、FSLogix 以外の必要なソフトウェアも、適宜 Image のなかにインストールしていきます。

ImageChecker での検証

Image 作成用の WorkSpace で、ImageChecker を実行して、すべての要件を満たしているか確認します。

C:\Program Files\Amazon\ImageChecker.exe

すべてのチェック項目が PASSED となりました。"Only one user profile can exist on a WorkSpace" や "A user profile must exist" を含む、すべての項目が緑色で PASSED と表示されています。

image-20251123220245362

Custom Image の作成

ImageChecker で問題がないことを確認したら、この WorkSpace から Custom Image を作成します。

AWS マネジメントコンソールの WorkSpaces 画面で、ImageCreator001 の WorkSpace を選択し、Actions > Create image を実行します。

image-20251123161215236

Image の名前として Windows10withFSLogix を入力します。この Image には、FSLogix の自動インストールスクリプトが含まれています。

Windows10withFSLogix

image-20251123161314534

Image の作成処理が開始されました。AWS マネジメントコンソールの Images 画面で、Windows10withFSLogix という名前の Image が Pending 状態で表示されています。

image-20251123220409195

一定時間後、Image が作成されました。Images 画面で、Windows10withFSLogix の Status が Available になっています。この Image を使用して新しい Bundle を作成できます。

image-20251123224407365

Bundle の作成

作成した Custom Image から Bundle を作成します。Windows10withFSLogix Image を選択し、Actions > Create bundle を実行します。

image-20251123224546070

Create bundle 画面が表示されます。Bundle name と Bundle description に Windows10withFSLogix を入力します。

image-20251123224720402

Bundle が正常に作成されました。

image-20251123224741283

[東京] Bundle を利用して WorkSpace を作成

作成した Custom Bundle を使用して、新しい WorkSpace を作成します。右上の Create WorkSpaces ボタンをクリックします。

image-20251123224506821

Configure WorkSpace 画面で、Bundle を選択します。

image-20251123224836403

Select directory 画面で、example.local の Directory を選択し、ユーザーとして wsuser001 を選択します。

image-20251123224908914

Customization 画面で、wsuser001 ユーザーの WorkSpace に対して、Bundle name として Windows10withFSLogix を選択します。

image-20251123224944364

WorkSpace の作成が完了しました。

image-20251123225740547

[東京] 接続動作確認

作成した wsuser001 接続します。

image-20251123225806618

初回にアクセスすると、FSLogix が自動的に install されていることがログファイルで確認できました。この記事の場合は、手動で WorkSpaces の環境を再起動します。(実際は Script のなかで自動再起動するように実装変更しても良いとおもう。)

image-20251123230002883

次回接続時に、FSLogix の初回設定が入ります。

image-20251123230254715

FSLogix が導入できました。

image-20251123230427009

FSx では、東京と大阪の 2 つのリージョンにプロファイルが書き込まれています。

image-20251123230507695

[東京] WorkSpaces にインストールをする

大阪に FSLogix による DR 環境が作成できるか確認するため、以下のデータを残します。

  • Visual Studio Code のインストール
  • テストファイル作成

image-20251123231627269

[大阪] EC2 インスタンス作成

大阪側で、WorkSpaces のプロファイルを引き継げるか確認します。

EC2 インスタンスを作成します。WorkSpaces 側と合わせて、Windows Server 2022 を選択。

image-20251123233055570

FSx にアクセス可能な VPC を選択

image-20251123233144668

SSM の Run Command をするため、IAM Role を付与

image-20251123233242432

この記事の環境では、Systems Manager の FleetManager に自動的に登録されています。

image-20251123233437224

Run Command で Active Directory の参加を行います。

image-20251123234151614

以下の Command を選択します。

AWS-JoinDirectoryServiceDomain-V2

image-20251123234950257

以下のパラメーターを指定します。大阪側で AD Connector は事前設定済みで、その Directory Id を利用しています。

Directory Id : d-c7670eac80
Directory Name : example.local
Directory OU : OU=MyAmazonWorkspacesOU,DC=example,DC=local
Dns Ip Addresses : 10.29.6.97
Timeout : 3000

image-20251123235126718

AD 参加する Windows マシンを選択します。

image-20251123235143539

画面右下の Run ボタンをクリックしてドメイン参加コマンドを実行します。

image-20251123235202694

ドメイン参加コマンドが実行され、自動的に再起動されます。

Remote Desktop で接続

次に Remote Desktop で、WorkSpaces で使用していたユーザーでログインします。

  • example.local\wsuser001

FSLogix のインストール

大阪リージョンの EC2 インスタンスには FSLogix がインストールされていないので、手動でインストールします。

https://learn.microsoft.com/ja-jp/fslogix/how-to-install-fslogix

image-20251124002256010

FSLogix による プロファイル読み込み

FSLogix をインストール後、再起動して再接続します。

ログイン画面で、FSLogix Apps Services によるプロファイル読み込みが実行されている様子が表示されます。"Please wait for the FSLogix Apps Services" というメッセージが表示され、wsuser001 ユーザーのプロファイルが FSx から読み込まれています。

image-20251124002615161

大阪リージョンの EC2 インスタンスで、東京の WorkSpaces と同じユーザープロファイルが読み込まれました。

image-20251124004358426

WorkSpaces 側でインストールした Visual Studio Code が動作します。導入した拡張機能とファイルも確認できます。

image-20251124004641227

反対に、大阪の EC2 側で作成したものが、東京の WorkSpaces に反映されるか確認するために、大阪側で以下のテストファイルを作成してみます。

# テストファイル
このファイルは、大阪の EC2 で作成されたファイルです。東京側の WorkSpaces 側でみえますか?見えたら完璧です。

image-20251124004824188

大阪の EC2 インスタンスを停止します。

曽於語、東京の WorkSpaces で接続を行います。大阪で書き込んだファイルが正しく表示されました!

image-20251124005344090

まとめ

本検証では、Amazon WorkSpaces 環境で FSLogix を利用したユーザープロファイル管理を構成し、東京と大阪の両リージョンで災害復旧 (DR) 環境を構築しました。

  1. マルチリージョンプロファイル同期: FSLogix Cloud Cache 機能により、東京と大阪の両リージョンの FSx に同時にプロファイルを書き込み
  2. リージョン間の切り替え: 東京の WorkSpaces で作業していたユーザーが、大阪の EC2 インスタンスから同じプロファイルでアクセス可能
  3. 自動インストール機構: Custom Image 作成時の制約を回避するため、ログオン時に FSLogix を自動インストールするスクリプトを実装

検証してわかったこと

FSLogix インストール済み環境からの Custom Image 作成の制約

FSLogix をインストールした WorkSpace から直接 Custom Image を作成することはできません。

  • FSLogix をインストールして再起動すると、ユーザープロファイルが C ドライブに作成されます
  • WorkSpaces は D ドライブにユーザープロファイルが存在することを期待するため、ImageChecker で事前チェックエラーが発生します
  • この制約を回避するため、本検証では Image 作成用ユーザー (imagecreator001) を FSLogix の対象外とし、一般ユーザーのログオン時に自動的に FSLogix をインストールするスクリプトを実装しています

同時アクセスの制限

FSLogix Cloud Cache を使用する場合、同一ユーザーが複数の場所から同時にアクセスすることはできません。

  • 東京の WorkSpaces と大阪の EC2 から同じユーザーで同時にログインすることはできません
  • どちらか一方からのみアクセスする必要があります
  • 同時アクセスを試みると、ファイルの同期に問題が発生する可能性があります

Cloud Cache のメリットとデメリット

今回の記事では、FSLogix の Cloud Cache を利用した記事を検証しました。
検証して思ったことは、Cloud Cache を利用せずに、Profile Containers のみを利用する方法も十分メリットがあるということです。

  • Cloud Cache のメリット
    • FSLogix 側で東京リージョンと大阪リージョンの 2 つの FSx for Windows File Server にデータを保存してくれる
    • FSx for Windows File Server には、数秒の頻度でキャッシュデータをフラッシュする仕組みがあり、RPO を 0 に近づけたい場合は有効
  • Cloud Cache のデメリット
    • 複雑な仕組みで、運用時における複雑性が高くなりがち
    • 東京と大阪にデータを書き込むうえでパフォーマンスが気になる
    • RPO が 1 時間程度で良い場合は、東京リージョンの FSx for Windows File Server のみを FSLogix の Profile Containers のプロファイル保存先として設定する方法も考えられる。AWS Backup のマルチリージョンコピーによって、1 時間に 1 回ほどの頻度で大阪にコピーする。

ユーザープロファイル問題を解決する「FSLogix」とは?
https://www.cloudou.net/azure-virtual-desktop/avd004/

Office を利用する場合

東京の WorkSpaces で Microsoft Office を利用する場合、何も考えずに大阪の EC2 インスタンスを作成すると、プロファイルは保持してくれますが、Excel などの Office のファイルは開けません。
自分の検証した環境では、大阪リージョンで EC2 on Office を利用することで、大阪側でも Office の利用ができました。
このあたりは設定における Tips があるので、そのうち作業におけるポイントに関する記事を公開します。

参考 URL

FSLogix 関連

AWS 公式ブログ

その他の参考記事

アマゾン ウェブ サービス ジャパン (有志)

Discussion