MI

migrate-backend-to-dts

Migrates Azure Durable Functions from legacy storage providers to the managed Durable Task Scheduler service.

Install

mkdir -p .claude/skills/migrate-backend-to-dts && curl -L -o skill.zip "https://agentskills.codes/api/skills/download/10294" && unzip -o skill.zip -d .claude/skills/migrate-backend-to-dts && rm skill.zip

Installs to .claude/skills/migrate-backend-to-dts

Activation

This is the description your AI agent reads to decide when to run this skill — the better it matches your request, the more reliably it fires.

Migrate existing Azure Durable Functions apps from existing backend storage providers (Azure Storage, Netherite, MSSQL) to the Durable Task Scheduler. Use when switching backends, converting to azureManaged storage provider, upgrading from Azure Storage default provider, migrating from Netherite Event Hubs-based backend, migrating from Microsoft SQL Server backend, or modernizing Durable Functions infrastructure. Applies to .NET, Python, JavaScript/TypeScript, and Java Durable Functions apps that need to adopt the managed Durable Task Scheduler service.
559 chars✓ has a “when” triggerlonger than Claude Code's old 250-char listing cap (fine on current versions)
Advanced

Key capabilities

  • Drain in-flight orchestrations
  • Update host.json
  • Configure identity-based auth
  • Migrate to isolated worker

How it works

It guides the migration by updating host.json and ensuring prerequisites like identity-based auth are met.

Inputs & outputs

You give it
Existing backend configuration
You get back
Durable Task Scheduler configuration

When to use migrate-backend-to-dts

  • Migrating Azure Storage backends to DTS
  • Upgrading Durable Functions to isolated worker model
  • Configuring RBAC for managed Durable Task Scheduler

About this skill

Migrate Durable Functions to Durable Task Scheduler

Step-by-step guide for migrating Azure Durable Functions apps from existing backend storage providers to the Durable Task Scheduler (DTS).

Before You Start

⚠️ Critical Prerequisites

  1. Drain in-flight orchestrations. DTS does not import state from other backends. All running orchestrations must complete or be terminated before switching.
  2. .NET apps must use isolated worker model. DTS does not support the in-process hosting model. If your app uses in-process (Microsoft.Azure.WebJobs.Extensions.DurableTask), migrate to isolated worker first.
  3. Identity-based auth only. DTS uses Microsoft Entra ID / managed identity — no shared keys or connection string secrets. Plan for RBAC setup.

Step 1: Identify Your Current Backend

Inspect your host.json to determine which backend you're migrating from:

Current storageProvider.typeBackendKey Indicator
(missing or empty)Azure Storage (default)No explicit type; uses AzureWebJobsStorage connection
"azure"Azure Storage (explicit)Same as default
"netherite"NetheriteRequires Event Hubs connection string
"mssql"Microsoft SQLRequires SQL Server connection string

Also check your packages for confirmation:

.NET (.csproj):

PackageBackend
Microsoft.Azure.WebJobs.Extensions.DurableTask (no suffix)Azure Storage (in-process — must also migrate to isolated)
Microsoft.Azure.Functions.Worker.Extensions.DurableTask (no suffix)Azure Storage (isolated)
Microsoft.Azure.DurableTask.Netherite.AzureFunctionsNetherite
Microsoft.DurableTask.SqlServer.AzureFunctionsMSSQL

Python (requirements.txt): azure-functions-durable — backend is configured in host.json only.

JavaScript (package.json): durable-functions — backend is configured in host.json only.

Java (build.gradle/pom.xml): azure-functions-java-library — backend is configured in host.json only.

Step 2: Update host.json

Remove your old storageProvider block and replace it with the DTS configuration.

Migrating from Azure Storage (default)

// BEFORE — Azure Storage (default, no storageProvider block)
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub"
    }
  }
}

// AFTER — Durable Task Scheduler
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "%TASKHUB_NAME%",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  }
}

Migrating from Azure Storage (explicit)

// BEFORE — Azure Storage (explicit type)
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "storageProvider": {
        "type": "azure",
        "connectionStringName": "AzureWebJobsStorage"
      }
    }
  }
}

// AFTER — Durable Task Scheduler
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "%TASKHUB_NAME%",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  }
}

Migrating from Netherite

// BEFORE — Netherite
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "storageProvider": {
        "type": "netherite",
        "storageConnectionName": "AzureWebJobsStorage",
        "eventHubsConnectionName": "EventHubsConnection",
        "partitionCount": 12
      }
    }
  }
}

// AFTER — Durable Task Scheduler
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "%TASKHUB_NAME%",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  }
}

Netherite cleanup: After migration, remove the EventHubsConnection setting and consider deprovisioning the Event Hubs namespace if no longer needed. DTS handles partitioning internally — partitionCount is not needed.

Migrating from MSSQL

// BEFORE — Microsoft SQL Server
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub",
      "storageProvider": {
        "type": "mssql",
        "connectionStringName": "SQLDB_Connection",
        "taskEventLockTimeout": "00:02:00",
        "createDatabaseIfNotExists": true,
        "schemaName": "dt"
      }
    }
  }
}

// AFTER — Durable Task Scheduler
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "%TASKHUB_NAME%",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  }
}

MSSQL cleanup: After migration, remove SQLDB_Connection from app settings. The dt.* schema tables in your SQL database can be dropped once you've confirmed the migration is successful.

Non-.NET Languages (Python, JavaScript, Java)

For Python, JavaScript, and Java apps, migration is configuration-only — no code changes or package changes are required. You only need to update host.json.

There is one key difference from .NET: the extension bundle must be updated to the Preview bundle.

Python — Migrating from Azure Storage (default)

// BEFORE — host.json (Azure Storage default)
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.0.0, 5.0.0)"
  }
}

// AFTER — host.json (Durable Task Scheduler)
{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
    "version": "[4.29.0, 5.0.0)"
  }
}

requirements.txt — no changes needed:

azure-functions
azure-functions-durable

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "python",
    "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
  }
}

JavaScript / TypeScript — Migrating from Azure Storage (default)

// BEFORE — host.json (Azure Storage default)
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.0.0, 5.0.0)"
  }
}

// AFTER — host.json (Durable Task Scheduler)
{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
    "version": "[4.29.0, 5.0.0)"
  }
}

package.json — no changes needed:

{
  "dependencies": {
    "@azure/functions": "^4.0.0",
    "durable-functions": "^3.0.0"
  }
}

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "node",
    "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
  }
}

Java — Migrating from Azure Storage (default)

// BEFORE — host.json (Azure Storage default)
{
  "version": "2.0",
  "extensions": {
    "durableTask": {
      "hubName": "MyTaskHub"
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle",
    "version": "[4.0.0, 5.0.0)"
  }
}

// AFTER — host.json (Durable Task Scheduler)
{
  "version": "2.0",
  "logging": {
    "logLevel": {
      "DurableTask.Core": "Warning"
    }
  },
  "extensions": {
    "durableTask": {
      "hubName": "default",
      "storageProvider": {
        "type": "azureManaged",
        "connectionStringName": "DURABLE_TASK_SCHEDULER_CONNECTION_STRING"
      }
    }
  },
  "extensionBundle": {
    "id": "Microsoft.Azure.Functions.ExtensionBundle.Preview",
    "version": "[4.29.0, 5.0.0)"
  }
}

pom.xml — no changes needed. Your existing dependencies stay the same:

<dependency>
    <groupId>com.microsoft.azure.functions</groupId>
    <artifactId>azure-functions-java-library</artifactId>
    <version>3.2.3</version>
</dependency>
<dependency>
    <groupId>com.microsoft</groupId>
    <artifactId>durabletask-azure-functions</artifactId>
    <version>1.7.0</version>
</dependency>

local.settings.json:

{
  "IsEncrypted": false,
  "Values": {
    "AzureWebJobsStorage": "UseDevelopmentStorage=true",
    "FUNCTIONS_WORKER_RUNTIME": "java",
    "DURABLE_TASK_SCHEDULER_CONNECTION_STRING": "Endpoint=http://localhost:8080;TaskHub=default;Authentication=None"
  }
}

Non-.NET — Migrating from Netherite or MSSQL

The target configuration is the same regardless of which existing backend you're migrating from. Replace the old storageProvider block and update the extension bundle as shown above. The only additional step is removing the old backend's connection strings from your app settings:

  • From Netherite: Remove EventHubsConnection (or your Event Hubs connection name)
  • From MSSQL: Remove SQLDB_Connection (or your SQL connection name)

Step 3: Update Packages (.NET Only)

Non-.NET languages


Content truncated.

When not to use it

  • Projects without Durable Functions
  • Environments requiring shared keys

Prerequisites

Isolated worker modelManaged identity

Limitations

  • Requires isolated worker model
  • No state import from old backends

How it compares

It provides a structured migration path for specific storage providers instead of generic advice.

Compared to similar skills

migrate-backend-to-dts side by side with the closest alternatives in the catalog.

SkillInstallsUpdatedSafetyDifficulty
migrate-backend-to-dts (this skill)03moReviewAdvanced
managing-api-cache227dReviewAdvanced
pipeline-plugin-development13moNo flagsAdvanced
generating-rest-apis027dReviewAdvanced

Try saying

Example prompts that trigger this skill in your AI assistant.

You might also like

managing-api-cache

jeremylongshore

Implement intelligent API response caching with Redis, Memcached, and CDN integration. Use when optimizing API performance with caching. Trigger with phrases like "add caching", "optimize API performance", or "implement cache layer".

220

pipeline-plugin-development

TencentBlueKing

流水线插件开发完整指南,涵盖插件创建、task.json 配置规范、多语言开发示例(Python/Java/NodeJS/Golang)、输入输出规范、错误码规范、发布流程、调试方法。当用户需要开发蓝盾流水线插件、配置 task.json、处理插件输入输出或排查插件错误时使用。

112

generating-rest-apis

jeremylongshore

Generate complete REST API implementations from OpenAPI specifications or database schemas. Use when generating RESTful API implementations. Trigger with phrases like "generate REST API", "create RESTful API", or "build REST endpoints".

02

slack-bot-builder

davila7

Build Slack apps using the Bolt framework across Python, JavaScript, and Java. Covers Block Kit for rich UIs, interactive components, slash commands, event handling, OAuth installation flows, and Workflow Builder integration. Focus on best practices for production-ready Slack apps. Use when: slack bot, slack app, bolt framework, block kit, slash command.

11

catalyst-sdk

catalystbyzoho

Catalyst SDKs — initialization patterns, service access, and method reference for Node.js, Web (browser), Python, Java, Android, iOS, and Flutter. Trigger on 'SDK', 'zcatalyst-sdk-node', 'Node.js SDK', 'Web SDK', 'Python SDK', 'Java SDK', 'Android SDK', 'iOS SDK', 'Flutter SDK', or 'initialize SDK'.

00

backend-bugfix

u1219437219-cmyk

Investigate and fix backend bugs involving APIs, data flow, jobs, logs, or intermittent server behavior.

00

Search skills

Search the agent skills registry