Session Recording

Session Recordingリソースをクラウドサブスクリプションに展開する

この記事では、AzureサブスクリプションにSession Recordingリソースを展開する方法について説明します。

Session Recordingサービス内から、次のSession RecordingリソースをAzureサブスクリプションに展開できます:

  • Session Recordingサーバー
  • データベース
  • ストレージ
  • ロードバランサー

Session RecordingリソースをAzureサブスクリプションに展開する方法は2つあります:

  • Azureサブスクリプションに接続するホスト接続を使用します 。ホスト接続を作成するには、サブスクリプション情報を提供する必要があります。詳しくは、この記事の後半の「ホスト接続経由でサイトを作成および展開する」を参照してください。

  • サブスクリプション情報を提供したくない場合は、展開する方法とリソースが含まれるAzure Resource Managerテンプレート(ARMテンプレート)を作成します。詳しくは、この記事の後半の「ARMテンプレートを使用してサイトを作成および展開する」を参照してください。

ホスト接続経由でサイトを作成および展開する

このセクションでは、ホスト接続経由でサイトを作成および展開する手順と、この方法で展開されたサイトで実行できる次の操作について説明します:

  • Azureに展開された既存のサイトにリソースを追加する
  • ロードバランサーへのアクセスが許可されるIPアドレスを変更する
  • Azureの使用に必要な実際のコストを表示する

ホスト接続経由でサイトを作成および展開する

  1. Session Recordingサービスの左側ナビゲーションで、[構成 ]>[サーバー管理] を選択します。

    [サーバー管理]ページ

  2. [サーバー管理] ページで、[サイトの作成] をクリックします。[サイトの作成] ページが開きます。

    サイトの作成ページ

  3. [ホスト接続経由でサイトを作成および展開する] を選択します。主な手順は左側のナビゲーションに一覧表示されています。

    ホスト接続経由でサイトを作成および展開する

  4. サイト名と説明を入力し、Azureサブスクリプションに接続するホスト接続を選択し、リージョンを指定します。

    • ホスト接続がない場合は、この記事の後半の「ホスト接続を追加する」を参照してホスト接続を追加します。

    • Azure Governmentリージョンはサポートされていません。

  5. サイト情報を入力したら、[次へ] をクリックして続行します。

  6. (オプション)VMおよびストレージ構成の推奨事項を取得するには、録画のニーズに関する情報を提供してください。

    この手順をスキップするには [この手順をスキップします。] をクリックするか、何も選択せずに [次へ] をクリックします。

    録画のニーズ

    ドロップダウンリストからオプションを選択すると、選択に応じた推奨事項が表示されます。[リセット] ボタンは推奨事項の横にあります。このボタンで、そのセクションの選択と対応する推奨事項をクリアできます。

  7. Azureポータルに移動し、選択したリージョンに新しい仮想ネットワークを作成し、新しい仮想ネットワークとVDAが接続されている仮想ネットワークの間に仮想ネットワークピアリングを設定します。次に、新しい仮想ネットワークにサブネットを追加します。サブネットIDを見つけて入力します。

    ネットワーク設定

    プライベートネットワーク内のリソース間の接続を維持するには、[Create private endpoints for storage and databases] チェックボックスをオンにします。

    [Create private endpoints for storage and databases] チェックボックスをオンにした後、次の点を考慮して別のサブネットIDを入力するかどうかを決定します:

    • Session RecordingサーバーをActive Directoryドメインに参加させる予定がない場合は、サブネットは必要ないため、サブネットIDフィールドは空のままにしておきます。
    • サブネットIDフィールドを空のままにすると、Session RecordingサーバーがAzure Active Directoryドメインに参加します。

    別のサブネットID

  8. Session Recordingサーバーとして仮想マシン(VM)を作成します。

    VMをSession Recordingサーバーとして作成する

    注:

    • [仮想マシンの数] フィールドには、推奨される数(設定されている場合)が事前に入力されています。必要に応じて数を変更します。
    • コスト見積もりは標準価格に基づいており、割引は考慮されていません。実際のコストは見積もりよりも低いことが予想されます。
  9. Session RecordingサーバーをVDAと同じドメインに参加させ、Session Recordingサーバーの証明書を指定します。

    • VDAがActive Directoryドメインに接続する場合は、[Join servers to an Active Directory domain] チェックボックスをオンにして、関連情報を入力します。[Join servers to an Active Directory domain] チェック ボックスをオンにすると、オンプレミスのActive DirectoryとAzure ADを統合するハイブリッドシナリオの展開が構成されます。

    • VDAがAzure Active Directory(AAD)ドメインに接続する場合は、[Join servers to an Active Directory domain] チェックボックスをオフにします。現在のサイトの作成が完了したら、Session Recordingサーバーを同じAADドメインに手動で参加させてください。純粋なAAD展開は、Session Recording 2402以降でのみ使用できることにご注意ください。

    サーバーをActive Directoryドメインに追加させる

    Azure Active Directoryドメインにサーバーを参加させる

    注:

    2023年7月より、MicrosoftはAzure Active Directory(Azure AD)の名前をMicrosoft Entra IDに変更しました。このドキュメントでは、Azure Active Directory、Azure AD、またはAADへの言及はすべて、Microsoft Entra IDを意味することになります。

  10. 録画ファイルを保存するために、Azureストレージアカウントとファイル共有を構成します。価格情報については、「Azure Filesの価格」を参照してください。

    録画ファイルを保存するためのAzureストレージアカウントとファイル共有を構成する

  11. Azureに2つのSQLデータベースを作成します。1つはSession Recordingデータベース(sessionrecordingという名称)として使用され、もう1つは管理者ログ データベース (sessionrecordingloggingという名称)として使用されます。

    Azureに2つのSQLデータベースを作成する

    注:

    ホスト接続を通じて展開された既存のサイトにリソース、具体的にはSession Recordingサーバーを追加する場合は、サイトの作成時に設定したデータベース管理者のパスワードを入力する必要があります。

  12. ロードバランサーを作成して、Session Recordingサーバー間でワークロードを分散します。[ロードバランサーのアクセスを以下のアドレスのみに制限する] フィールドにVDAのIPアドレスまたは範囲を入力し、コンマ(,)で区切ります。価格情報については、「Load Balancerの価格」を参照してください。

    ロードバランサーの作成

  13. (オプション)作成するAzureリソースにタグを適用します。

    Azureリソースへのタグの適用

  14. Session RecordingサーバーをSession Recordingサービスに登録するためのセキュアクライアントを作成します。

    [クライアントの作成] をクリックすると、Citrixがユーザーに代わってセキュアクライアントを作成します。または、Citrix Cloudコンソールの [IDおよびアクセス管理]>[APIアクセス] タブを通じてセキュアクライアントを作成し、以下の情報を入力できます。

    [クライアントの作成]ボタン

  15. 作成するサイトの概要を表示します。必要に応じて鉛筆アイコンをクリックして設定を編集するか、ボタンをクリックして展開を開始します。

    作成するサイトについての概要

    次に、展開プロセスの例を示します:

    展開が進行中:

    展開が進行中

    サイト展開の進行中に、[状態の表示] をクリックして進行状況を表示できます。

    展開の失敗:

    展開の失敗

    展開プロセス中にエラーが発生した場合は、[状態の表示] をクリックしてエラーの詳細を表示します。エラーの詳細の例:

    展開エラーの詳細

    [構成に戻る] または [展開をキャンセルする] をクリックできます。[構成に戻る] をクリックすると、[サイトの作成] ページに戻り、そこで構成を変更して再試行できます。展開のキャンセルが必要な場合は、ウィザードに従ってサイトとそのサイト用に作成されたAzureリソースを削除します。例:

    展開がキャンセルされました

    展開の成功:

    サイトの展開が完了すると、サイトを広げて、その下に作成されたリソースを表示および管理できるようになります。[状態の表示] ボタンが [設定] に変わります。Azureアイコンは、Azureに展開されたサイトを表すために使用できます。 サイト設定について詳しくは、「サイトとサーバーの設定」を参照してください。

    展開されたサイト

Azureに展開された既存のサイトにリソースを追加する

ホスト接続経由でAzureに展開された既存のサイトの場合、サーバーやストレージなどのリソースをサイトに追加できます。このためには、次の手順を実行します:

  1. Session Recordingサービスの左側ナビゲーションで、[構成 ]>[サーバー管理] を選択します。
  2. [サーバー管理] ページで、ターゲットサイトを見つけて展開します。Azureアイコンは、Azureに展開されたサイトを表すために使用できます。
  3. [リソースの追加] をクリックします。

    [リソースの追加]ボタン

  4. [リソースの追加] ページで、必要に応じて [サーバーの追加] および [ストレージの追加] をクリックします。

    [リソースの追加]ページ

    • サーバーを追加するには、[サーバーの追加] をクリックし、次の手順を実行します:

      サーバーの追加

      1. 追加するサーバーの数を指定します。
      2. [ドメイン] セクションの [資格情報を提供する] をクリックして、新しいサーバーを既存のサーバーと同じドメインに参加させます。
      3. [管理者アカウント] セクションで [資格情報を提供する] をクリックして、サイト作成時に設定したデータベース管理者のパスワードを入力します。さらに、追加するサーバーマシンの管理者アカウントのパスワードを設定する必要があります。サイト作成時に設定したパスワードと同じパスワードを使用することをお勧めします。
      4. [クライアントの作成] をクリックして、新しいサーバーをSession Recordingサービスに追加します。
      5. [展開を開始する] をクリックします。
    • 録画ファイルを保存するためのストレージを追加するには、[ストレージの追加] をクリックし、それに応じて次の手順を実行します:

      1. サイトが標準ストレージアカウントを使用して作成されている場合は、追加するファイル共有の数を指定するように求められます。例:

        標準ストレージアカウントに追加するファイル共有

      2. サイトがPremium Storageアカウントを使用して作成されている場合は、追加するファイル共有の数を指定し、各ファイル共有の容量をカスタマイズできます。例:

        標準ストレージアカウントに追加するファイル共有

      3. [展開を開始する] をクリックします。

        注:

        • 次の条件のいずれかが満たされる場合、[展開を開始する] ボタンが使用可能になります:
          • 少なくとも1つのサーバーが指定され、ドメインとセキュアクライアントが構成されている。
          • 少なくとも1つのファイル共有が指定されている。
        • リソースの展開が進行中の場合、ロードバランサーの [設定] ボタンは無効になります。
        • 追加されたリソースの展開が失敗し、Session Recordingサービスがこれらのリソースをサブスクリプションから削除できない場合があります。この場合、アクションを実行するために、次のようなプロンプトが表示されます:

          Failed to clean up resources(リソースのクリーンアップに失敗しました)

ロードバランサーへのアクセスが許可されるIPアドレスを変更する

ホスト接続経由でAzureに展開された既存のサイトの場合、ロードバランサーへのアクセスが許可されるIPアドレスを変更できます。このためには、次の手順を実行します:

  1. Session Recordingサービスの左側ナビゲーションで、[構成 ]>[サーバー管理] を選択します。
  2. [サーバー管理] ページで、ターゲットサイトを見つけて展開します。Azureアイコンは、Azureに展開されたサイトを表すために使用できます。
  3. [ロードバランサー] セクションの [設定] ボタンをクリックします。

    ロードバランサーの[設定]ボタン

  4. [ロードバランサー] 設定ページで、[ロードバランサーのアクセスを以下のアドレスのみに制限する] フィールドにVDAの新しいIPアドレスまたは範囲を入力し、コンマ(,)で区切ります。

    ロードバランサーにアクセスできるVDAの設定

  5. [保存] をクリックします。

Azureの使用に必要な実際のコストを表示する

ホスト接続経由でAzureに展開されたサイトの場合は、コストの金額をクリックしてコストの詳細を表示します。例:

Azureの利用にかかるコスト

コスト分析

実際のコストを表示するためのヒント:

  • 今月の面グラフ上にマウスを移動すると、日付とその日のデータの基準線がオーバーレイとして表示されます。
  • さまざまなリソースのコスト履歴が折れ線グラフで表示されます。折れ線グラフは、少なくとも2か月分のデータがある場合に使用できます。折れ線グラフの上にマウスを置くと、その月の基準線とコストの内訳がオーバーレイとして表示されます。特定のリソースのみの折れ線グラフを表示するには、リソースの上にマウスを置きます。

ホスト接続を追加する

ホスト接続を追加するには、次の手順を実行します:

  1. [サイトの作成] ページの [ホスト接続経由でサイトを作成および展開する] が選択された状態で、[接続の追加] をクリックします。または、[ホスト接続] ページで [接続の追加] クリックします。

    [サイトの作成] ページにアクセスするには、Session Recordingサービスの左側ナビゲーションで、[構成 ]>[サーバー管理] を選択し、[サイトの作成] をクリックします。

    [サーバー管理]ページ

    [ホスト接続] ページにアクセスするには、Session Recordingサービスの左側のナビゲーションから [構成]>[ホスト接続] を選択します。

    [ホスト接続]ページ

  2. [接続の追加] ページで、新しいホスト接続に名前と説明を入力します(オプション)。AzureサブスクリプションIDと、アプリケーションの登録に関する次の必須情報を入力します:

    • アプリケーション(クライアント)ID
    • サービスプリンシパルオブジェクトID(アプリケーションに関連付けられたサービスプリンシパルオブジェクトのID)
    • ディレクトリ(テナント)ID
    • クライアントシークレット
    • シークレットの有効期限

    [接続の追加]ページ

    AzureサブスクリプションIDを確認するには、次の手順を実行します:

    1. Azure Portalにサインインします。
    2. [Azureサービス] セクションで、[サブスクリプション] を選択します。
    3. 一覧でサブスクリプションを見つけて、2番目の列に表示されているサブスクリプションIDをコピーします。

      AzureサブスクリプションIDの検索

    アプリケーションの登録に関して必須情報を取得するには、次の手順を実行します:

    1. (既にアプリケーションを登録している場合は、この手順をスキップしてください。)Azure ADテナントにアプリケーションを登録します。IDおよびアクセス管理機能をAzure ADに委任するには、アプリケーションを登録する必要があります。

      アプリケーションを登録するには2つの方法があります。

      方法1:

      1. 次のCitrix提供のスクリプトをコピーし、たとえばAppRegistration.ps1などの名前を付けます:

        <#
        .SYNOPSIS
            Copyright (c) Citrix Systems, Inc. All Rights Reserved.
        .DESCRIPTION
            Create Azure app registrations and give proper permissions for Citrix Session Recording service deployment
        .Parameter azureTenantID
        .Parameter azureSubscriptionID
        .Parameter appName
        .Parameter role
        #>
        
        [CmdletBinding()]
        Param(
            [Parameter(Mandatory = $true)] [String] $tenantId,
            [Parameter(Mandatory = $true)] [String] $subscriptionId,
            [Parameter(Mandatory = $true)] [String] $appName,
            [Parameter(Mandatory = $true)] [String] $role
        )
        
        if ($role -ne "Citrix Session Recording service" -and $role -ne "Citrix Session Recording Deployment" -and $role -ne "Contributor") {
            throw [System.Exception] "Invalid role '$role', only support 'Citrix Session Recording service', 'Citrix Session Recording Deployment', and 'Contributor'."
        }
        
        try {
            Get-InstalledModule -Name "Az.Accounts" -ErrorAction Stop
        }
        catch {
            Install-Module -Name "Az.Accounts" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force
        }
        try {
            Get-InstalledModule -Name "Az.Resources" -ErrorAction Stop
        }
        catch {
            Install-Module -Name "Az.Resources" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force
        }
        
        Connect-AzAccount -TenantId $tenantId -Subscription $subscriptionId
        
        try {
        
            $azureAdApplication = Get-AzADApplication -DisplayName $appName
            if ($null -eq $azureAdApplication) {
                Write-Host "Create a new app registration for Citrix Session Recording" -ForegroundColor Green
                $azureAdApplication = New-AzADApplication -DisplayName $appName -AvailableToOtherTenants $false
            }
            else {
                Write-Host "App registration '$appName' already exists." -ForegroundColor Yellow
            }
        
            $azureAdApplicationServicePrincipal = Get-AzADServicePrincipal -DisplayName $appName
            if($null -eq $azureAdApplicationServicePrincipal) {
                $azureAdApplicationServicePrincipal = New-AzADServicePrincipal -AppId $azureAdApplication.AppId
                Write-Host "Create a service principal for app registration '$appName'" -ForegroundColor Green
            }else{
                Write-Host "Service principal already exists for app registration '$appName'" -ForegroundColor Yellow
            }
        
            if ($role -eq "Citrix Session Recording service" -or $role -eq "Citrix Session Recording Deployment") {
                $rootPath = Get-Location
                $customRolePath = $(Join-Path -Path $rootPath -ChildPath "sessionrecording.json") | Resolve-Path
                $customRoleJson = Get-Content $customRolePath | ConvertFrom-Json
                $customRoleJson.AssignableScopes[0] = "/subscriptions/" + $subscriptionId
                $tmpCustomRolePath = Join-Path -Path $rootPath -ChildPath "sessionrecording_tmp.json"
        
                $roleDef = Get-AzRoleDefinition -Name $role
                if ($null -eq $roleDef) {
                    try {
                        $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath
                        Write-Host "Create a custom role '$role'" -ForegroundColor Green
                        New-AzRoleDefinition -InputFile $tmpCustomRolePath
                    }
                    catch {
                        Write-Host "Failed to create custom role, error: $_" -ForegroundColor Red
                        throw $_.Exception
                    }
                }
                else {
                    try {
                        $customRoleJson | Add-Member -MemberType NoteProperty -Name 'id' -Value $($roleDef.Id)
                        $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath
                        Write-Host "Upadate the custom role '$role'" -ForegroundColor Green
                        Set-AzRoleDefinition -InputFile $tmpCustomRolePath
                    }
                    catch {
                        Write-Host "Failed to update custom role, error: $_" -ForegroundColor Red
                        throw $_.Exception
                    }
                }
            }
        
            $roleAssignment = Get-AzRoleAssignment -RoleDefinitionName $role -ObjectId $($azureAdApplicationServicePrincipal.Id)
            if ($null -eq $roleAssignment) {
                Write-Host "Assign role '$role' to app '$appName'" -ForegroundColor Green
                New-AzRoleAssignment -RoleDefinitionName $role -ApplicationId $azureAdApplication.AppId
            }
            else {
                Write-Host "Role '$role' already assigned to app '$appName'" -ForegroundColor Yellow
            }
        
            Write-Host "Tenant ID:                   $tenantId" -ForegroundColor Green
            Write-Host "Subscription ID:             $subscriptionId" -ForegroundColor Green
            Write-Host "Application ID:              $($azureAdApplication.AppId)" -ForegroundColor Green
            Write-Host "Service principal object ID: $($azureAdApplicationServicePrincipal.Id)" -ForegroundColor Green
        }
        catch {
            Write-Host "Failed to assign role assignment to this app, error: $_" -ForegroundColor Red
            Write-Host "Please make sure the current azure admin has permission to assign roles" -ForegroundColor Red
        }
        <!--NeedCopy-->
        
      2. 次のカスタム役割ファイルをコピーし、sessionrecording.jsonという名前を付けます。このカスタム役割ファイルは、登録するアプリケーションに最小限の権限を割り当てるのに役立ちます。

        {
            "name": "Citrix Session Recording service",
            "description": "This role has permissions which allow Citrix Session Recording service to deploy Session Recording resources using a host connection.",
            "assignableScopes": [
                "/subscriptions/*"
            ],
            "actions": [
                "Microsoft.Compute/availabilitySets/write",
                "Microsoft.Compute/virtualMachines/delete",
                "Microsoft.Compute/virtualMachines/extensions/read",
                "Microsoft.Compute/virtualMachines/extensions/write",
                "Microsoft.Compute/virtualMachines/read",
                "Microsoft.Compute/virtualMachines/runCommands/read",
                "Microsoft.Compute/virtualMachines/runCommands/write",
                "Microsoft.Compute/virtualMachines/write",
                "Microsoft.CostManagement/forecast/read",
                "Microsoft.CostManagement/query/read",
                "Microsoft.KeyVault/locations/deletedVaults/purge/action",
                "Microsoft.KeyVault/vaults/PrivateEndpointConnectionsApproval/action",
                "Microsoft.KeyVault/vaults/read",
                "Microsoft.KeyVault/vaults/secrets/read",
                "Microsoft.KeyVault/vaults/secrets/write",
                "Microsoft.KeyVault/vaults/write",
                "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action",
                "Microsoft.ManagedIdentity/userAssignedIdentities/read",
                "Microsoft.ManagedIdentity/userAssignedIdentities/write",
                "Microsoft.Network/dnsForwardingRulesets/forwardingRules/read",
                "Microsoft.Network/dnsForwardingRulesets/forwardingRules/write",
                "Microsoft.Network/dnsForwardingRulesets/read",
                "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/read",
                "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/write",
                "Microsoft.Network/dnsForwardingRulesets/write",
                "Microsoft.Network/dnsResolvers/outboundEndpoints/join/action",
                "Microsoft.Network/dnsResolvers/outboundEndpoints/read",
                "Microsoft.Network/dnsResolvers/outboundEndpoints/write",
                "Microsoft.Network/dnsResolvers/read",
                "Microsoft.Network/dnsResolvers/write",
                "Microsoft.Network/loadBalancers/backendAddressPools/join/action",
                "Microsoft.Network/loadBalancers/read",
                "Microsoft.Network/loadBalancers/write",
                "Microsoft.Network/networkInterfaces/join/action",
                "Microsoft.Network/networkInterfaces/read",
                "Microsoft.Network/networkInterfaces/write",
                "Microsoft.Network/networkSecurityGroups/delete",
                "Microsoft.Network/networkSecurityGroups/join/action",
                "Microsoft.Network/networkSecurityGroups/read",
                "Microsoft.Network/networkSecurityGroups/securityRules/read",
                "Microsoft.Network/networkSecurityGroups/securityRules/write",
                "Microsoft.Network/networkSecurityGroups/write",
                "Microsoft.Network/privateDnsZones/join/action",
                "Microsoft.Network/privateDnsZones/read",
                "Microsoft.Network/privateDnsZones/virtualNetworkLinks/read",
                "Microsoft.Network/privateDnsZones/virtualNetworkLinks/write",
                "Microsoft.Network/privateDnsZones/write",
                "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/read",
                "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/write",
                "Microsoft.Network/privateEndpoints/read",
                "Microsoft.Network/privateEndpoints/write",
                "Microsoft.Network/publicIPAddresses/join/action",
                "Microsoft.Network/publicIPAddresses/read",
                "Microsoft.Network/publicIPAddresses/write",
                "Microsoft.Network/virtualNetworks/join/action",
                "Microsoft.Network/virtualNetworks/read",
                "Microsoft.Network/virtualNetworks/subnets/join/action",
                "Microsoft.Network/virtualNetworks/subnets/read",
                "Microsoft.Resources/deployments/operationstatuses/read",
                "Microsoft.Resources/deployments/read",
                "Microsoft.Resources/deployments/write",
                "Microsoft.Resources/subscriptions/resourceGroups/delete",
                "Microsoft.Resources/subscriptions/resourceGroups/read",
                "Microsoft.Resources/subscriptions/resourceGroups/write",
                "Microsoft.Sql/servers/auditingSettings/write",
                "Microsoft.Sql/servers/databases/write",
                "Microsoft.Sql/servers/firewallRules/write",
                "Microsoft.Sql/servers/privateEndpointConnectionsApproval/action",
                "Microsoft.Sql/servers/read",
                "Microsoft.Sql/servers/write",
                "Microsoft.Storage/storageAccounts/PrivateEndpointConnectionsApproval/action",
                "Microsoft.Storage/storageAccounts/fileServices/shares/delete",
                "Microsoft.Storage/storageAccounts/fileServices/shares/read",
                "Microsoft.Storage/storageAccounts/fileServices/shares/write",
                "Microsoft.Storage/storageAccounts/listkeys/action",
                "Microsoft.Storage/storageAccounts/read",
                "Microsoft.Storage/storageAccounts/write"
            ],
            "NotActions": [],
            "DataActions": [],
            "NotDataActions": []
        }
        <!--NeedCopy-->
        
      3. AppRegistration.ps1sessionrecording.jsonを同じフォルダーに配置します。
      4. 必要に応じて、次のコマンドのいずれかを実行します。

      アプリケーションを作成し、前述のカスタム役割ファイル(sessionrecording.json)を使用して最小限の権限を割り当てるには、次のコマンドを実行します:

      ```
      .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Citrix Session Recording service"
      <!--NeedCopy--> ```
      
      To create an application and assign it the Azure built-in **Contributor** role, run:
      
      ```
      .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Contributor"
      <!--NeedCopy--> ```
      

      方法2:

      Azure Portalにアクセスし、自分でアプリケーションを登録します。アプリケーションに適切な権限を付与します。必要な最小限の権限については、方法1sessionrecording.jsonファイルを参照してください。

    2. アプリケーションの表示名をクリックします。

      アプリケーションの表示名

    3. 概要ページで、アプリケーション(クライアント)IDとディレクトリ(テナント)IDを見つけます。[Managed application in local directory] の横にあるリンクをクリックして、アプリケーションに関連付けられているサービスプリンシパルオブジェクトのIDを見つけます。[Client credentials] の横にあるリンクをクリックして、クライアントシークレットIDとその有効期限を確認します。

      アプリケーションの基本情報

      たとえば、アプリケーションに関連付けられたサービスプリンシパルオブジェクトのID:

      サービスプリンシパルオブジェクトのID

      たとえば、クライアントシークレットIDとその有効期限:

      クライアントシークレットIDとその有効期限

  3. [保存] をクリックして、指定したホスト接続が使用可能かどうかをテストします。

    指定したホスト接続が使用可能な場合は、[ホスト接続] ページに戻され、ホスト接続が正常に追加されたことを確認するメッセージが表示されます。

    Session Recordingサービスは、期限切れのクライアントシークレットと期限切れが近いクライアントシークレットを、それぞれエラーアイコンと警告アイコンを使用して通知します。対応するホスト接続をクリックし、[接続の詳細] ページで [シークレットの変更] をクリックすると、クライアントシークレットとその有効期限を更新できます。

    シークレットの変更

ARMテンプレートを使用してサイトを作成、展開する

Azure Resource Managerテンプレート(ARMテンプレート)を作成して、AzureにSession Recordingリソースを展開できます。これを達成するための主な手順は次のとおりです:

  1. Session RecordingサービスでARMテンプレートを作成します。ARMテンプレートは、展開の方法とリソースが含まれるJavaScript Object Notation(JSON)ファイルです。
  2. ARMテンプレートをダウンロードして展開します。展開したテンプレートフォルダー内の展開スクリプトを実行して、テンプレートで指定されたリソースのAzureへの展開を開始します。
  3. Azureでの展開の進行状況を確認します。展開が完了したら、Session Recordingをセットアップして実行します。Session Recordingをセットアップするには、インストールするSession Recordingサーバーのバージョンを指定して、resourceInfo.jsonファイルをアップロードする必要があります。

具体的な手順は次のとおりです:

  1. Session Recordingサービスの左側ナビゲーションで、[構成 ]>[サーバー管理] を選択します。

    [サーバー管理]ページ

  2. [サーバー管理] ページで、[サイトの作成] をクリックします。[サイトの作成] ページが開きます。

    サイトの作成ページ

  3. [Create and deploy a site through an ARM template] を選択します。主な手順は左側のナビゲーションに一覧表示されています。

    ARMテンプレートを使用してサイトを作成、展開する

  4. サイト名と説明を入力し、[次へ] をクリックします。

  5. (オプション)VMおよびストレージ構成の推奨事項を取得するには、録画のニーズに関する情報を提供してください。

    この手順をスキップするには [この手順をスキップします。] をクリックするか、何も選択せずに [次へ] をクリックします。

    録画のニーズ

    ドロップダウンリストからオプションを選択すると、選択に応じた推奨事項が表示されます。[リセット] ボタンは推奨事項の横にあります。このボタンで、そのセクションの選択と対応する推奨事項をクリアできます。

  6. Azureポータルに移動し、選択したリージョンに新しい仮想ネットワークを作成し、新しい仮想ネットワークとVDAが接続されている仮想ネットワークの間に仮想ネットワークピアリングを設定します。次に、新しい仮想ネットワークにサブネットを追加します。サブネットIDを見つけて入力します。

    ネットワーク設定

    プライベートネットワーク内のリソース間の接続を維持するには、[Create private endpoints for storage and databases] チェックボックスをオンにします。

    [Create private endpoints for storage and databases] チェックボックスをオンにした後、次の点を考慮して別のサブネットIDを入力するかどうかを決定します:

    • Session RecordingサーバーをActive Directoryドメインに参加させる予定がない場合は、サブネットは必要ないため、サブネットIDフィールドは空のままにしておきます。
    • サブネットIDフィールドを空のままにすると、Session RecordingサーバーがAzure Active Directoryドメインに参加します。

    別のサブネットID

  7. (既にアプリケーションを登録している場合は、この手順をスキップしてください。)Azure ADテナントにアプリケーションを登録します。IDおよびアクセス管理機能をAzure ADに委任するには、アプリケーションを登録する必要があります。

    アプリケーションを登録するには2つの方法があります。

    方法1:

    1. 次のCitrix提供のスクリプトをコピーし、たとえばAppRegistration.ps1などの名前を付けます:

      <#
      .SYNOPSIS
          Copyright (c) Citrix Systems, Inc. All Rights Reserved.
      .DESCRIPTION
          Create Azure app registrations and give proper permissions for Citrix Session Recording service deployment
      .Parameter azureTenantID
      .Parameter azureSubscriptionID
      .Parameter appName
      .Parameter role
      #>
      
      [CmdletBinding()]
      Param(
          [Parameter(Mandatory = $true)] [String] $tenantId,
          [Parameter(Mandatory = $true)] [String] $subscriptionId,
          [Parameter(Mandatory = $true)] [String] $appName,
          [Parameter(Mandatory = $true)] [String] $role
      )
      
      if ($role -ne "Citrix Session Recording service" -and $role -ne "Citrix Session Recording Deployment" -and $role -ne "Contributor") {
          throw [System.Exception] "Invalid role '$role', only support 'Citrix Session Recording service', 'Citrix Session Recording Deployment', and 'Contributor'."
      }
      
      try {
          Get-InstalledModule -Name "Az.Accounts" -ErrorAction Stop
      }
      catch {
          Install-Module -Name "Az.Accounts" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force
      }
      try {
          Get-InstalledModule -Name "Az.Resources" -ErrorAction Stop
      }
      catch {
         Install-Module -Name "Az.Resources" -Scope CurrentUser -Repository PSGallery -SkipPublisherCheck -Force
      }
      
      Connect-AzAccount -TenantId $tenantId -Subscription $subscriptionId
      
      try {
      
          $azureAdApplication = Get-AzADApplication -DisplayName $appName
          if ($null -eq $azureAdApplication) {
              Write-Host "Create a new app registration for Citrix Session Recording" -ForegroundColor Green
              $azureAdApplication = New-AzADApplication -DisplayName $appName -AvailableToOtherTenants $false
          }
          else {
              Write-Host "App registration '$appName' already exists." -ForegroundColor Yellow
          }
      
          $azureAdApplicationServicePrincipal = Get-AzADServicePrincipal -DisplayName $appName
          if($null -eq $azureAdApplicationServicePrincipal) {
              $azureAdApplicationServicePrincipal = New-AzADServicePrincipal -AppId $azureAdApplication.AppId
              Write-Host "Create a service principal for app registration '$appName'" -ForegroundColor Green
          }else{
              Write-Host "Service principal already exists for app registration '$appName'" -ForegroundColor Yellow
          }
      
          if ($role -eq "Citrix Session Recording service" -or $role -eq "Citrix Session Recording Deployment") {
              $rootPath = Get-Location
              $customRolePath = $(Join-Path -Path $rootPath -ChildPath "sessionrecordingdeployment.json") | Resolve-Path
              $customRoleJson = Get-Content $customRolePath | ConvertFrom-Json
              $customRoleJson.AssignableScopes[0] = "/subscriptions/" + $subscriptionId
              $tmpCustomRolePath = Join-Path -Path $rootPath -ChildPath "sessionrecording_tmp.json"
      
              $roleDef = Get-AzRoleDefinition -Name $role
              if ($null -eq $roleDef) {
                  try {
                      $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath
                      Write-Host "Create a custom role '$role'" -ForegroundColor Green
                      New-AzRoleDefinition -InputFile $tmpCustomRolePath
                  }
                  catch {
                      Write-Host "Failed to create custom role, error: $_" -ForegroundColor Red
                      throw $_.Exception
                  }
              }
              else {
                  try {
                      $customRoleJson | Add-Member -MemberType NoteProperty -Name 'id' -Value $($roleDef.Id)
                      $customRoleJson | ConvertTo-Json -depth 32 | Set-Content $tmpCustomRolePath
                      Write-Host "Upadate the custom role '$role'" -ForegroundColor Green
                      Set-AzRoleDefinition -InputFile $tmpCustomRolePath
                  }
                  catch {
                      Write-Host "Failed to update custom role, error: $_" -ForegroundColor Red
                      throw $_.Exception
                  }
              }
          }
      
          $roleAssignment = Get-AzRoleAssignment -RoleDefinitionName $role -ObjectId $($azureAdApplicationServicePrincipal.Id)
          if ($null -eq $roleAssignment) {
              Write-Host "Assign role '$role' to app '$appName'" -ForegroundColor Green
              New-AzRoleAssignment -RoleDefinitionName $role -ApplicationId $azureAdApplication.AppId
          }
          else {
              Write-Host "Role '$role' already assigned to app '$appName'" -ForegroundColor Yellow
          }
      
          Write-Host "Tenant ID:                   $tenantId" -ForegroundColor Green
          Write-Host "Subscription ID:             $subscriptionId" -ForegroundColor Green
          Write-Host "Application ID:              $($azureAdApplication.AppId)" -ForegroundColor Green
          Write-Host "Service principal object ID: $($azureAdApplicationServicePrincipal.Id)" -ForegroundColor Green
      }
      catch {
          Write-Host "Failed to assign role assignment to this app, error: $_" -ForegroundColor Red
          Write-Host "Please make sure the current azure admin has permission to assign roles" -ForegroundColor Red
      }
      <!--NeedCopy-->
      
    2. 次のカスタム役割ファイルをコピーし、sessionrecordingdeployment.jsonという名前を付けます。このカスタム役割ファイルは、登録するアプリケーションに最小限の権限を割り当てるのに役立ちます。

      {
          "name": "Citrix Session Recording Deployment",
          "description": "This role has permissions which allow users to deploy Session Recording resources using an Azure Resource Manager template (ARM template). ",
          "assignableScopes": [
            "/subscriptions/*"
          ],
          "actions": [
            "Microsoft.Compute/availabilitySets/write",
            "Microsoft.Compute/virtualMachines/extensions/read",
            "Microsoft.Compute/virtualMachines/extensions/write",
            "Microsoft.Compute/virtualMachines/read",
            "Microsoft.Compute/virtualMachines/runCommands/read",
            "Microsoft.Compute/virtualMachines/runCommands/write",
            "Microsoft.Compute/virtualMachines/write",
            "Microsoft.ContainerInstance/containerGroups/read",
            "Microsoft.ContainerInstance/containerGroups/write",
            "Microsoft.KeyVault/vaults/PrivateEndpointConnectionsApproval/action",
            "Microsoft.KeyVault/vaults/read",
            "Microsoft.KeyVault/vaults/secrets/read",
            "Microsoft.KeyVault/vaults/secrets/write",
            "Microsoft.KeyVault/vaults/write",
            "Microsoft.ManagedIdentity/userAssignedIdentities/assign/action",
            "Microsoft.ManagedIdentity/userAssignedIdentities/read",
            "Microsoft.ManagedIdentity/userAssignedIdentities/write",
            "Microsoft.Network/dnsForwardingRulesets/forwardingRules/read",
            "Microsoft.Network/dnsForwardingRulesets/forwardingRules/write",
            "Microsoft.Network/dnsForwardingRulesets/read",
            "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/read",
            "Microsoft.Network/dnsForwardingRulesets/virtualNetworkLinks/write",
            "Microsoft.Network/dnsForwardingRulesets/write",
            "Microsoft.Network/dnsResolvers/outboundEndpoints/join/action",
            "Microsoft.Network/dnsResolvers/outboundEndpoints/read",
            "Microsoft.Network/dnsResolvers/outboundEndpoints/write",
            "Microsoft.Network/dnsResolvers/read",
            "Microsoft.Network/dnsResolvers/write",
            "Microsoft.Network/loadBalancers/backendAddressPools/join/action",
            "Microsoft.Network/loadBalancers/write",
            "Microsoft.Network/networkInterfaces/join/action",
            "Microsoft.Network/networkInterfaces/read",
            "Microsoft.Network/networkInterfaces/write",
            "Microsoft.Network/networkSecurityGroups/join/action",
            "Microsoft.Network/networkSecurityGroups/read",
            "Microsoft.Network/networkSecurityGroups/securityRules/read",
            "Microsoft.Network/networkSecurityGroups/securityRules/write",
            "Microsoft.Network/networkSecurityGroups/write",
            "Microsoft.Network/privateDnsZones/join/action",
            "Microsoft.Network/privateDnsZones/read",
            "Microsoft.Network/privateDnsZones/virtualNetworkLinks/read",
            "Microsoft.Network/privateDnsZones/virtualNetworkLinks/write",
            "Microsoft.Network/privateDnsZones/write",
            "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/read",
            "Microsoft.Network/privateEndpoints/privateDnsZoneGroups/write",
            "Microsoft.Network/privateEndpoints/read",
            "Microsoft.Network/privateEndpoints/write",
            "Microsoft.Network/publicIPAddresses/join/action",
            "Microsoft.Network/publicIPAddresses/read",
            "Microsoft.Network/publicIPAddresses/write",
            "Microsoft.Network/virtualNetworks/join/action",
            "Microsoft.Network/virtualNetworks/read",
            "Microsoft.Network/virtualNetworks/subnets/join/action",
            "Microsoft.Network/virtualNetworks/subnets/read",
            "Microsoft.Resources/deploymentScripts/read",
            "Microsoft.Resources/deploymentScripts/write",
            "Microsoft.Resources/deployments/operationstatuses/read",
            "Microsoft.Resources/deployments/read",
            "Microsoft.Resources/deployments/validate/action",
            "Microsoft.Resources/deployments/write",
            "Microsoft.Resources/subscriptions/resourceGroups/read",
            "Microsoft.Resources/subscriptions/resourceGroups/write",
            "Microsoft.Resources/templateSpecs/read",
            "Microsoft.Resources/templateSpecs/versions/read",
            "Microsoft.Resources/templateSpecs/versions/write",
            "Microsoft.Resources/templateSpecs/write",
            "Microsoft.Sql/servers/auditingSettings/write",
            "Microsoft.Sql/servers/databases/write",
            "Microsoft.Sql/servers/firewallRules/write",
            "Microsoft.Sql/servers/privateEndpointConnectionsApproval/action",
            "Microsoft.Sql/servers/read",
            "Microsoft.Sql/servers/write",
            "Microsoft.Storage/storageAccounts/PrivateEndpointConnectionsApproval/action",
            "Microsoft.Storage/storageAccounts/blobServices/containers/read",
            "Microsoft.Storage/storageAccounts/blobServices/containers/write",
            "Microsoft.Storage/storageAccounts/fileServices/shares/write",
            "Microsoft.Storage/storageAccounts/listkeys/action",
            "Microsoft.Storage/storageAccounts/read",
            "Microsoft.Storage/storageAccounts/write"
          ],
          "notActions": [],
          "dataActions": [],
          "notDataActions": []
        }
      <!--NeedCopy-->
      
    3. AppRegistration.ps1sessionrecordingdeployment.jsonを同じフォルダーに配置します。
    4. 必要に応じて、次のコマンドのいずれかを実行します。

      アプリケーションを作成し、前述のカスタム役割ファイル(sessionrecordingdeployment.json)を使用して最小限の権限を割り当てるには、次のコマンドを実行します:

      .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Citrix Session Recording Deployment"
      <!--NeedCopy-->
      

      アプリケーションを作成し、それにAzure組み込みの 共同作成者の役割を割り当てるには、次のコマンドを実行します:

      .\AppRegistration.ps1 -tenantId <tenant ID> -subscriptionId <subscription ID> -appName <application name> -role "Contributor"
      <!--NeedCopy-->
      

    方法2:

    Azure Portalにアクセスし、自分でアプリケーションを登録します。アプリケーションに適切な権限を付与します。必要な最小限の権限については、方法1sessionrecordingdeployment.jsonファイルを参照してください。

  8. 後でインストールするSession Recordingサーバーの構成を指定します。

    VMをSession Recordingサーバーとして作成する

    注:

    • [仮想マシンの数] フィールドには、推奨される数(設定されている場合)が事前に入力されています。必要に応じて数を変更します。
    • コスト見積もりは標準価格に基づいており、割引は考慮されていません。実際のコストは見積もりよりも低いことが予想されます。
  9. Session RecordingサーバーをVDAと同じドメインに参加させ、Session Recordingサーバーの証明書を指定します。

    • VDAがActive Directoryドメインに接続する場合は、[Join servers to an Active Directory domain] チェックボックスをオンにして、関連情報を入力します。

    • VDAがAzure Active Directory(AAD)ドメインに接続する場合は、[Join servers to an Active Directory domain] チェックボックスをオフにします。現在のサイトの作成が完了したら、Session Recordingサーバーを同じAADドメインに手動で参加させてください。純粋なAAD展開は、Session Recording 2402以降でのみ使用できることにご注意ください。

    サーバーをActive Directoryドメインに追加させる

    Azure Active Directoryドメインにサーバーを参加させる

  10. 録画ファイルを保存するために、Azureストレージアカウントとファイル共有を構成します。価格情報については、「Azure Filesの価格」を参照してください。

    録画ファイルを保存するためのAzureストレージアカウントとファイル共有を構成する

  11. Azureに2つのSQLデータベースを作成します。1つはSession Recordingデータベース(sessionrecordingという名称)として使用され、もう1つは管理者ログ データベース (sessionrecordingloggingという名称)として使用されます。

    ARMテンプレート用に2つのSQLデータベースを作成する

  12. ロードバランサーを作成して、Session Recordingサーバー間でワークロードを分散します。[ロードバランサーのアクセスを以下のアドレスのみに制限する] フィールドにVDAのIPアドレスまたは範囲を入力し、コンマ(,)で区切ります。価格情報については、「Load Balancerの価格」を参照してください。

    ARMテンプレートのロードバランサーの作成

  13. (オプション)作成するAzureリソースにタグを適用します。

    Azureリソースへのタグの適用

  14. Session RecordingサーバーをSession Recordingサービスに登録するためのセキュアクライアントを作成します。

    [クライアントの作成] をクリックすると、Citrixがユーザーに代わってセキュアクライアントを作成します。または、Citrix Cloudコンソールの [IDおよびアクセス管理]>[APIアクセス] タブを通じてセキュアクライアントを作成し、以下の情報を入力できます。

    [クライアントの作成]ボタン

  15. 作成するリソースの概要を表示し、必要に応じて鉛筆アイコンをクリックして設定を編集します。その後、[Download template] をクリックします。展開方法と展開するリソースを含むAEMテンプレートが、マシンのダウンロードフォルダーにダウンロードされます。新しく作成されたサイトは、[サーバー管理] ページでも確認できます。

    AEMテンプレートの概要

  16. ダウンロードフォルダーに移動し、ARMテンプレートを展開します。展開したファイルフォルダーを開き、アドレスバーに「PowerShell」と入力して Enterキーを押します。そのフォルダーからPowerShellウィンドウが開くまで待ちます。

  17. DeploySessionRecording.ps1という名称のJavaScript Object Notation(JSON)スクリプトを実行します。要求されたパラメーターの値を入力します。実際のパラメーターは、テンプレートの作成時に指定した設定によって異なります。例:

    ARMテンプレートスクリプトの実行

    ARMテンプレートスクリプトを実行するときに要求されるパラメーター

  18. Azureポータルに移動し、展開が含まれているリソースグループを見つけて、展開の進行状況を確認します。展開全体で 「Succeeded」と表示されるまで待ちます。

    Azureでの展開の進行状況

  19. Session Recordingサービスの [サーバー管理] ページに戻ります。新しく作成されたサイトを表示すると、Set upボタンが利用可能になっています。Set upをクリックしてSession Recordingをセットアップし、実行します。

    新しいサイトの横にあるSet upボタン

    Session Recordingを設定するための前提条件を確認する

    Session Recordingをセットアップするには、インストールするSession Recordingサーバーのバージョンを指定して、resourceInfo.jsonファイルをアップロードする必要があります。

    Session Recordingサーバーのバージョンを選択する

    リソース情報をアップロードする

    データベースの資格情報を入力します。

    データベースの資格情報を入力する

    [Start startup] をクリックします。その後、[サーバー管理] ページでセットアップの進行状況を確認できます。

    セットアップが進行中です

    セットアップ手順

    サーバー一覧で個々のサーバーのインストールの進行状況を確認できます。

    個々のサーバーのインストールの進行状況

    すべてのSession Recordingサーバーが一覧に使用可能として表示されたら、サイトの作成は完了し、指定したリソースがAzureに展開されます。

    ARMによる展開の完了