Azure Arc-enabled SQL Server
Azure Arc projects a SQL Server instance running anywhere β on-prem, AWS EC2, GCP, edge β into Azure as a first-class resource. Once Arc-enabled, the SQL Server can use a curated subset of Azure management services as if it were an Azure VM, without moving any data or changing the connection string the application uses.
Why customers care: Migrations take years. Arc gives you Azure governance, security, backup, and centralized monitoring on the SQL estate today, while the migration plan runs in parallel. It is the single most useful "starting point" service for an on-prem SQL DBA being told "we want to be on Azure".
At a glanceβ
Arc onboarding (agent + inventory + Best Practices Assessment) is free. Each value-add plan β Defender for SQL, Backup, Monitor / Log Analytics, Purview, ESUs β is opt-in and billed separately. Scope plans via Azure Policy rather than the subscription default if you want selective coverage.
Architectureβ
Capabilities unlocked by Arc for SQLβ
The two resource types you createβ
| Resource type | What it represents | Lifecycle |
|---|---|---|
Microsoft.HybridCompute/machines | The host OS (Windows / Linux server) | Lives until you uninstall the Connected Machine agent or az connectedmachine delete |
Microsoft.AzureArcData/sqlServerInstances | A SQL Server instance discovered on the host | Auto-created/removed by the Arc SQL extension |
Each instance also has a child collection of databases as readable Azure resources β useful for Resource Graph queries like "show me every SQL DB across the estate over 1 TB on a sub-2019 engine".
What Arc DOES vs DOES NOT doβ
- Outbound HTTPS only β TCP
443, TLS 1.2 - Sends telemetry + configuration only β no customer database data plane traffic
- Supports Managed Identity or Service Principal authentication
- Integrates with Azure RBAC, Policy, and Activity Logs
- Supports private connectivity via Azure Arc Private Link Scope
- Uses Microsoft-signed agents and extensions
- Does not open inbound ports
- Does not move customer database data
- Does not bypass firewall, proxy, or security controls
- Does not require domain admin privileges
- Does not require application or database changes
- Does not convert SQL Server into a PaaS service
What Arc for SQL is notβ
| Misconception | Reality |
|---|---|
| "Arc moves my database to Azure" | No data movement. Database stays where it runs; only metadata + telemetry flows to Azure. |
| "Arc converts SQL Server to Azure SQL DB" | No. The engine, version, patching cadence and feature surface are unchanged. |
| "Arc is a replacement for migration" | It's a bridge. Customers typically run Arc for 1β2 years while planning a move to Azure SQL MI / DB. |
| "Arc-enabled SQL is free" | The Arc agent + inventory + best practices assessment are free. Each value-add plan (Defender, Backup, Entra auth, ESUs) bills separately. |
| "Arc requires opening inbound ports" | False. All communication is outbound HTTPS from the host to Azure. No inbound exposure. |
Connectivity modesβ
| Mode | Use when | Trade-off |
|---|---|---|
| Direct | Host has outbound HTTPS to *.arc.azure.com, *.guestconfiguration.azure.com, login.microsoftonline.com | Simplest, full feature set, lowest latency for telemetry |
| Indirect (via Data Controller) | Air-gapped or proxied environments | More moving parts (Kubernetes-based DC); a few features lag; ~hourly upload cadence |
Required outbound URLs (direct mode)β
| Endpoint | Port | Purpose |
|---|---|---|
*.his.arc.azure.com | 443/TCP | Hybrid Identity Service β agent registration & heartbeat |
*.guestconfiguration.azure.com | 443/TCP | Guest configuration / policy delivery |
*.servicebus.windows.net | 443/TCP | Live troubleshooting (SSH / Run Command) |
login.microsoftonline.com | 443/TCP | Microsoft Entra authentication |
login.windows.net | 443/TCP | Legacy Entra endpoint |
management.azure.com | 443/TCP | ARM control plane |
*.blob.core.windows.net | 443/TCP | Extension downloads + VA storage |
packages.microsoft.com | 443/TCP | Signed agent + extension packages |
Customer firewall ticket = paste the table above + region tag.
Common interview / customer-call gotcha: When asked "how do I get Defender for SQL on a SQL Server running in AWS EC2?", the answer is always Arc-enable it first, then turn on the Defender for SQL plan on the Arc resource. Same answer for GCP, on-prem, edge, or co-lo.
Onboarding β minimum viable stepsβ
Single server (interactive)β
# 1. Register required resource providers (one-time per subscription)
az provider register --namespace Microsoft.HybridCompute
az provider register --namespace Microsoft.AzureArcData
az provider register --namespace Microsoft.GuestConfiguration
# 2. From the Azure portal: Azure Arc β SQL Server β Add β "Single server"
# Generates a script you run on the SQL Server host.
# The script:
# a) Installs the Connected Machine agent
# b) Authenticates to Azure (service principal or device code)
# c) Auto-installs the SQL Server Arc extension on instance discovery
# 3. Enable Defender for SQL on Arc SQL Server resources subscription-wide
az security pricing create --name SqlServerVirtualMachines --tier Standard
At-scale (PowerShell DSC / Group Policy / Ansible)β
For 10+ servers, use the at-scale onboarding script with a service principal:
# Run on each target host (Windows PowerShell 5.1+)
Invoke-WebRequest -Uri https://aka.ms/AzureConnectedMachineAgent -OutFile install.ps1
./install.ps1
& "$env:ProgramFiles\AzureConnectedMachineAgent\azcmagent.exe" connect `
--resource-group "rg-arc-sql" `
--tenant-id "<tenant>" `
--location "westeurope" `
--subscription-id "<sub>" `
--service-principal-id "<spn-app-id>" `
--service-principal-secret "<spn-secret>" `
--tags "estate=on-prem,env=prod"
The Arc SQL extension is auto-installed within ~10 minutes once the agent reports a SQL instance. Production estates use Microsoft Configuration Manager (SCCM) or Intune to push the same script.
Verificationβ
# List Arc SQL instances in a subscription
az resource list --resource-type Microsoft.AzureArcData/sqlServerInstances -o table
# Detail for one instance
az resource show \
--ids /subscriptions/<sub>/resourceGroups/<rg>/providers/Microsoft.AzureArcData/sqlServerInstances/<name>
Or in Azure Resource Graph Explorer:
Resources
| where type =~ 'Microsoft.AzureArcData/sqlServerInstances'
| project name, location, resourceGroup,
version=tostring(properties.version),
edition=tostring(properties.edition),
status=tostring(properties.status),
host=tostring(properties.containerResourceId)
| order by version asc
Decision matrix β Arc vs migrate vs nativeβ
| Scenario | Recommended | Why |
|---|---|---|
| SQL Server in own data center, no migration plan yet | Arc + Defender + Backup | Get governance/security wins today |
| SQL Server in AWS EC2 / GCP, want Microsoft-native security | Arc + Defender for SQL | One pane of glass, billed per vCore |
| Greenfield workload, no existing footprint | Azure SQL DB / MI (skip Arc) | PaaS economics; Arc adds cost without benefit |
| SQL Server already on an Azure VM | SQL IaaS Agent + Defender (no Arc) | Already an Azure resource; Arc would duplicate |
| End-of-life SQL 2012 / 2014 | Arc for ESUs | Pay monthly via Azure billing instead of upfront ESU contract |
| 100+ heterogeneous SQL instances, no inventory | Arc first for visibility | Build accurate inventory + assessment before migration planning |
| Edge / air-gapped manufacturing site | Arc indirect mode | Local SQL stays autonomous, Azure governance still applies |
Pairing with Defender for SQL β DCSA recipeβ
This is the most common combo a Microsoft account team recommends to a customer with a large on-prem / multi-cloud SQL footprint:
- Arc-enable the existing SQL fleet (zero data movement, ~30 min per host once Connected Machine agent is in place).
- Turn on Defender for SQL on the Arc resources β vulnerability scans + threat protection within hours.
- Pipe alerts to Microsoft Sentinel if the customer has a SOC.
- Use the time bought to plan a real migration to Azure SQL MI for the workloads that fit, and Azure SQL DB Hyperscale for the modern app tier.
See Defender for Cloud β Defender for SQL for the security-side detail.
Extended Security Updates (ESUs) via Arcβ
End-of-life SQL Server (2012, 2014, eventually 2016) needs Extended Security Updates to stay PCI/HIPAA compliant. Two delivery options:
| Option | How you pay | Best when |
|---|---|---|
| Volume Licensing ESU | Annual upfront, per core | You have a multi-year support commitment + flat estate |
| ESU via Arc | Monthly PAYG through Azure invoice | Estate is shrinking quarter-over-quarter due to migration |
Enabling is a single property on the Arc resource:
az sql server-arc extension update \
--resource-group <rg> --machine-name <host> \
--extension-name WindowsAgent.SqlServer \
--settings '{"ESU": "Enabled"}'
Patches arrive via Windows Update / WSUS as normal once activated.
Backup to Azure Blob via Arcβ
Arc-managed backups remove per-host scripting. Behaviors to know:
- Configured per-database with a retention policy (1β35 days PITR + up to 7 years long-term).
- Backups stream directly from the SQL host to Azure Blob (no intermediate host required).
- Restore works to: same host (overwrite or new name), another Arc host, or Azure SQL MI (cross-engine restore β limited compatibility).
- Cost = Blob storage + minimal Arc backup plan fee.
Limitations & gotchasβ
- Failover Cluster Instance (FCI) support: each node is Arc-enabled separately; Arc reports the active instance. Plan group naming carefully so the resource doesn't flip name on failover.
- Always On Availability Groups: each replica is its own Arc instance. The AG itself is not a top-level Azure resource β query via Resource Graph by joining on
properties.alwaysOnRole. - Express edition: limited Defender support; Best practices assessment may produce noisier output (SKU-aware rules pending).
- High frequency telemetry: ATP detectors expect β₯5 connections/min for some baselines β very low-traffic legacy DBs may not produce useful behavioral baselines.
- Linux SQL Server: supported but extension auto-deploy is sometimes slow; force with
az connectedmachine extension create --name WindowsAgent.SqlServer ...(yes, the extension keeps the Windows name on Linux). - Disconnected for > 30 days: the Arc resource enters a
Disconnectedstate and stops billing extensions. After 45 days the resource is auto-deleted. Build alerting on theconnectionStatusproperty. - Costs: Arc itself is free, but it's easy to inadvertently enable Defender on every Arc SQL β scope the Defender plan via Policy rather than subscription default if you want selective coverage.
Multi-cloud reality check (AWS / GCP)β
| Platform | Arc connectivity | Notes |
|---|---|---|
| AWS EC2 (Windows / Linux) | Direct mode via internet or VPN to Azure | Use IAM-issued temporary creds for the install script; keep tag cloud=aws for visibility |
| GCP Compute Engine | Direct mode | Same. Outbound HTTPS through GCP VPC firewall |
| VMware on-prem | Direct or indirect | At scale, use the Arc-enabled VMware vSphere integration to onboard whole vCenters |
| Hyper-V on-prem | Direct or indirect | At scale, use the Arc-enabled SCVMM integration |
| Air-gapped (gov / industrial) | Indirect mode only | Requires a Data Controller on local Kubernetes (AKS Edge, OpenShift, Tanzu) |
When not to recommend Arcβ
- Customer is committed to migrating in less than 6 months β Arc adds an extra hop they will throw away.
- The host has no outbound HTTPS and the customer cannot deploy a Data Controller β the indirect path may not be operationally viable.
- Workload is already on Azure VM with the SQL IaaS Agent β adding Arc on top creates duplicate resources and confuses billing.
- Tiny estate (1β2 servers) where the per-server VA scan + manual patching effort is already trivial β Arc's ROI shows up at scale.
- Customer's compliance regime forbids any out-of-region telemetry β verify Arc's data residency commitments before proposing.
Customer demo runbook (~10β12 min)β
A repeatable presenter flow that shows a non-Azure SQL Server become a first-class Azure resource in roughly ten minutes β without moving data or changing the application. Times are wall-clock with the agent pre-staged on the host.
Recommended positioningβ
A security-first, governance-led modernisation strategy. Arc lets the organisation act on its existing SQL estate before any migration decision is made.
This sequence reduces risk, accelerates decision-making, and ensures that migration β when it happens β is informed and controlled.
Optional value add β assessment-firstβ
Maximise the Arc onboarding by running a pre-assessment against each instance first using SQL security and configuration analysers (e.g. SQL DBSAT and the free Best Practices Assessment that ships with the Arc extension).
The assessment runs on-prem before any cloud connection β outputs stay with the customer until they choose to act. See Lab: SQL Security Assessment for the runnable script and scored HTML report.
Operational best practicesβ
- Tag at onboarding (
estate,env,business-unit,dr-tier) so Resource Graph queries are useful from day one. - Create a dedicated resource group per region for Arc resources β simplifies RBAC and policy scoping.
- Use a service principal with least privilege (
Azure Connected Machine Onboardingrole) for at-scale onboarding scripts; rotate the secret quarterly. - Monitor the
connectionStatusproperty with an Azure Monitor alert β disconnected agents = blind security posture. - Enable diagnostics to a Log Analytics workspace before turning on Defender β gives you 90 days of context for the first true positive alert.
- Document the uninstall path (
azcmagent disconnect && azcmagent uninstall) in your runbook β auditors ask.