Azure News - 2026-07-31

2026-07-31
最終更新: 2026-08-27 21:13:50 JST

Azure Updates

[In preview] Public Preview: Support for SMB Opportunistic Locking (Oplocks) configuration

Azure NetApp Files now supports configuration of SMB opportunistic locking (oplocks) for SMB and dual-protocol volumes. Opportunistic locks (Oplocks) improve SMB client caching and are enabled by default. You can configure oplocks on new volumes or update

[In preview] Public Preview: Symmetric keys on Azure Key Vault Premium

We’re announcing symmetric keys on Azure Key Vault Premium are now available in public preview. This preview enables customers and partners to evaluate symmetric encryption capabilities using the oct-HSM key type and the Advanced Encryption Standard (AES)

Announcing: Reservation exchanges for Azure services supported by savings plans will no longer be available starting February 1, 2027

Starting February 1, 2027, Azure reservations exchanges will no longer be available for services covered by savings plans. At the time of this announcement, this includes reservations for the following services: Compute services: Azure Virtual Machine

[Launched] Generally Available: Azure Automation supports PowerShell 7.6 runbooks and Runtime environment

Azure Automation is pleased to announce: General Availability of in-support PowerShell 7.6 runbooksRuntime Environment GA, enabling customers to seamlessly upgrade their outdated scripts to supported runtime versions. Support for Azure CLI commands in P

[Launched] Generally Available: Azure Database for PostgreSQL flexible server in India South Central

Now you can deploy Azure Database for PostgreSQL flexible server in the India South Central Azure region. Learn more.

Azure Architecture Blog

Skill or Sub-Agent. Choosing AI Capabilities You Will Actually Reuse

詳細を表示

Audience: Cloud architects, platform engineers, engineering leaders


The wrong first question

Most teams building AI capabilities start with the wrong question. They ask which model to use.

The model matters less than the shape of the capability around it. The first real fork is this. Are you building a skill or a sub-agent? Get that wrong and no model choice will save you. A skill and a sub-agent are two different delivery shapes, and each one fails at the other one's job.

The insight

The choice between a skill and a sub-agent is not about model power. It comes down to four checks. How the work iterates, whether the output carries a voice, how far an early wrong turn spreads, and how often it recurs. Score each, count which way they lean, and the shape falls out. An even split means build both, and let the skill drive the sub-agent.

The three sections below take the checks worth a pause. Frequency is the plain one: a one-off craft piece leans to a skill, a repeatable batch job to a sub-agent.

A skill lives inside the conversation. It reads files, asks a question, refines with the author, and keeps a human in the loop mid-flight. A sub-agent takes one prompt, runs to completion, and returns one report. Both are useful, for different work.

DimensionSkillSub-agent
IterationConversation, many turnsOne hand-off, one pass
VoiceHolds a style profile and applies itDrifts toward generic by design
Human gateEvery turnOnce, at the end
Best forCraft, subjective outputBounded, structured output

Table 1. The same three dimensions decide the shape every time.

1. Decide the iteration model first

Before anything else, architects should ask how the work actually happens. Is it a conversation or a hand-off? That single answer removes most of the ambiguity.

  • Craft work needs back and forth
  • Batch work needs one clean pass
  • Conversations need memory of the thread
  • Hand-offs need a bounded input and a clear output

A skill is right when the value comes from iteration. A blog post, a design review, a tricky refactor. A sub-agent is right when the work is well defined and the output is the deliverable.

In practice

The pattern that works: use a skill when the team expects three or four rounds of "close, but change this". The trade-off: a skill costs more attention per run because a human stays involved. The trap to avoid: forcing iterative craft into a one-shot agent and then editing the output by hand every time.

2. Voice fidelity decides craft work

Some outputs have a voice. An article, a customer email, an architecture narrative. Others do not. A query result, a data export, a status summary. The line between them is not cosmetic. It decides which shape survives review.

  • Voice-heavy work favours a skill
  • Voice-neutral work favours a sub-agent
  • Skills can hold a style profile and apply it
  • Sub-agents drift toward generic by design

When the output carries a name, fidelity is the whole game. A capable model with no voice anchor produces text that reads like it came from a committee.

In practice

The pattern that works: give a skill an explicit voice profile with banned phrases and cadence rules. Let it self-check before it shows anyone anything. The trade-off: the profile takes real effort to write once. The trap to avoid: expecting a stateless agent to match a personal style from a single prompt.

Implementation note

A voice profile is not documentation. It lives in the skill definition, an executable contract the skill checks itself against before a draft is ever shown. A small profile goes a long way.

# voice-profile (excerpt) banned_phrases: [seamless, robust, game-changing, leverage the power] forbid: [em-dash, semicolon, exclamation in body] max_avg_sentence_words: 20 require: - one "In practice" block per section - a closing discussion question self_check: run before any draft is shown to a human

3. Put the human gate where the risk is

Every AI capability needs a human review gate. The design question is where that gate sits. Placement is the difference between catching a problem early and unpicking it later.

  • Skills gate continuously, turn by turn
  • Sub-agents gate once, at the end
  • Continuous gates catch drift early
  • End gates are cheaper but riskier for craft

If a wrong turn early corrupts everything after it, the team wants a skill. If the work is bounded and a bad output is easy to spot and discard, an end gate is fine.

In practice

The pattern that works: match the gate to the blast radius. High blast radius and subjective quality point to a skill. Low blast radius and objective output point to a sub-agent. The trap to avoid: a one-shot agent doing forty minutes of unattended work that a human then has to unpick.

4. The pattern that scales is both

The mature answer is not one or the other. It is a skill on top of a sub-agent. The two shapes compose cleanly when each one keeps to its own job.

  • The skill orchestrates and holds the voice
  • The sub-agent executes bounded sub-tasks
  • The human reviews at the skill layer
  • Each layer does what it is good at

Figure 1. In the combined pattern the human reviews at the skill layer, and the sub-agent only touches the bounded task.

The skill runs the conversation and keeps quality. When it needs a bounded, repeatable job done, it delegates to a sub-agent. The result is iteration where craft lives and automation where the work is mechanical.

In practice

The pattern that works: a skill drafts and refines an article with the author, and calls a sub-agent to fetch and summarise reference material. The trade-off: two layers are more to build than one. The trap to avoid: collapsing both into a single agent and losing either the voice or the automation.

The operational trade-offs

Shape is not only a design choice. It shows up in cost, latency, and how you debug a bad run. Architects should price these in before committing to a pattern.

  • A skill spends more tokens and more human minutes per run
  • A sub-agent spends compute once and returns fast
  • A skill fails in small, visible steps you can correct
  • A sub-agent fails as one block you inspect after the fact

The cost of a skill is attention. Someone stays in the loop and that time is real. The cost of a sub-agent is rework. When a one-shot run goes wrong, the whole output is suspect and someone redoes it. Observability follows the same split. A skill leaves a turn-by-turn trail you can read. A sub-agent leaves one input and one output. You instrument the boundary and log the prompt and the result. Pick the shape whose failure mode your team can afford. The wrong shape does not announce itself. It shows up later as a cost line or a rewrite.

Two capabilities, one team

Consider a team standardising its engineering work with AI. Two capabilities land on the backlog in the same week. The first is recurring status queries. Well defined input, structured output, no voice. A stateless sub-agent fits. One prompt in, one report out, gate at the end. It works on day one and keeps working.

The second is authored technical content. Subjective, voice-heavy, many rounds of refinement. The reflex is to reuse the sub-agent that just shipped. That reflex is the mistake. The queries stay clean. The content reads flat and generic, and every draft needs a heavy human rewrite. Rebuilt as a skill with a voice profile and a turn-by-turn gate, the same work compounds instead of fighting back. Same team, same models, two different shapes of work, and only one right tool for each.

What teams get wrong

The common pattern is defaulting to whichever shape the team built first. A team ships one sub-agent, likes it, and forces every new problem into a sub-agent. Or it builds one skill and runs everything as a conversation, including batch work that should be automated.

It looks like consistency. It feels like reuse. But it leads to craft work that reads generic and batch work that needs babysitting. The fix is not a better model. It is naming the shape of the work before picking the tool.

The three shapes to watch for in your own stack:

  • A voiced deliverable coming out of a one-shot agent, rewritten by hand every run. A skill wearing a sub-agent costume.
  • A batch job run as a conversation and babysat turn by turn. A sub-agent wearing a skill costume.
  • A large workflow forced into one agent that holds neither the voice nor the automation. Two shapes collapsed into one.

Name which one you are looking at, and the fix picks itself.

A quick way to decide

When a new capability lands on the backlog, run four checks before picking a tool.

  • Iteration: conversation or one hand-off
  • Output: subjective and voiced, or structured and neutral
  • Blast radius: does an early wrong turn corrupt the rest
  • Frequency: a one-off craft piece, or a repeatable batch job

Three or more answers leaning subjective and iterative point to a skill. Three or more leaning structured and repeatable point to a sub-agent. A split answer usually means a skill orchestrating a sub-agent underneath.

Figure 2. Score the four checks and count the leanings. Three or four one way pick the shape. An even split means a skill orchestrating a sub-agent.

Where to start depends on what you have already built

The framework is the destination. Where you start depends on what your team has shipped so far. Find your stage and take the one first move for it this week.

StageFirst move, this weekWatch out for
Just starting, nothing built yetPick the single task you repeat most and write a one-paragraph capability brief for it, iteration, output, blast radius, and frequency, before you build. The brief names the shape, and the shape names the tool.Building a general assistant before you have named one concrete job.
One capability, reused for everythingList every job you push through the one tool, find the one whose shape does not match, and rebuild just that one in the right shape. You do not need to replace what works.Forcing new work into the tool you already have.
A small fleet, a handful of capabilitiesTake your largest layered workflow and split it, a skill that holds the voice and the human gate on top, a sub-agent that does the bounded work underneath.Capabilities that duplicate each other with no composition between them.

Table 2. Same framework, different first move. What you have already built decides where the leverage is this week.

Your setup also shapes the answer. A solo builder should optimise for their own voice and iteration speed, where one strong skill beats three thin ones. A platform team should standardise the capability brief and a shared voice profile, so the fleet stays consistent as more people add to it, and a new capability inherits the house style instead of drifting from it.

Figure 3. Whatever you have built so far, the first move has the same shape. Name the work before the tool, then match the shape to the tool.

The shift

The shift is from "what can the model do" to "what shape is the work". Model capability is table stakes now. The advantage is in matching the capability to the work. Our own capability fleet is built this way, interactive skills and autonomous sub-agents in separate places with an orchestrator on top, and that split is what keeps it maintainable as it grows.

Iterative and voice-heavy points to a skill. Bounded and mechanical points to a sub-agent. Large and layered points to a skill orchestrating sub-agents. Decide that first, and the model becomes a detail the team can change later without rebuilding anything.

Most teams collapse both ideas into "automation" and end up with neither. The teams that separate them build capabilities they actually reuse.


Want to discuss? Drop a comment with patterns you have seen in your environment. I read every reply.

Azure Infrastructure Blog

Move a live GitLab project between groups without breaking Terraform state or CI/CD

詳細を表示

Why this is trickier than it looks 

A group transfer in GitLab isn't just a rename. It re-parents the project under a new namespace, which changes every path-based assumption downstream: inherited group variables, group-scoped runners, and any external system that hardcoded the old your-source-group/your-project path. For a plain application repo that's a minor cleanup. For a project that manages infrastructure, four things can bite at once: 

-Terraform state can appear to "reset" if the backend address was built from the old project path instead of the stable project ID. 
-Pipelines can fail because CI/CD variables that were inherited from the old group are no longer in scope. 
-Terraform jobs can fail on permissions because the runner or service account in the new group has different access. 
-Cloud authentication can break because a service principal's federated credentials were mapped to the old GitLab repo path. 

 

Get ahead of those four and the transfer itself is the easy part. Here's the shape of the move: the project keeps its identity (and its ID), but everything it inherited from the old parent stays behind. 

Group transfer overview — project ID stays the same, inherited resources do not follow: 

BEFORE: your-source-group 

your-project  |  ID 4021 

  ├─ GitLab-managed Terraform state 

  ├─ Group CI/CD variables (inherited) 

  └─ Group runners (inherited) 

 

AFTER: your-target-group 

your-project  |  ID 4021 (unchanged) 

  ├─ GitLab-managed Terraform state 

  ├─ Group CI/CD variables (re-create) 

  └─ Group runners (re-point) 

 

The project (and its GitLab-managed state) moves with its ID intact. The group-scoped variables and runners do not follow it — which is exactly where the rework lives. 

 

Prerequisites and assumptions 

This guide assumes the project you're moving includes: 

-Terraform code spread across multiple folders and environments. 
-Multiple Git branches and tags. 
-GitLab-managed Terraform state. 
-GitLab CI/CD pipelines, variables, and related configuration. 

You'll also want Owner access in both the source and target groups, and a maintenance window you can announce in advance.

 

Before the move 

Everything that makes the move safe happens here, while the project is still quiet and reversible. 

  • Confirm governance and access - Announce the change window and the expected freeze period so nobody pushes into a moving target. Confirm you hold Owner access in both the source and target groups, and that the users and teams who need the project already exist in the target group with the correct roles. 
  • Capture a baseline inventory - Write down what "good" looks like now so you can compare after the move. Capture the current project path and URL, the default branch and protected-branch rules, the full list of branches and tags, open merge requests and issues, pipeline schedules and their owners, the environment list with protected environments and approvals, and your runner topology (project runners, group runners inherited from the source group, and shared-runner status). 
  • Check Terraform readiness - For each Terraform root folder, identify the backend configuration pattern and confirm whether it points to the project ID (preferred) or the project path. List every state name in use, confirm there are no active state locks and no running Terraform jobs, and take a state backup for each active state as a safety export. 
    • Inventory the states GitLab is managing for this root 
      • terraform state list
    • Pull a point-in-time backup of each state before you touch anything 
      • terraform state pull > backup-<environment>-<state-name>.tfstate 

TIP 

Keep these backups outside the project you're about to move. If the transfer ever needs to be reversed, you'll want the safety net to live somewhere the move can't touch. 

  • Prepare CI/CD variables and secrets - Export and document your project-level CI/CD variables, including their masked and protected flags. Inventory the source-group inherited variables your pipelines actually consume, then prepare the same variables at the target group (or pull them down to project scope if that's cleaner). Review your .gitlab-ci.yml includes and templates for any references to the old group or project path. 
    • Watch for includes that hardcode the old namespace and will break after the move 
      • include: - project: 'your-source-group/ci-templates' and file: '/terraform/plan.yml' 
  • Freeze and lock down - Put a temporary merge freeze in place, pause scheduled pipelines, and make sure no release or deployment jobs are running. Tell the team to hold pushes during the transfer window. 
    • Checklist: before the move 
      • Change window announced and freeze period agreed. 
      • Owner access confirmed in both groups. 
      • Baseline inventory captured (branches, tags, MRs, issues, schedules, environments, runners). 
      • Backend pattern verified as project ID versus path, per root. 
      • State backups exported and stored off-project. 
      • CI/CD variables documented and staged in the target group. 
      • Merge freeze on, schedules paused, no active deploys. 

 

Executing the move 

With the project frozen and backed up, the transfer itself is quick. Keep your eyes on one number: the project ID. 

  • Run the transfer - In the project's Settings > General > Advanced section, transfer the project to the target group. Confirm the transfer succeeds, note the new namespace path, and verify that the project ID has not changed. The unchanged project ID is what lets your Terraform state and your rollback plan keep working. 
  • Validate immediately - Right after the move, confirm the repository is present and that branches, tags, merge requests, and issues are all visible. Check that the default branch and protected branches survived, and confirm the project visibility level (the target group's settings can constrain it).
  • Cut over CI/CD and runners - Verify that the runners you need are available in the target context, and re-enable or pin them as required. Re-create or validate the variables that used to be inherited from the old group, confirm your project-level variables are intact, and only unpause schedules after a smoke pipeline succeeds.
  • Run a Terraform safety pass - Do a dry run for each Terraform root before you trust anything. Confirm the backend resolves to the existing GitLab-managed state, run a plan per environment, and make sure the state lock and unlock cycle still works.
    • terraform init 
    • terraform plan   # expect no unexpected recreation 
  •  Checklist: executing the move - 
    • Transfer completed and new namespace path recorded. 
    • Project ID confirmed unchanged. 
    • Repo, branches, tags, MRs, and issues all visible. 
    • Default and protected branches intact. 
    • Runners available and pinned in the new context. 
    • Inherited variables re-created; project variables intact. 
    • Dry-run plans clean before schedules are unpaused. 

 

After the move - 

Now confirm the project is genuinely healthy, not just present. 

  • Validate Terraform end to end - For each root, confirm terraform init succeeds, terraform plan shows the drift you expect (ideally none), and state list and pull are accessible. Check that there are no orphaned or duplicate state files. 
      • terraform init 
      • terraform plan
      • terraform state list 
  • Re-check access and security - Validate the role model in the new group (Maintainer, Developer, Reporter) and re-test masked and protected variable behavior so secrets still mask in job logs.
  • Clean up operationally - Update local Git remotes to the new URL, and update your docs and runbooks with the new namespace and project path. 
    • git remote set-url origin https://gitlab.example.com/your-target-group/your-project.git 
  • Stay in hypercare - For a short window after the move, watch pipelines and Terraform plans closely. Unexpected drift is easiest to catch and reason about while the change is fresh. 
  • Checklist: after the move -
    • terraform init and terraform plan clean per root. 
    • No orphaned or duplicate state files. 
    • Roles and masked/protected variables verified. 
    • Git remotes, docs, and runbooks updated to the new path. 
    • Pipelines and plans monitored through hypercare. 

 

Gotchas that will bite you 

This is the part I wish someone had handed me before the move. Each gotcha follows the same shape: a symptom you'll see, the cause underneath it, and the fix.  

 ⚠️  WARNING — Re-point the service principal's federated credentials -

If your Terraform authenticates to the cloud with a service principal using workload-identity federation, the App Registration's federated credential is mapped to the old GitLab repo path. After the transfer, authenticated Terraform runs fail even though the state is fine, because the identity no longer matches the new namespace. 
 
Symptom: plans or applies fail on authentication or token issuance after an otherwise clean move. 
Cause: the federated credential subject still references your-source-group/your-project. 
Fix: update the federated credential in the App Registration to point at the new your-target-group/your-project path. 

 

  • The backend built from project ID versus project path - GitLab-managed Terraform state lives at an HTTP backend address. When that address is keyed to the stable project ID, it survives a group transfer untouched. When it's keyed to the project path, the address changes the moment the namespace changes, and Terraform can no longer find the existing state — so a plan looks like a brand-new, empty deployment.
    • Symptom: after the move, terraform plan proposes to create everything from scratch.

    • Cause: the backend address was derived from the old project path.

    • Fix: point the backend at the project-ID form of the address (which is unchanged by the move) and re-run the plan. See the Terraform GitLab-managed state docs for the exact address format. 

         # Stable: keyed to the numeric project ID — survives a namespace change 

         # https://gitlab.example.com/api/v4/projects/<PROJECT_ID>/terraform/state/<state-name>

         # Fragile: keyed to the project path — breaks the moment the group changes 

         # https://gitlab.example.com/api/v4/projects/your-source-group%2Fyour-project/terraform/state/<state-name> 

  • Variables that vanish with the old group -
    • Symptom: pipelines that passed yesterday now fail on missing configuration. 
    • Cause: those values were inherited from the source group and aren't in scope under the new parent.
    • Fix: re-create them at the target group, or pull the essential ones down to project scope so they travel with the project. 
  •  Runner and service-account permission differences -
    • Symptom: jobs queue forever or fail on permissions.
    • Cause: the new group offers different runners, or the runner's service account has different access than the old group's.
    • Fix: confirm runner availability in the target context, pin the runners you need, and reconcile the service-account permissions before unpausing schedules. 

 

NOTE - GitLab preserves a lot on transfer, but it can't preserve anything that lived outside the project — like group-inherited variables or an external identity mapped to your old path. For the transfer mechanics themselves, the official  

GitLab transfer-a-project docs are the authoritative reference: 

https://docs.gitlab.com/ee/user/project/settings/index.html#transfer-a-project-to-another-namespace 

 

What's preserved vs. what needs rework

 

Preserved automatically 

Requires rework after the move 

Git history, commits, branches, and tags 

Group-level CI/CD variables inherited from the old group 

Merge requests, issues, milestones, labels, and wiki 

Access that came from old group membership 

In-repo CI/CD config (.gitlab-ci.yml) 

Old group runners inherited at group scope 

Project-level CI/CD variables 

External systems that hardcoded the old namespace or project path 

GitLab-managed Terraform state tied to the same project (project ID unchanged) 

Service principal federated credentials mapped to the old repo path (see Warning above) 

 

How to verify (evidence to capture) 

Treat verification as a read-only exercise first. The goal is proof that nothing changed under you, captured one environment at a time. 

Work through the environments individually rather than all at once. For each one, run a read-only plan before anything else, investigate any proposed create or destroy before you apply, and confirm the state key name stays exactly identical to what it was before the move. If the state key naming drifts, stop and fix the backend address before proceeding. 

Capture this evidence as you go:

  • A screenshot of the project transfer success page showing the new namespace and unchanged project ID. 
  • A screenshot of branches and tags after the move. 
  • A screenshot of CI/CD variables and runner availability in the new context.
  • The IDs of the first successful pipeline runs. 
  • The terraform plan summaries for each root and environment. 

 

If something goes wrong: how to roll back 

Your rollback plan is already in place if you did the prep. It rests on three facts from earlier in this process, and it needs nothing you haven't already prepared. 

  • You took a state backup for every active state before the move (from the readiness step). If a plan looks wrong, you can restore from those backups rather than letting an apply run. 
  • The merge freeze and paused schedules are still holding, so nothing is racing your recovery. The freeze window is the safe point to restore a state backup or reverse the move. 
  • The project ID never changed, which means the project can be transferred back to the source group the same way it came, and the same GitLab-managed state (keyed to that ID) remains valid. 

 CAUTION - Only lift the freeze and unpause schedules once your read-only plans are clean. The freeze is what keeps rollback simple; releasing it early is what turns a small correction into an incident. 

 

Lessons learned 

  • Key your Terraform backend to the project ID, not the project path. It's the single decision that makes a group transfer boring instead of terrifying. 
  • Federated credentials are path-shaped. If a cloud identity trusts your old repo path, it won't trust the new one until you re-map it. 
  • Inventory before you inherit. Group-inherited variables and runners don't move with the project, so know what you depend on before you cut the cord.
  • A freeze plus off-project backups is your whole rollback plan. Keep both until your plans come back clean. 
  • Verify read-only, one environment at a time. Drift is easy to reason about in isolation and painful to untangle in bulk. 

 

Have you moved a Terraform-managed GitLab project between groups? I'd love to hear which gotcha caught you, and whether the project-ID backend trick saved you the way it saved us. Drop your experience (or your horror story) in the comments. 

Azure Networking Blog

Azure Front Door edge actions: programmable compute for a secure, resilient, AI-ready edge

詳細を表示

The need for secure edge programmability

As modern web applications increasingly move decision-making closer to users, programmable compute at the edge is becoming a foundational capability for delivering low-latency, personalized, and intelligent experiences. Azure Front Door edge actions introduces lightweight customer-defined logic that executes close to users at Microsoft's global edge (https://aka.ms/edgeactionsblog). The engineering challenge extends well beyond moving code closer to the request path. It is about enabling edge programmability while preserving the core guarantees customers expect from a global edge platform: hyperscale performance and acceleration, strong security and tenant isolation, resiliency, and fast, controlled recovery.

That sets up a much higher engineering bar than simply bringing a serverless runtime to the edge. Programmability introduces customer code, new execution paths, runtime dependencies, and additional failure modes directly into the critical request path. Architecture therefore must make flexibility a first-class capability without compromising the operational characteristics of a hyperscale edge platform.

Preserving performance at hyperscale

The first architectural challenge was preserving the performance characteristics of Azure Front Door while introducing programmable execution into the request path. Every additional execution step has the potential to increase latency, amplify failures, or reduce throughput at global scale. Edge actions was therefore designed to add programmability without changing the fundamental performance profile customers already expect from Azure Front Door.

At request time, Azure Front Door evaluates the request, determines whether an edge action should be executed based on the associated rule, invokes the edge actions runtime, and applies the result inline. Because the runtime sits directly in the request path, every design decision was guided by a common principle: keep execution local whenever possible, bound latency when dependencies degrade, and ensure optional compute never becomes a platform-wide latency amplifier.

 

 

 

Performance design principles

  • Node-local execution keeps request processing on the same machine whenever possible, minimizing cross-node communications and preserving low latency.
  • Minimized inter-node hops keep the common path compact while still enabling cluster-level fallback when local dependencies deteriorate.
  • Connection reuse through Edge Action Agent reduces gRPC invocation overhead and improves hot path efficiency.
  • Lightweight Hyperlight isolation provides strong tenant isolation with an execution model suitable for latency-sensitive edge workloads.
  • Fast-fail and circuit-breaker protects latency by bounding waits on degraded dependencies and preventing cascading pressure.

Together, these architectural choices introduce programmable compute without turning the Azure Front Door data plane into a distributed orchestration layer. The hot path remains local, predictable, and bounded, with fallback used only when necessary to preserve performance across the global edge.

Security and tenant isolation by design

Running customer-defined code on a shared global edge fundamentally changes the security model. Unlike traditional request processing, programmable execution introduces untrusted customer code directly into the request path, making strong isolation a foundational architectural requirement rather than an operational safeguard. For Azure Front Door edge actions, every execution is designed to run within a dedicated Hyperlight micro-VM, providing hardware-enforced isolation between customer workloads, the Azure Front Door data plane, and the underlying host environment.

Security design principles

  • Hypervisor-backed isolation ensures customer code executes within dedicated Hyperlight micro-VM boundaries rather than shared execution environments.
  • Data plane separation isolates edge actions execution from Azure Front Door's core traffic-processing path.
  • Minimal host surface area reduces the attack surface and limits privileged interactions.
  • Restricted execution context exposes only the request information required to process a request.
  • Reduced operational blast radius helps contain compromised or misbehaving workloads.

These architectural boundaries extend beyond workload isolation. Azure Front Door's data plane remains physically separated from the edge actions orchestration service, while each execution receives only the minimum context required to perform its task. This defense-in-depth approach reduces both security risk and operational blast radius without compromising performance.

Hyperlight: Security without sacrificing performance

A key differentiator of Azure Front Door edge actions is its use of Hyperlight micro-VMs to provide hardware-backed isolation without introducing the traditional performance penalties associated with virtual machines. Hyperlight was designed to make VM-level protection practical for high-throughput function execution, enabling strong tenant isolation while remaining suitable for latency-sensitive edge workloads.

 

 

Edge actions builds this foundation through the edge action orchestrator, which maintains a pool of warm Hyperlight sandboxes ready to serve requests. By reusing pre-initialized sandboxes instead of creating a new execution environment for every request, edge actions minimizes initialization overhead, reduces request latency, and sustains higher throughput under load. The result is a security model based on VM isolation that remains compatible with the performance expectations of a hyperscale edge platform.

Critically, performance optimizations do not weaken isolation guarantees. After each execution, sandbox state is cleaned before reuse, ensuring that subsequent invocations cannot access data from prior executions while preserving the efficiency benefits of warm sandboxing. In internal benchmarking, lightweight edge actions executed in less than 2 ms inside Hyperlight, with approximately 1.27 ms of total sandbox overhead, demonstrating that strong isolation and high-performance edge execution can coexist.

Security enables resiliency

Security and resiliency are closely related architectural goals. Isolation helps contain malformed inputs, unexpected behavior, and execution failures, preventing individual workloads from affecting the broader platform. In a multitenant edge service, isolation is not only a security requirement; it is also a key resiliency mechanism.

Resiliency built into the platform

Strong isolation is not only a security property, but also a foundational resiliency mechanism. By containing malformed inputs, unexpected behavior, and execution failures within dedicated execution boundaries, the platform prevents individual workloads from affecting neighboring tenants or the broader service. At hyperscale, robust isolation is essential for maintaining customer trust and predictable platform reliability.

Building on that foundation, Azure Front Door edge actions was designed around a simple operating principle: failures are inevitable, but their impact must be predictable, bounded, and recoverable. Because programmable compute introduces additional execution paths and runtime dependencies into the request path, resiliency must be built into the control points that determine when to execute, stop waiting, or fall back.

The platform incorporates lessons learned from operating Azure services at a global scale, with a focus on minimizing blast radius, maintaining service continuity, and enabling controlled recovery when dependencies fail, overload, or time out.

Resiliency principles

  • Bound failure impact through isolation and containment.
  • Recover predictably using health-aware routing and fallback paths.
  • Protect customer availability first through graceful degradation.
  • Fail fast rather than fail slowly to avoid latency amplification.
  • Continuously validate assumptions through Game Days and fault injections.

These principles translate into request-time behavior through deadlines, circuit breakers, fail-open behavior, and health-based fallback. Together, they ensure that optional programmable execution enhances application capabilities without compromising the stability of Azure Front Door's core request-processing pipeline.

Continuous validation of resiliency assumptions

Resilient architecture is credible only when validation becomes part of the operating model. For edge actions, Game Days and Fault Injections provide recurring opportunities to verify that architectural assumptions continue to hold under production-like stress.

Validation includes chaos and failure injections, timeout and dependency-loss exercises, overload and queue-growth scenarios, mixed-workload testing, and interface fuzzing. These exercises answer practical production questions: Does fail-open behavior protect the request path? Do circuit breakers engage early enough? Does fallback routing preserve service continuity? Do malformed inputs remain contained?

Repeated validation also strengthens operations. Detection improves, mitigation becomes more predictable, and recovery evolves from architectural intent into demonstrated operational capability.

Built for future intelligent & modern workloads

Edge actions is designed for lightweight programmable execution today, but the underlying architecture is intended to support increasingly intelligent decision-making over time. The engineering requirement remains unchanged: future intelligence workloads must operate within the same architectural constraints that govern today's request processing - bounded execution, strong isolation, predictable fallback, and protection of the common request path.

Architectural implications for intelligence workloads

  • Real-time AI inferencing for request classification and policy evaluation.
  • Intelligent bot, abuse, and fraud detection closer to users.
  • AI-assisted origin selection and traffic-routing decisions.
  • Application-specific SLM-powered decision making at the edge.

In that model, the objective is not simply to introduce more intelligence at the edge, but to ensure that intelligence inherits the same platform guarantees as every other component of the request path.

Closing thoughts

Programmable edge execution is becoming a foundational capability for modern distributed applications. The engineering challenge, however, extends far beyond running customer code closer to users. It is about preserving the system properties that customers already depend on while introducing a new execution surface into the critical request path.

Edge actions demonstrates that edge programmability, performance, security, tenant isolation, and resiliency are not independent design goals - they are a single architectural problem that must be solved together. By keeping the common path protected, failures bounded, tenants strongly isolated, and recovery predictable, Azure Front Door edge actions extends the platform's capabilities without compromising the engineering principles that underpin a global hyperscale edge service.

Learn more

Azure SDK Blog

Azure Developer CLI (azd) July 2026

This is the July round-up for the Azure Developer CLI (azd). Five releases shipped since the last post: 1.27.0, 1.27.1, 1.28.0, 1.28.1, and 1.29.0. Below is what’s new, what changed, and what we fixed, with links to the pull requests if you want to dig in. Have feedback or questions? Join the release discussion on […]

The post Azure Developer CLI (azd) July 2026 appeared first on Azure SDK Blog.