Skip to main content

Introduction

The purpose of this blog is to provide practical guidance for migrating MCS workloads from on-premises to a public cloud provider. 

Public cloud offerings seem to be all the rage recently as more companies are realizing the benefits. Whether it is cost (in some instances), mobility, agility, reduces compliance and management burden, or scalability, there are some very good advantages to moving to a public cloud solution when it makes sense to do so. SaaS solutions such as Microsoft Office 365 (now Microsoft 365) and PaaS solutions such as Citrix Cloud services such as Citrix DaaS have become proven strategies for a more modern world.  

However, what is involved in the process of migrating your current application delivery infrastructure from on-premises to the public cloud? This is a question that many customers are asking. Well, it’s more of what customers’ IT administrators are asking after their upper management tells them they ARE moving resources to the cloud. There is still a fair amount of IT admins out there who are skeptical about the public cloud, but most CIOs are pushing this direction to remain competitive within their respective markets, and IT administrators need to embrace the change. However, for the change to make sense, technical IT architects and engineers need to know what is involved. A colleague of mine, Zeljko Macanovic, wrote a great blog on the Citrix Automated Configuration Tool (ACT). This tool can be very useful for migrating the Citrix Site configuration data from an on-premises Citrix Virtual Apps and Desktops (CVAD) Site to Citrix DaaS. It can also be used to automate your configuration as well, such as: 

  • Syncing your Citrix DaaS site from “Test” or “Stage” to “Production”. 
  • Backing up and restoring your Citrix Site configuration. 
  • Migrating from one public cloud region to another. 

One of the benefits of the ACT is that it will migrate the existing Machine Catalogs configuration. However, Citrix ACT does NOT automate the migration of the actual workloads (VDAs aka Virtual Desktop Agents) from their current virtualization platform to the new platform. VDAs are also known as workloads and they are VMs (virtual machines) running an operating system such as Windows 10 or 11 or Server 2016, 2019, or 2022 or variants of Linux. These VDAs will consist of an OS and a set of installed applications that are made available to users to aid them in their job roles. An on-prem deployment of Citrix CVAD can publish desktops, applications, and resources from VDAs that are hosted in on-prem virtualization hypervisors like Citrix Hypervisor, VMware vSphere, Microsoft Hyper-V, or Nutanix AHV. The more robust Citrix DaaS platform provides the flexibility to publish desktops, applications, and resources from VDAs that are hosted in either on-prem virtualization hypervisors or public cloud solutions like Microsoft Azure, Amazon Web Services (AWS), IBM Cloud, or Google Cloud Platform (GCP). The images will all have virtualization drivers that are specific to the platform upon which they are running. Thus, if an image is running on VMware, it will not run on Citrix Hypervisor without changes to those drivers. If customers want to migrate their “common desktop” from an on-premises VMware hypervisor to Azure, then they can do so several different ways: 

  • Net New: Create new MCS master VMs from ISOs and install all the applications. This option is what I’d prefer in most cases, as new shiny images with fresh software installations seems like the best solution. However, in many cases it isn’t feasible to re-install all the software on new images. Whether it is because the software installation media and installation instructions cannot be located or the SME for the application is no longer with the company or that it may simply take way too much time to complete. 
  • Cloud Provider Migration Tools: Use tools from the cloud provider to migrate existing MCS maser images to the new cloud platform. Azure has Azure Migrate. GCP has Google Migrate for Compute Engine. AWS has the VM Import/Export tool or the AWS Management Portal for vCenter. 
  • Citrix Image Portability Service (IPS): Image Portability Service simplifies the management of images across various platforms. This feature is useful when you manage images between an on-premises Resource Location and a public cloud. We will focus the remainder of this blog on the IPS. 

With the IPS you can use a single tool to handle all the migration needs from on-prem to public cloud or vice versa. The Image Portability workflow begins when you use Citrix Cloud to start the migration of an image from your on-premises location to your public cloud subscription. After preparing your image, IPS helps you transfer the image to your public cloud subscription and prepare it to run. Finally, Citrix Provisioning (PVS) or Machine Creation Services (MCS) provisions the image in your public cloud subscription.  

Components 

The Image Portability Service is comprised of the following components: 

  • Citrix Cloud Services 
  • Citrix Credential Wallet 
  • Citrix Connector Appliance 
  • Compositing Engine VM 
  • PowerShell Example Scripts 

Citrix Cloud Services uses a REST API service that interacts with the Image Portability Service. You can create and monitor Image Portability jobs using the REST API. 

Citrix Credentials Wallet service is used to securely manage the security credentials that are required to access SMB shares, hypervisors, and cloud providers.  

Compositing Engine (CE) is a VM and it is what drives the Image Portability Service. The Compositing Engine (CE) is a VM that is created in the same environment where the job is taking place; e.g. if the job is to export an image from Azure, then the CE is built in Azure. The CE mounts the targeted disk to itself and then does the necessary manipulations to the disk. Upon completion of the preparation or export job, the CE VM and all its components are deleted. 

Connector Appliance allows the Cloud Services to be able to communicate with Citrix Cloud. Image Portability requires Citrix Connector Appliances to create Image Portability jobs. Deploy one or more Connector Appliances in each of your Resource Locations. Note that the appliance is different than the Cloud Connector (software installed on a designated Windows VM) although we suspect Citrix may collapse these two connector constructs into one appliance in the future. 

The Connector Appliance is supported on the following hypervisors and clouds but reference this link for the latest details: 

  • Citrix Hypervisor 8.2 CU1 LTSR 
  • VMware ESXi version 7 update 2 
  • Hyper-V on Windows Server 2016, Windows Server 2019, or Windows Server 2022. 
  • Nutanix AHV 
  • Microsoft Azure 
  • AWS 
  • Google Cloud Platform 

Your hypervisor must provide the following minimum capabilities: 

  • 20 GB root disk 
  • 2 vCPUs 
  • 4 GB memory 
  • An IPv4 network 

PowerShell Modules are provided by Citrix and they are used within PowerShell scripts to develop your custom automation. You can use the modules as is or you may customize as you see fit. 

Shared SMB is where any export jobs are stored. The images are exported in VHDX format. 

Workflows 

The Image Portability Service uses a four-phase workflow to prepare an image and upload it to the public cloud subscription. Then the service will prepare the image for your public cloud platform. The last step involves publishing the image so that it can be deployed in a machine catalog. This process can be summarized in the following phases: 

  • Export Phase: Exports an image from its source platform in a portable format. 
  • Upload Phase: Uploads the exported image into the appropriate object on the destination platform. 
  • Prepare Phase: Prepares an image that is uploaded to a target platform for running on that platform. 
  • Publish Phase: Publishes the prepared image to be ready for streaming by Citrix Provisioning (PVS). Note: This phase is not required if you are using MCS and will be left out of this article. 

The following section details how to perform each of these phases using the available IPS PowerShell scripts. 

How to Utilize IPS

IPS has a group of PoSH (PowerShell) Cmdlets that are used for automating the workflows. The following section has examples of these PoSH scripts and how to use them. 

Prerequisites 

The PowerShell modules “Citrix.Workloads.Portability” and “Citrix.Image.Uploader” are required. You can download these modules from PSGallery 

Install the modules (Citrix.Workloads.Portability & Citrix.Image.Uploader): 

Install-Module -Name "Citrix.Workloads.Portability","Citrix.Image.Uploader"

Managing Citrix Credentials Wallet

Adding a new credential to the credential’s wallet:

Azure

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialType = 'Azure'
  CredentialId = 'id of credential to be created'
  AzureClientId = 'Azure service principal client ID'
  AzureSecret = 'Azure service principal secret'
  AzureTenantId = 'Azure tenant ID'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
New-IpsCredentials @Params [-OverwriteLog]

AWS

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialType = 'Aws'
  CredentialId = 'id of credential to be created'
  AwsKeyId = 'AWS access key ID'
  AwsKey = 'AWS secret access key'
  AwsSessionToken = '<optional> AWS temporary credential session token'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
New-IpsCredentials @Params [-OverwriteLog]

GCP

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialType = 'Gcp'
  CredentialId = 'id of credential to be created'
  GcpServiceAccountKeyFile = 'local path of your google cloud service account key file'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
New-IpsCredentials @Params [-OverwriteLog]

vSphere, AHV, XenServer, or SMB File Share

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialType = 'UsernamePassword'
  CredentialId = 'id of credential to be created'
  UserDomain = 'your user domain'
  UserName = 'your user name'
  UserPassword = 'your user password'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
New-IpsCredentials @Params [-OverwriteLog]

Listing the Credentials

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialType = '<optional> type of credential (Azure, Gcp or UsernamePassword) (list all credentials if not given)'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
Get-IpsCredentials @Params [-OverwriteLog]

Note: If you need to modify any of the credentials after the initial creation, just simply re-run using the “Set-IpsCredentials” command.

Deletion of Credentials

$Params = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = '<optional> your Citrix secure client ID'
  SecureSecret = '<optional> your Citrix secure secret'
  CredentialId = 'id of credential to be daleted'
  LogFileName = '<optional> log file name (default: Credentials.log)'
}
Remove-IpsCredentials @Params [-OverwriteLog]

Export

The export job creates a Compositing Engine VM (CE). Then attaches the image being exported and instructs the CE to export the image to the target SMB share. The export job will require credentials from the Credential Wallet to create the CE VM and for writing to the SMB share.

Export from vSphere

$ExportParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbCwId = 'SMB credential wallet ID'
  ResourceLocationId = 'Citrix Cloud resource location ID'
  VsphereCwSecretId = 'vsphere credential wallet ID'
  VsphereHost = 'hostname.domain.com'
  VspherePort = '<optional> port of vsphere host (default: 443)'
  VsphereSslCaCertificateFilePath = '<optional> the file path of certificate'
  VsphereSslCaCertificate = '<optional> certificate string'
  VsphereSslNoCheckHostname = '<optional> boolean if not to check the host name (default $false)'
  VsphereDataCenter = 'data center name'
  VsphereDataStore = 'data store name'
  VsphereResourcePool = '<optional> resource_pool_name (default: Resources)'
  VsphereNetwork = 'VM Network'
  VsphereHostSystem = '<optional> if specified the Export job will be executed by the Host specified in this field'
  VsphereCluster = '<optional> if specified the Export job will be executed by the Cluster specified in this field'
  SourceDiskName = "ds:///vmfs/volumes/5b916afa-1cb036d4-622f-0025b50a01cf/folder/disk.vmdk"
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 7200)'
  LogFileName = '<optional> log file name (default: ExportVsphereToSmb.log)'
}
Start-IpsVsphereExportJob @ExportParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Export from AHV

$ExportParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbCwId = 'SMB credential wallet ID'
  ResourceLocationId = 'Citrix Cloud resource location ID'
  CwSecretId = 'AHV credential wallet ID'
  PrismHost = 'hostname.domain.com'
  PrismPort = '<optional> port of Prism host (default: 9440)'
  PrismSslCaCertificateFilePath = '<optional> the file path of certificate'
  PrismSslCaCertificate = '<optional> certificate string'
  PrismSslFingerprint = '<optional> fingerprint of the Prism SSL certificate (alternative to PrismSslCaCertificate )'
  PrismSslNoCheckHostname = '<optional> boolean if not to check the host name (default $false)'
  ClusterUuid = 'UUID of cluster where the source image or virtual machine resides '
  SubnetUuid = 'UUID of subnet of the Nutanix system to use for the export'
  SourceImageUuid = "<optional> UUID of the image on the Prism server that will be exported (either SourceImageUuid or SourceVmUuid must be provided)"
  SourceVmUuid = "<optional> UUID of the virtual machine on the Prism server that will be exported (either SourceImageUuid or SourceVmUuid must be provided)"
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 7200)'
  LogFileName = '<optional> log file name (default: ExportAhvToSmb.log)'
}
Start-IpsAhvExportJob @ExportParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Export from XenServer

$ExportParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbCwId = 'SMB credential wallet ID'
  ResourceLocationId = 'Citrix Cloud resource location ID'
  CwSecretId = 'Xen credential wallet ID'
  XenHost = 'hostname.domain.com'
  XenPort = '<optional> port of XenServer host (default: 443)'
  XenSslFingerprint = '<optional> fingerprint of the XenServer SSL certificate'
  Network = 'name of the XenServer network to use for the export'
  SourceDiskUuid = "UUID of virtual disk on the XenServer that will be exported"
  StorageRepositoryUuid = "UUID of the XenServer storage repository to use for the export"
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 7200)'
  LogFileName = '<optional> log file name (default: ExportXenToSmb.log)'
}
Start-IpsXenExportJob @ExportParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Export from Azure

$ExportParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdxDiskFormat)'
  SmbCwId = 'SMB credential wallet ID'
  ResourceLocationId = 'Citrix Cloud resource ID'
  AzureSubscriptionId = 'Azure subscription ID'
  CloudCwSecretId = 'Azure credential wallet ID'
  AzureLocation = '<optional> Azure location (default: eastus)'
  TargetResourceGroup = 'target resource group name'
  AzureVirtualNetworkResourceGroupName = 'Azure vnet resource group name'
  AzureVirtualNetworkName = 'Azure vnet name'
  AzureVirtualNetworkSubnetName = 'Azure subnet name'
  UsePublicIP = '<optional> boolean if public ip is used (default: $false)'
  CloudDiskName = 'disk-name'
  AzureVmResourceGroup = '<optional> resource group name of vm'
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 7200)'
  LogFileName = '<optional> log file name (default: ExportAzureToSmb.log)'
}
Start-IpsAzureExportJob @ExportParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Export from GCP

$ExportParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdxDiskFormat)'
  SmbCwId = 'SMB credential wallet ID'
  ResourceLocationId = 'Citrix Cloud resource ID'
  CloudCwSecretId = 'Google Cloud credential wallet ID'
  GcpZone = 'us-east4-a'
  VpcNetworkName = 'networkname'
  VpcNetworkSubnetName = '<optional> regions/us-east4/subnetworks/subnetname'
  NetworkTags = '<optional> an array of network tags'
  UsePublicIP = '<optional> boolean if public ip is used (default: $false)'
  PrepareDiskName = 'output-disk-name'
  AzureVmResourceGroup = '<optional> resource group name of vm'
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 7200)'
  LogFileName = '<optional> log file name (default: ExportGcpToSmb.log)'
}
Start-IpsGcpExportJob @ExportParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Upload

Upload the exported image to the destination platform. This will be a manual process, not an operation managed by the IPS. Prior to moving to the preparation phase, the exported image must be the appropriate object type on the target or destination platform. If the destination platform is Azure, then you must create an Azure Managed disk. If the destination platform is Google Cloud, then you must create a GC image. If the destination is AWS, then you must create an Elastic Block Storage (EBS) snapshot.

Upload to Azure

$UploaderParams = @{
  CloudPlatform = 'azure'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbUserDomain = 'your SMB server user domain'
  SmbUserName = 'your SMB server user name'
  AzureSubscriptionId = 'Azure subscription ID'
  AzureLocation = 'eastus'
  TargetResourceGroup = 'target resource group name'
  CloudDiskName = 'disk name'
  AzureStorageType = '<optional> the storage type of disk (must be one of Standard_LRS, Premium_LRS, StandardSSD_LRS , Premium_ZRS or StandardSSD_ZRS) (default: Premium_LRS)'
  AzureClientId = '<optional> Azure service principal client ID'
  AzureSecret = '<optional> Azure service principal secret'
  AzureTenantId = '<optional> Azure tenant ID'
}
Copy-Disk @UploaderParams [-Force] [-OverwriteLog] [-Install] [-Verbose]

Upload to AWS

$UploaderParams = @{
  CloudPlatform = 'aws'
  SmbHost = 'hostname of SMB server where the disk to be uploaded is stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbUserDomain = 'your SMB server user domain'
  SmbUserName = 'your SMB server user name'
  AwsRegion = '<optional> AWS region e.g. us-east-1'
  AwsProfileName = '<optional> AWS profile name e.g. IPS'
}
$snapshotId = Copy-Disk @UploaderParams [-Force] [-OverwriteLog] [-Install] [-Verbose]

Upload to GCP

$UploaderParams = @{
  CloudPlatform = 'gcp'
  SmbHost = 'hostname of SMB server where the exported disk will be stored'
  SmbPort = '<optional> SMB server host port'
  SmbShare = 'SMB server share name'
  SmbPath = '<optional> pathtodisk'
  SmbDiskName = 'name of disk with no extension'
  SmbDiskFormat = '<optional> format of disk (must be one of VhdDiskFormat or VhdxDiskFormat) (default: VhdDiskFormat)'
  SmbUserDomain = 'your SMB server user domain'
  SmbUserName = 'your SMB server user name'
  CloudDiskName = 'disk name'
  GcpServiceAccountKeyFile = 'local path of your Google Cloud service account key file'
}
Copy-Disk @UploaderParams [-Force] [-OverwriteLog] [-Install] [-Verbose]

Prepare

Prepare an image for running on the target / destination platform, so that the image has the platform tools needed to run on the destination platform. The preparation process will remove the source hypervisor components and add any required components for the target platform.

Prepare Image on Azure

$PrepareParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  CloudProvisioningType = 'provisioning type (Mcs or Pvs)'
  CloudCwSecretId = 'Azure credential wallet ID'
  CloudDiskName = 'disk name'
  DomainUnjoin = $false # (boolean, default $false) if set, remove domain from image. Removes joined domain from Windows image.
  InstallMisa = $true # (boolean, default $true) if set install MISA, required when the source provisioning type is PVS and the destination provisioning type is MCS
  InstallPvs = '2206' # (string, default $null) version of the PVS server the image will be used with, for example 2206, 7.33, or 2203cu1 (required if provisioning type is PVS)'
  ForceMisa = $false # (boolean, default $false) if install latest MISA, overwriting existing version'
  XdReconfigure = @(
    [pscustomobject]@{
      ParameterName = 'controllers'
      ParameterValue = 'The fully qualified domain name of your cloud connector'
    }
  )
  ResourceLocationId = 'Citrix Cloud resource ID'
  AzureSubscriptionId = 'Azure subscription ID'
  AzureLocation = 'eastus'
  TargetResourceGroup = 'target resource group name'
  AzureVirtualNetworkResourceGroupName = 'Azure vnet resource group name'
  AzureVirtualNetworkName = 'Azure vnet name'
  AzureVirtualNetworkSubnetName = 'Azure subnet name'
  UsePublicIP = '<optional> boolean if public ip is used (default: $false)'
  AzureVmResourceGroup = '<optional> resource group name of vm'
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 3600)'
  LogFileName = '<optional> log file name (default: PrepareAzure.log)'
}
Start-IpsAzurePrepareJob @PrepareParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Prepare Image on AWS

$PrepareParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  CloudProvisioningType = 'provisioning type (Mcs or Pvs)'
  CloudCwSecretId = 'Google Cloud credential wallet ID'
  CloudDiskName = 'disk name'
  DomainUnjoin = $false # (boolean, default $false) if set, remove domain from image. Removes joined domain from Windows image.
  InstallMisa = $true # (boolean, default $true) if set install MISA, required when the source provisioning type is PVS and the destination provisioning type is MCS
  InstallPvs = '2206' # (string, default $null) version of the PVS server the image will be used with, for example 2206, 7.33, or 2203cu1 (required if provisioning type is PVS)'
  ForceMisa = $false # (boolean, default $false) if install latest MISA, overwriting existing version'
  XdReconfigure = @(
    [pscustomobject]@{
      ParameterName = 'controllers'
      ParameterValue = 'The fully qualified domain name of your cloud connector'
    }
  )
  ResourceLocationId = 'Citrix Cloud resource ID'
  GcpZone = 'us-east4-a'
  VpcNetworkName = 'networkname'
  VpcNetworkSubnetName = '<optional> regions/us-east4/subnetworks/subnetname'
  NetworkTags = '<optional> an array of network tags'
  UsePublicIP = '<optional> boolean if public ip is used (default: $false)'
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 3600)'
  LogFileName = '<optional> log file name (default: PrepareAws.log)'
}
Start-IpsGcpPrepareJob @PrepareParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Prepare Image on GCP

$PrepareParams = @{
  CustomerId = 'your Citrix customer ID'
  SecureClientId = 'your Citrix secure client ID'
  SecureSecret = 'your Citrix secure secret'
  CloudProvisioningType = 'provisioning type (Mcs or Pvs)'
  CloudCwSecretId = 'Google Cloud credential wallet ID'
  CloudDiskName = 'disk name'
  DomainUnjoin = $false # (boolean, default $false) if set, remove domain from image. Removes joined domain from Windows image.
  InstallMisa = $true # (boolean, default $true) if set install MISA, required when the source provisioning type is PVS and the destination provisioning type is MCS
  InstallPvs = '2206' # (string, default $null) version of the PVS server the image will be used with, for example 2206, 7.33, or 2203cu1 (required if provisioning type is PVS)'
  ForceMisa = $false # (boolean, default $false) if install latest MISA, overwriting existing version'
  XdReconfigure = @(
    [pscustomobject]@{
      ParameterName = 'controllers'
      ParameterValue = 'The fully qualified domain name of your cloud connector'
    }
  )
  ResourceLocationId = 'Citrix Cloud resource ID'
  GcpZone = 'us-east4-a'
  VpcNetworkName = 'networkname'
  VpcNetworkSubnetName = '<optional> regions/us-east4/subnetworks/subnetname'
  NetworkTags = '<optional> an array of network tags'
  UsePublicIP = '<optional> boolean if public ip is used (default: $false)'
  Tags = '<optional> a hashtable of custom tags to be added to all related resources (default: [pscustomobject]@{})'
  Timeout = '<optional> timeout of proceeding image job in second (default: 3600)'
  LogFileName = '<optional> log file name (default: PrepareGcp.log)'
}
Start-IpsGcpPrepareJob @PrepareParams [-Force] [-OverwriteLog] [-Verbose] | Wait-IpsJob

Once these steps have been completed, review the machine catalogs in the target cloud platform to ensure the Citrix VDAs have been properly migrated to the target destination platform.

In Conclusion

The public cloud offerings are here, and the adoption is spreading faster than you might think. One day soon, you will likely find yourself needing a tool like IPS. Although there are other cloud migration tools available in the world today, with a little bit of work, IPS can be a great way to move Citrix images to the public cloud.

 

Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments

Redefine Your Approach to Technology and Innovation

Schedule a call to discover how customized solutions crafted for your success can drive exceptional outcomes, with Ferroque as your strategic ally.