AWS Lesson 117 of 123

AWS WorkSpaces VDI for a Regulated Contact Center

In a nutshell

Imagine the difference between owning a DVD and streaming a film. With the DVD, the movie lives on a disc in your house — lose the disc and you have lost the movie, and anyone who finds it can watch it. With streaming, the movie never leaves the provider’s datacenter; your TV just receives a live picture and sends back your play and pause clicks. A virtual desktop works the same way. The Windows PC an agent uses does not run on the plastic box on their desk — it runs on a server inside AWS, and the device in front of the agent receives a live, encrypted video of that desktop and sends back mouse moves and keystrokes. The real computer, and every file on it, stays in the cloud.

That idea has a name — VDI, virtual desktop infrastructure — and Amazon WorkSpaces is AWS’s managed service for it. AWS runs the desktops, the streaming, the patching of the host, and the identity plumbing; you rent desktops by the hour or the month instead of buying, imaging, and shipping laptops. The rest of this article is a production reference architecture that uses WorkSpaces to solve a hard, specific problem: a health-insurance contact center that must let 2,200 agents touch protected health information without any of it ever landing on a device that could walk out the door.

If you are new to this, hold onto one sentence, because everything else hangs off it: the desktop and its data live inside your AWS network, and the endpoint only ever sees pixels. Lose the laptop, and you have lost a screen, not the data behind it.

What you need first. You will get the most from this if you already understand a VPC and its subnets, security groups, and NAT (AWS VPC deep dive), plus the basics of encryption keys (AWS KMS deep dive). A first brush with Active Directory and single sign-on helps but is not required — the terms are defined in the glossary at the end.

After this lesson you will be able to:

Level: Intermediate · Time: ~45 min

A health-insurance payer runs a 2,200-seat contact center across three time zones, and its VP of operations has run out of patience with the laptop model. Agents handle protected health information all day — claim status, prior-authorization details, a member’s diagnosis codes — on company laptops that go home in backpacks. Two of those laptops were lost last quarter; both were encrypted, but the breach-notification lawyers still spent a week reconstructing exactly what each agent had open. Meanwhile the payer is hiring 400 seasonal agents for open enrollment, and the desktop team cannot image, ship, and recover 400 machines in six weeks and then claw them back in February. The ask from the VP is blunt: “Agents should log into a desktop that lives in our cloud, touch PHI that never lands on local disk, and disappear cleanly when the season ends — and it has to pass a HIPAA audit.” This article is the reference architecture for that, built on AWS WorkSpaces.

The pressures here are the ones that make VDI worth the trouble. Regulation means every PHI access needs an audit trail and the data physically cannot rest on an endpoint that walks out the door. Elasticity means scaling from 1,800 to 2,200 seats for ten weeks and back, without a procurement cycle. Cost means a seasonal agent who works 40 hours a week should not cost the same as a full-time one who lives in the desktop. And security means a contact-center floor — high turnover, bring-anything devices, the single most phished population in any company — is treated as hostile by default. Persistent virtual desktops in AWS solve all four at once: the desktop and its data stay inside your VPC, the endpoint becomes a dumb pixel-and-keystroke terminal, and you pay per running desktop instead of per shipped laptop.

Why not the obvious shortcuts

Three cheaper-sounding options get proposed on every project like this, and each fails in a way that matters.

Encrypted laptops with MDM is where most payers start, and it is exactly what this payer is fleeing. Full-disk encryption protects data at rest, but the data still is at rest on the device, so a lost laptop is a forensic event and a possible breach notification every single time. MDM can wipe a device — eventually, if it checks in. The contact-center reality of 80% annual turnover means you are perpetually shipping, recovering, and re-imaging hardware.

A self-managed VDI stack — your own connection brokers, gateway servers, image-management tooling, and a fleet of GPU and CPU hosts — gives you control and hands you a second full-time platform to operate. For a contact center whose differentiator is answering member calls, not running a desktop-virtualization product, that is undifferentiated heavy lifting. AWS WorkSpaces is the managed alternative: AWS runs the brokers, the streaming protocol, the patching of the underlying host, and the directory plumbing.

Streaming a single application (just the claims app) instead of a full desktop sounds leaner, but agents live in a dozen tools at once — the claims system, a soft phone, a knowledge base, email, the scheduling portal — and stitching all of those into per-app streams is more work and a worse experience than giving them one governed desktop. The full WorkSpace is the honest unit here.

The building blocks: what a WorkSpace actually is

The architecture below moves fast, and it assumes a vocabulary. Before we walk the topology, here are the pieces every WorkSpaces design is assembled from. If you learn these six ideas — bundle, image, running mode, protocol, directory, and the persistent-versus-not choice — the rest of the article reads like plain English.

A WorkSpace is a bundle running inside a directory

A single WorkSpace is one virtual desktop belonging to one person. Two things define it. The bundle is the desktop’s hardware-and-software recipe: a compute type (how many vCPUs and how much memory) married to an image (the operating system plus everything pre-installed). The directory is the identity layer that decides who is allowed to log in and who they are once inside — their username, their group memberships, the policies that apply to them.

Because this is WorkSpaces Personal — the persistent flavour — each agent keeps their own WorkSpace between sessions. Their documents, their browser bookmarks, their app settings all sit on a user volume (the D: drive) that survives logoff, reboot, and even a rebuild. That persistence is exactly what makes a WorkSpace feel like “my computer” rather than a kiosk, and it is the first fork in the road we will come back to.

Bundles and images: the desktop’s DNA

AWS publishes public bundles you can launch immediately, sized along a ladder of compute types:

Compute type vCPU / RAM (guide) Typical fit
Value 1 / 2 GB Kiosk, single web app
Standard 2 / 4 GB Phone agent: soft phone + browser + one line-of-business app
Performance 2 / 8 GB Power user juggling many tools
Power 4 / 16 GB Heavy multitasking, light development
PowerPro 8 / 32 GB Engineering, large datasets
Graphics.g4dn / GraphicsPro.g4dn GPU-backed Medical imaging, CAD, GPU workloads

A custom bundle is how real fleets are built. You launch one WorkSpace, install the agent toolset, the EDR sensor, and your baseline policy, then create an image from it — a frozen snapshot of that configured desktop. Wrap the image with a compute type and you have a custom bundle that stamps out identical desktops. This is the “golden image” the article’s provisioning path refers to. The one rule that saves teams from chaos: version your images and pin bundles to a specific version. An unpinned image means two agents provisioned a week apart get subtly different desktops and your change control quietly evaporates.

By default a Windows WorkSpace runs Windows Server with the Desktop Experience, licensed by AWS and dressed up to look like Windows 10 or 11 — no license of your own required. If you need a genuine Windows 10/11 client OS (some software or compliance regimes insist on it), BYOL — Bring Your Own License — runs your own Microsoft licenses on dedicated hardware. BYOL has a floor: AWS requires a commitment of roughly 100+ WorkSpaces per month in a Region to allocate the dedicated hosts, and you must hold qualifying Microsoft licensing. At 2,200 seats our payer clears that floor easily, which puts genuine Windows 11 on the menu.

Running modes: AlwaysOn vs AutoStop — this is the bill

Every WorkSpace runs in one of two modes, and the choice is the invoice:

The whole game is the break-even point. With representative Standard-bundle numbers — AlwaysOn at $35/month, AutoStop at $16/month plus $0.30 per running hour (illustrative; check the current WorkSpaces pricing page for your Region and bundle) — the two cost the same at:

break-even hours = (AlwaysOn monthly - AutoStop monthly fee) / AutoStop hourly rate
                 = ($35 - $16) / $0.30
                 ~= 63 running hours per month

Below roughly 63 running hours a month, AutoStop is cheaper; above it, AlwaysOn is. That is why running mode is a per-persona, per-usage decision, not a matter of taste. A seasonal agent who only ever powers the desktop during scheduled shifts — ramped onboarding, part weeks, no nights or weekends — stays under the line and saves. One who settles into steady full-time hours crosses it, and the WorkSpaces Cost Optimizer (an AWS solution you deploy, not a checkbox) watches real usage and flips those seats to monthly automatically so no human has to. There is also a Manual running mode for cases where you start and stop desktops on your own schedule through the API.

The streaming protocol: PCoIP vs WSP/DCV

The “live video of the desktop” travels over a streaming protocol, and WorkSpaces offers two:

PCoIP WSP / DCV
Origin Teradici, the original protocol Amazon’s own (WorkSpaces Streaming Protocol, now branded Amazon DCV)
Best on Stable, low-latency networks High-latency or lossy links (home broadband, distant Regions)
Feature set Mature but essentially frozen Webcam, two-way audio, smart-card/CAC sign-in, higher resolutions, FIPS; new features land here first
Ports TCP/UDP 4172 + TCP 443 TCP/UDP 4195 + TCP 443
Recommendation Legacy fleets Default for anything new

WSP leans on UDP so a few dropped packets soften the picture for a moment instead of freezing it — which is exactly what you want for remote agents on imperfect home networks. New builds should choose WSP/DCV unless a specific dependency pins them to PCoIP.

The directory: Simple AD vs AD Connector vs Managed Microsoft AD

WorkSpaces cannot exist without a directory, and AWS Directory Service gives three:

Directory What it is MFA / GPO Choose it when
Simple AD Small Samba-based directory, AWS-run No RADIUS MFA Cheapest, standalone, no on-prem AD, modest needs
AD Connector A proxy to your existing on-prem AD; stores no directory data in AWS MFA via your on-prem RADIUS You already run AD and want to keep it authoritative
AWS Managed Microsoft AD Real Microsoft AD (actual Windows domain controllers) run by AWS Full GPO, RADIUS MFA, trusts, multi-Region You need Group Policy, trusts to on-prem, or multi-Region — the enterprise default

This architecture uses AWS Managed Microsoft AD for one decisive reason: Group Policy. The no-local-storage lockdown — clipboard off, drive-mapping off, USB and printer redirect off — is enforced as GPO on the domain, so it applies to every desktop uniformly and no agent can toggle it. Simple AD cannot do that; AD Connector could lean on on-prem GPO but makes the on-prem link a hard dependency. Managed Microsoft AD also unlocks the multi-Region directory the resilience section needs.

Persistent or disposable: Personal vs Pools vs Core

WorkSpaces is a family, and the split that matters most is whether the desktop remembers you:

Model Persistence Good for
WorkSpaces Personal Persistent — one desktop per user, state survives Knowledge workers, regulated agents, anyone with per-user setup (this article)
WorkSpaces Pools Non-persistent — a fresh desktop from a shared pool each session; user data offloaded to a home folder and application-settings persistence High-turnover task work, training rooms, shift pools where any desktop will do
WorkSpaces Core AWS-managed WorkSpaces desktops driven by a partner control plane (Citrix, Omnissa Horizon, Workspot, Leostream) Shops standardised on a third-party VDI broker who want AWS to run the desktops underneath

Why did this design pick Personal when a contact center is the poster child for the shift work Pools targets? Because agents accumulate genuine per-user state — a configured soft phone, browser sessions into a dozen tools, saved knowledge-base tabs, accessibility settings — and re-establishing all of that on a fresh pool desktop every login is friction the floor would revolt against. Pools would win if the agent state were truly disposable (pure call-taking on a single hardened web app, no personalisation); then the running fleet could be smaller than the headcount because desktops float. It is the right question to ask on every VDI project; here the answer is Personal, but say why, not “because.”

WorkSpaces vs AppStream 2.0

The article’s “just stream the claims app” shortcut has a real product behind it — Amazon AppStream 2.0, which streams individual applications (or a session desktop) from an auto-scaling fleet rather than giving each user a durable machine:

WorkSpaces (Personal) AppStream 2.0
Unit A full, persistent desktop per user An application (or session desktop), non-persistent
State Kept per user Ephemeral (optional home folder)
Fits Someone’s primary computer all day Deliver one app to many; occasional or temporary users; unmanaged devices

For agents who live in a dozen tools at once, the full desktop is the honest unit — which is why the article rejects the single-app path. AppStream shines for the opposite shape: hand a contractor one internal app for a week without provisioning them a desktop. (Note that WorkSpaces Pools now overlaps AppStream for non-persistent desktops, so the modern choice is usually Personal versus Pools, with AppStream reserved for true single-app delivery.)

Who gets in: MFA and IP access control groups

There are two independent places to demand a second factor, and mixing them up is a classic stumble:

Layer on IP access control groups: allow-lists of CIDR ranges permitted to open a session at all. Attach the corporate egress /24 and the VPN /24, and a stolen Okta session from a coffee-shop IP still cannot connect. Combined with device access control (permit Windows and Web clients, deny Android/iOS/personal macOS), a valid credential is necessary but no longer sufficient — you also have to be on an approved network and an approved client.

# Allow-list the source networks that may open a WorkSpaces session
resource "aws_workspaces_ip_group" "corp" {
  name        = "corp-and-vpn-egress"
  description = "Only HQ egress and the VPN may connect"
  rules { source = "203.0.113.0/24"  description = "HQ egress" }
  rules { source = "198.51.100.0/24" description = "VPN pool"  }
}

# Register the directory with WorkSpaces and clamp access
resource "aws_workspaces_directory" "corp" {
  directory_id = aws_directory_service_directory.corp.id
  subnet_ids   = [aws_subnet.ws_az_a.id, aws_subnet.ws_az_b.id]
  ip_group_ids = [aws_workspaces_ip_group.corp.id]

  workspace_access_properties {
    device_type_windows    = "ALLOW"
    device_type_web        = "ALLOW"
    device_type_osx        = "DENY"
    device_type_ios        = "DENY"
    device_type_android    = "DENY"
    device_type_linux      = "DENY"
    device_type_chromeos   = "DENY"
    device_type_zeroclient = "DENY"
  }

  self_service_permissions {
    change_compute_type  = false
    increase_volume_size = false
    rebuild_workspace    = false
    restart_workspace    = true
    switch_running_mode  = false
  }

  workspace_creation_properties {
    enable_internet_access              = false # reach the internet via NAT, not a public IP
    user_enabled_as_local_administrator = false
    custom_security_group_id            = aws_security_group.workspaces.id
  }
}

Talking to the phones: Amazon Connect inside the desktop

A contact center needs telephony, and the modern AWS answer is Amazon Connect — a cloud contact center whose agent softphone, the Contact Control Panel (CCP), runs right in the browser. Put the CCP inside the WorkSpace and the agent’s whole world — calls, claims app, knowledge base — lives on the governed desktop, nothing on the endpoint. The one nuance to design for: audio then travels PSTN → Connect → the browser in the WorkSpace → streamed to the endpoint, so you watch end-to-end voice latency and give the WorkSpace enough headroom (a Standard bundle is fine for one softphone; stacking heavy apps on a Value bundle is not). The companion lesson Cloud-native contact center on AWS covers Connect itself in depth.

How a WorkSpace touches the network

Each WorkSpace places a network interface (an ENI) in your VPC’s private subnet — that is the desktop’s own address on your network, and the security group you attach governs its traffic. To browse the public internet the desktop routes out through a NAT gateway in a public subnet (never a public IP on the desktop itself); to reach PHI backends it stays entirely private over VPC routing, PrivateLink, or a Direct Connect / Transit Gateway path to on-prem. There is a second, AWS-managed interface that carries the streaming and health-check traffic — you do not see it and your security group does not govern it — but that distinction is an internals point we return to in Going deeper.

A worked example: the seasonal 400

Put the pieces together for the article’s open-enrollment surge. Four hundred seasonal phone agents, each on a Standard bundle in AutoStop because they work scheduled shifts:

Architecture overview

AWS WorkSpaces VDI for a Regulated Contact Center — architecture

The platform has two paths that share infrastructure but run on different clocks: the session path an agent walks through every shift, and the provisioning path the platform team runs to create, patch, and retire desktops. Keeping them mentally separate is the first step to operating this cleanly.

The defining property of the whole topology — the one the security and compliance teams care about most — is that the desktop and all PHI live inside your VPC, and the endpoint device only ever receives encrypted pixels. Nothing of substance crosses to the client. No claim detail, no member record, no document is written to the agent’s local laptop, tablet, or thin client. That single property is what turns a lost endpoint from a breach into a shrug.

Session path, following the control flow:

  1. An agent opens the WorkSpaces client (or the web access page) on whatever endpoint they have — a locked-down thin client on the office floor, or a home PC for remote agents. Authentication does not happen against a local password. The client redirects to Okta, the payer’s workforce identity provider, which enforces the real front door: the agent’s credentials, a phishing-resistant MFA factor (FIDO2 or Okta Verify push with number challenge), and a device-and-network conditional-access policy.
  2. Okta is federated into the desktops’ directory via AWS Directory Service — specifically AWS Managed Microsoft AD — so the WorkSpace boots as a domain-joined machine with the agent’s own identity, group memberships, and Group Policy applied. SAML federation means the WorkSpaces login itself is brokered through Okta; the agent never types a Windows password.
  3. The agent connects over the WSP/DCV streaming protocol to their persistent WorkSpace, which lives in private subnets across two Availability Zones in the payer’s VPC. The session is the only thing that traverses the network to the endpoint, and it is TLS-encrypted end to end.
  4. Inside the desktop the agent reaches the line-of-business systems — the claims platform, the soft phone, the member-record system — over private connectivity (VPC routing, PrivateLink endpoints, or a Direct Connect/Transit Gateway path to on-prem cores). PHI moves between the WorkSpace and those backends inside AWS’s private network, never out to the client.
  5. Data-loss-prevention controls clamp the session boundary: clipboard redirection, local-drive mapping, USB redirect, and printer redirect are all disabled by policy, so an agent cannot copy a member’s record to their home machine, save a PDF to a USB stick, or paste claim data into a personal email. The WorkSpace’s own volumes are EBS-encrypted with a customer-managed KMS key.
  6. Every meaningful event — logon, logoff, session start, the WorkSpace’s OS and application audit logs, and PHI-system access — is shipped to CloudWatch Logs and CloudTrail, aggregated centrally, and retained for the HIPAA-mandated window. This is the audit trail the compliance officer signs.

Provisioning path, run by the platform team and largely automated: desktops are defined as persona-tuned bundles (the compute/memory/storage profile each role needs), built from a golden custom image that already contains the agent toolset, the CrowdStrike Falcon sensor, and the DLP baseline. New agents are provisioned by group membership — adding an identity to the right Okta/AD group creates their WorkSpace from the matching bundle. Terraform declares the directory, the bundles-to-groups mapping, the networking, and the logging; an automation runbook (Lambda or a scheduled job) handles seasonal scale-up and the clean teardown when enrollment season ends.

Component breakdown

Component Service / tool Role in the platform Key configuration choices
Virtual desktop AWS WorkSpaces Persistent, domain-joined desktop per agent inside the VPC Persona bundles; AutoStop/AlwaysOn per persona; WSP protocol; cross-AZ subnets
Directory AWS Directory Service (Managed Microsoft AD) Domain join, Group Policy, group-based provisioning Two-AZ deployment; GPO for DLP lockdown; conditional forwarder to on-prem AD
Identity / SSO Okta Workforce SSO + phishing-resistant MFA + conditional access SAML federation to WorkSpaces; FIDO2/number-challenge MFA; device & geo policy
Endpoint security CrowdStrike Falcon EDR on every WorkSpace; runtime detection piped to the SOC Sensor baked into the golden image; sensor tags by persona; detections to SIEM
DLP boundary WorkSpaces policy + GPO No local storage, no clipboard/USB/printer exfil Clipboard/drive/USB/printer redirect = off; idle lock + disconnect timers
Encryption AWS KMS Customer-managed keys for WorkSpace volumes CMK with rotation; key policy scoped to the WorkSpaces service role
Private connectivity VPC / PrivateLink / Transit Gateway PHI backends reached without traversing the public internet Private subnets; PrivateLink to claims APIs; DX/TGW to on-prem member core
Audit & logging CloudWatch Logs + CloudTrail HIPAA-aligned access trail and session telemetry Central log account; long-retention log groups; CloudTrail data events on KMS/S3
Network edge Akamai Protects public web-access endpoint; bot/DDoS at the perimeter WAF on the WorkSpaces web-access origin; geo controls on the login page
Observability Datadog Session health, login latency, capacity & cost dashboards WorkSpaces metrics + custom logon-time metric; alerting on broker errors
ITSM / approvals ServiceNow Onboarding, access requests, incident records Access request triggers group add; auto-ticket on Falcon detection or DLP breach
Provisioning / IaC Terraform Directory, bundles, networking, logging as code OIDC to AWS (no stored creds); bundle-to-group map; image pinned by version

A few of these choices deserve the why, because they are where teams on this exact project go wrong.

Why persona bundles, not one-size-fits-all. A contact center is not uniform. A tier-1 phone agent runs a soft phone, a browser, and the claims app — a Standard bundle (2 vCPU, 4 GB) is plenty, and at scale that frugality is the difference between a defensible and an absurd bill. A clinical-review nurse cross-references imaging and runs heavier tools and wants a Performance or Power bundle. A workforce-management lead lives in spreadsheets and dashboards across multiple monitors. Mapping each role to a right-sized bundle, and binding that bundle to an AD group, means provisioning is a membership change and cost tracks actual need rather than a worst-case spec applied to everyone.

Persona WorkSpaces bundle (guide) Running mode Why
Tier-1 phone agent Standard (2 vCPU / 4 GB) AutoStop, hourly Soft phone + browser + claims app; idle gaps between shifts
Senior / escalation agent Performance (2 vCPU / 8 GB) AutoStop, hourly Heavier multitasking, more concurrent tools
Clinical review nurse Power (4 vCPU / 16 GB) AlwaysOn, monthly Imaging cross-reference, near-full-time utilization
WFM / team lead Performance, multi-monitor AlwaysOn, monthly Dashboards across screens, steady all-day use
Seasonal enrollment agent Standard (2 vCPU / 4 GB) AutoStop, hourly Short tenure, predictable shift hours, ruthless cost control

Why AutoStop is the cost lever — and where it bites. WorkSpaces bills either monthly (a flat rate for an always-running desktop) or hourly (a small fixed fee plus an hourly charge only while the desktop is in use, via AutoStop). For a seasonal agent working 40 hours a week, AutoStop hourly is dramatically cheaper than a monthly seat that sits idle 75% of the time. The tradeoff is a cold-start delay: a stopped WorkSpace takes a minute or two to resume on first login. For shift-based agents that is invisible — they log in once and stay — but for a persona that logs in and out all day it is friction. The rule of thumb: AutoStop for shift workers and seasonal staff, AlwaysOn (monthly) for high-utilization, near-full-time roles. AWS publishes a built-in cost-optimizer that flips bundles between modes based on observed usage; let it, and watch the savings in Datadog.

Why DLP lives in policy, not in training. “Don’t copy PHI to your personal machine” as a written policy is a control that depends on every one of 2,200 high-turnover agents choosing to comply. That is not a control a HIPAA auditor respects. Instead, the session boundary is clamped technically: clipboard redirection off (no copy-out to the local OS), local drive mapping off (the WorkSpace cannot see the endpoint’s disk and vice versa), USB and printer redirect off, and an idle timer that locks and then disconnects an unattended session. These are enforced through the WorkSpaces directory settings and Group Policy on the Managed Microsoft AD, so they apply to every desktop uniformly and cannot be toggled by the agent.

# WorkSpaces directory DLP posture (enforced, not advisory)
Clipboard redirection:        DISABLED   # no copy from WorkSpace to local
Local drive (storage) access: DISABLED   # endpoint disk invisible to session
USB redirection:              DISABLED   # no USB exfil
Printer redirection:          DISABLED   # no print-to-local
Idle disconnect:              15 min lock / 30 min disconnect
Volume encryption:            KMS CMK (root + user volumes)

Implementation guidance

Provision with Terraform, and treat the directory and network as the first deliverables. The order matters: WorkSpaces cannot launch until the directory exists, is registered with the WorkSpaces service, and lives in subnets across two Availability Zones for resilience.

  1. The VPC with private subnets in two AZs for the WorkSpaces, plus the routing/PrivateLink/Transit Gateway paths to the PHI backends.
  2. AWS Managed Microsoft AD spanning both AZs, with a conditional forwarder to on-prem AD if hybrid identity is in play, and Group Policy objects encoding the DLP lockdown.
  3. The Okta SAML federation to WorkSpaces, so the login is brokered through Okta with MFA and conditional access — agents never authenticate against a local credential.
  4. A golden custom image built from a base WorkSpace: agent tools installed, the CrowdStrike Falcon sensor embedded and verified, the DLP baseline applied, then captured as a custom bundle per persona.
  5. The bundle-to-group mapping and the logging pipeline (CloudWatch Logs + CloudTrail to a central, locked-down log account).

A minimal Terraform shape for the directory and a persona bundle communicates the intent — two AZs, encryption on, identity-driven:

resource "aws_directory_service_directory" "corp" {
  name     = "agents.payer.internal"
  type     = "MicrosoftAD"
  edition  = "Standard"
  vpc_settings {
    vpc_id     = aws_vpc.workspaces.id
    subnet_ids = [aws_subnet.ws_az_a.id, aws_subnet.ws_az_b.id]
  }
}

resource "aws_workspaces_workspace" "tier1_agent" {
  directory_id = aws_directory_service_directory.corp.id
  bundle_id    = var.tier1_standard_bundle_id   # persona-tuned image
  user_name    = var.agent_username             # resolved from AD group

  root_volume_encryption_enabled = true
  user_volume_encryption_enabled = true
  volume_encryption_key          = aws_kms_key.workspaces.arn

  workspace_properties {
    running_mode                              = "AUTO_STOP"   # seasonal/shift
    running_mode_auto_stop_timeout_in_minutes = 60
  }
}

Pin the bundle to an explicit image version. An unpinned “latest” image means two agents provisioned a week apart get different desktops, and your golden-image change control evaporates.

Failure modes and resilience

The honest failure analysis for VDI is about availability of the desktop itself, because when the desktop is the workplace, an outage is the whole floor going dark.

Scaling and cost

Scaling a contact center is bursty and seasonal, which is precisely the shape WorkSpaces fits. For open enrollment, the platform team adds the seasonal agents’ identities to the enrollment AD group, and the automation provisions their Standard AutoStop WorkSpaces in batches. When the season ends, the same automation deregisters the identities and terminates the WorkSpaces, and the cost stops the same day — no laptops to chase down, no asset-recovery backlog.

Cost discipline comes from three levers stacked together:

The comparison that justifies the whole program to finance is rarely WorkSpaces versus nothing — it is WorkSpaces versus the fully loaded cost of laptops: hardware refresh, imaging, shipping both ways, asset recovery, the help-desk load of physical machines, and the un-budgetable cost of a single lost-laptop breach notification. Against that baseline, a per-agent monthly desktop charge with no device logistics and no PHI-on-endpoint risk is an easy story.

Security and compliance

This is where the architecture earns its keep, because HIPAA is the reason it exists.

A signed AWS Business Associate Addendum (BAA) is the legal foundation, and WorkSpaces, Directory Service, KMS, CloudWatch, and CloudTrail are all HIPAA-eligible services operated within that BAA’s scope. The architecture then implements the controls the BAA presumes:

The explicit tradeoff to put on the table: this architecture concentrates risk in identity and in the directory. When login is federated through Okta and desktops are domain-joined to Managed Microsoft AD, those two systems become the keys to the contact-center floor. That concentration is a feature — one place to enforce MFA, one place to revoke access, one audit trail — but it demands that Okta and the directory are treated as tier-0 systems with their own hardening, monitoring, and break-glass procedures. Centralized identity is the right call here; pretending it isn’t also a single point of failure is not.

Going deeper

Everything above gets a fleet running. This section is for the engineer who has to operate it at 2,200 seats and answer the hard questions in the audit and the incident review.

The two-interface network model

A running WorkSpace has two network interfaces, and confusing them is the most common networking mistake on this service. The primary interface lives in your VPC subnet, carries the desktop’s own traffic to your apps and out through NAT, and is governed by the security group you assign. A second, AWS-managed interface carries the streaming protocol and health checks to the WorkSpaces service; its address comes from an AWS-owned range, and your security group does not apply to it. Practical consequences: locking down the primary interface’s security group controls what the desktop can reach, but it never blocks the streaming plane; and the client’s connection to the streaming gateway rides public AWS endpoints on TCP/UDP 4195 (WSP) or 4172 (PCoIP) plus 443, which is why the WorkSpaces client works from a home network with no VPN. The VPN, when present, is for the desktop’s reach into private backends, while who may connect at all is enforced by IP access control groups at the front.

Encryption is a launch-time, immutable decision

WorkSpaces volume encryption uses KMS envelope encryption on the root and user EBS volumes, and the fact that trips teams up is that you choose it when the WorkSpace is created and cannot change it afterward. There is no “encrypt this existing WorkSpace” button — an unencrypted desktop has to be rebuilt as a new, encrypted one. So encryption belongs in the golden pipeline and the Terraform defaults from day one, never as a later remediation. The KMS key policy must grant the WorkSpaces service and the directory’s role permission to use the CMK (kms:CreateGrant, Encrypt, Decrypt, GenerateDataKey); miss that and provisioning fails with an opaque error. Rotate the CMK on a schedule and keep it in the same Region as the fleet — keys do not cross Regions, which matters for the cross-Region story below.

Restore, rebuild, migrate, reboot — and your real RPO

Four recovery verbs, each doing something different, and the on-call needs them cold:

Action Root volume User volume Use when
Reboot Kept Kept Hung session, routine restart
Restore Rolled back to last snapshot Rolled back to last snapshot Corruption; you accept losing recent changes
Rebuild Rebuilt from the bundle image Restored from last snapshot OS broken, keep the user’s data
Migrate Recreated from a new bundle Preserved (old profile moved aside) Change bundle/OS, e.g. Windows 10 → 11

The number that surprises people: WorkSpaces takes automatic snapshots roughly every 12 hours, and restore/rebuild use the most recent one. So your worst-case data-loss window (RPO) for anything living only on the WorkSpace is up to ~12 hours. The design answer in a regulated shop is that important data should not live only on the desktop at all — it belongs in the backend systems of record over the private path, with the WorkSpace as a view onto it, not the vault.

Cross-Region resilience: connection aliases and DNS redirect

A single WorkSpace is pinned to the AZ of its subnet and does not float — fleet resilience comes from spreading across two AZs so an AZ event costs a fraction of the floor. For a Region-level event you need cross-Region redirection, which has four moving parts: (1) standby WorkSpaces provisioned in Region B, (2) a multi-Region Managed Microsoft AD (or an AD trust) so identities exist in both, (3) a connection alias — a fully-qualified domain name — associated with the directory in both Regions, and (4) Route 53 health-checked failover on that FQDN. Clients connect to the alias, not a Region; when the primary’s health check fails, DNS points them at Region B. It is genuinely expensive — you are paying for standby desktops — so it is reserved for the seats whose downtime is intolerable, not the whole fleet.

The metrics that actually tell you the floor is fine

CloudWatch publishes WorkSpaces metrics under the AWS/WorkSpaces namespace, and four earn a dashboard and an alarm:

Wire WorkSpaces access events through EventBridge and management API calls through CloudTrail into the central log account, and you have both the security trail and the operational one. The CloudWatch and CloudTrail deep dive covers the alarming patterns.

Quotas, throttling, and the surge

Provisioning 400 desktops in a batch runs into real limits. There is a default cap on WorkSpaces per Region (a soft limit — raise it through a Service Quotas request well before enrollment week, not during), IP access control groups cap at 25 groups per directory and 10 rules each, and the provisioning APIs throttle, so batch creation should be paced and retried with backoff rather than fired in one burst. The lesson learned the expensive way: file the quota increase and load-test the provisioning runbook a month ahead, because a quota denial at 8 a.m. on day one of open enrollment is a very public failure.

Non-persistent at scale: when Pools changes the math

If a subset of the floor really is disposable — single hardened web app, zero personalisation — WorkSpaces Pools can undercut Personal because the running fleet can be smaller than the headcount: desktops float, so 300 concurrent agents might need 320 pooled desktops, not 400 assigned ones. Pools offloads the little per-user state it keeps (a home folder, application settings) to managed storage, autoscales on a schedule or on utilisation, and bills for capacity in use. The trade is the persistence you give up. Many mature contact centers run a hybrid: Personal for tenured, personalised agents; Pools for high-turnover seasonal call-takers on a locked single app.

GPU, smart cards, and the stricter regimes

Two capabilities matter for the harder personas and the harder audits. GPU bundles (Graphics.g4dn / GraphicsPro.g4dn) give the clinical-review nurse smooth imaging cross-reference that a CPU desktop stutters on — reserve them for the seats that need it, because they are the priciest tier. Smart-card / CAC sign-in and certificate-based auth are supported over WSP/DCV (not PCoIP), which is decisive for government and defense-adjacent regimes. For those regimes, WorkSpaces also runs in AWS GovCloud with FedRAMP authorisation and FIPS 140-2 validated endpoints — the same architecture, a stricter compliance boundary.

Compliance scope and data residency

WorkSpaces is a HIPAA-eligible service under the AWS BAA, in scope for PCI DSS, and covered by SOC 1/2/3 and ISO reports — but “eligible” means you still have to configure it right; the BAA does not encrypt your volumes or lock your clipboard for you. Data residency is a Region choice: a WorkSpace’s compute, its EBS volumes, and its snapshots stay in the Region you launch it in, which is how you satisfy a “PHI must remain in-country” clause — you simply do not launch the fleet outside the permitted Region, and you keep the KMS keys, the logs, and any cross-Region standby inside the compliant geography too.

Practice challenges

Work these in order; each collapsible Solution holds a worked answer and a one-line reason. No live account is needed — reason them through or sketch the Terraform.

1. Pick the running mode (beginner). A workforce-management lead is signed in about 9 hours a day, 5 days a week. AutoStop or AlwaysOn? Use the representative break-even of ~63 running hours per month.

<details><summary>Solution</summary>

AlwaysOn (monthly). ~9 h × 5 days × ~4.3 weeks ≈ 193 running hours/month, far above the ~63-hour break-even, so the flat monthly rate is cheaper and avoids cold starts. Why: above break-even, hourly billing costs more than the flat monthly, and a near-full-time user gets no benefit from AutoStop’s idle savings. </details>

2. Choose the directory (beginner). You already run Active Directory on-prem and your security team forbids storing directory data in AWS. Which Directory Service option backs WorkSpaces?

<details><summary>Solution</summary>

AD Connector. It proxies authentication to your existing on-prem AD and stores no directory data in AWS. Why: Simple AD is a separate cloud directory and Managed Microsoft AD stores data in AWS; only AD Connector keeps on-prem AD authoritative with nothing persisted in the cloud. </details>

3. Restrict where sessions can start (intermediate). Only the HQ egress 203.0.113.0/24 and VPN 198.51.100.0/24 should be able to open a WorkSpaces session. Sketch it.

<details><summary>Solution</summary>

Create an aws_workspaces_ip_group with a rules entry per CIDR, then attach it via ip_group_ids on aws_workspaces_directory (see the code in the building-blocks section). Why: IP access control groups gate session establishment by source IP, so a valid credential from an unlisted network is still refused. </details>

4. Block personal devices (intermediate). Compliance says agents may connect only from the Windows client or Web access — never Android, iOS, personal macOS, Linux, ChromeOS, or zero clients. Where do you set this?

<details><summary>Solution</summary>

In workspace_access_properties on aws_workspaces_directory: set device_type_windows = "ALLOW" and device_type_web = "ALLOW", and every other device_type_* to "DENY". Why: device access control is enforced by the service at connection time, independent of identity, so an approved user on an unapproved device is blocked. </details>

5. Do the break-even math (advanced). With AlwaysOn at $35/mo and AutoStop at $16/mo + $0.30/hr (representative), at how many running hours do they cost the same, and which is cheaper for a seasonal agent running 160 hours a month?

<details><summary>Solution</summary>

Break-even = ($35 − $16) / $0.30 ≈ 63 hours/month. At 160 hours, AutoStop ≈ $16 + 160 × $0.30 = $64 versus $35 on AlwaysOn → AlwaysOn is far cheaper. Why: 160 h is well above break-even; a full-month worker belongs on monthly, and the Cost Optimizer would move them there automatically. </details>

6. Design Region failover for the top 50 seats (advanced). Executives and escalation leads cannot tolerate a Region outage. List the four things that must exist for cross-Region redirection.

<details><summary>Solution</summary>

(1) Standby WorkSpaces provisioned in Region B; (2) a multi-Region Managed Microsoft AD (or AD trust) so identities exist in both; (3) a connection alias (FQDN) associated with the directory in both Regions; (4) Route 53 health-checked failover on that FQDN. Why: a WorkSpace is AZ-pinned and cannot float across Regions, so failover is DNS redirecting users to pre-provisioned standby desktops backed by a directory that spans both Regions. </details>

Common beginner mistakes

These are misconceptions, not symptom-fix tickets — the wrong mental model, and the right one.

Glossary

Wrapping up

The payer’s VP wanted three things: PHI that never lands on a device that can be lost, a fleet that scales for enrollment season and shrinks cleanly afterward, and an audit trail that passes a HIPAA review. AWS WorkSpaces delivers all three by inverting the laptop model — the desktop and its data stay in the VPC, the endpoint becomes a disposable terminal, and identity, encryption, DLP, EDR, and logging are enforced uniformly from the cloud side rather than hoped for on 2,200 endpoints. Persona bundles keep the bill honest, AutoStop matches spend to shift reality, Okta federation puts a phishing-resistant front door on the floor, no-local-storage policy makes a lost endpoint a non-event, CrowdStrike Falcon watches the desktops where PHI actually lives, and CloudWatch/CloudTrail produce the record a compliance officer signs. It is not the cheapest desktop you can buy — it is the one a regulated contact center can defend.

AWSWorkSpacesVDIHIPAAOktaEnterprise
Need this built for real?

Vinod is a Senior Cloud Architect (22+ yrs) — available for Azure / AWS / GCP architecture, landing zones, and migrations.

Work with me

Comments