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.zipInstalls 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.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
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
- Drain in-flight orchestrations. DTS does not import state from other backends. All running orchestrations must complete or be terminated before switching.
- .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. - 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.type | Backend | Key Indicator |
|---|---|---|
| (missing or empty) | Azure Storage (default) | No explicit type; uses AzureWebJobsStorage connection |
"azure" | Azure Storage (explicit) | Same as default |
"netherite" | Netherite | Requires Event Hubs connection string |
"mssql" | Microsoft SQL | Requires SQL Server connection string |
Also check your packages for confirmation:
.NET (.csproj):
| Package | Backend |
|---|---|
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.AzureFunctions | Netherite |
Microsoft.DurableTask.SqlServer.AzureFunctions | MSSQL |
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
EventHubsConnectionsetting and consider deprovisioning the Event Hubs namespace if no longer needed. DTS handles partitioning internally —partitionCountis 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_Connectionfrom app settings. Thedt.*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
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.
| Skill | Installs | Updated | Safety | Difficulty |
|---|---|---|---|---|
| migrate-backend-to-dts (this skill) | 0 | 3mo | Review | Advanced |
| managing-api-cache | 2 | 27d | Review | Advanced |
| pipeline-plugin-development | 1 | 3mo | No flags | Advanced |
| generating-rest-apis | 0 | 27d | Review | Advanced |
Try saying
Example prompts that trigger this skill in your AI assistant.
More by Azure-Samples
View all by Azure-Samples →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".
pipeline-plugin-development
TencentBlueKing
流水线插件开发完整指南,涵盖插件创建、task.json 配置规范、多语言开发示例(Python/Java/NodeJS/Golang)、输入输出规范、错误码规范、发布流程、调试方法。当用户需要开发蓝盾流水线插件、配置 task.json、处理插件输入输出或排查插件错误时使用。
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".
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.
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'.
backend-bugfix
u1219437219-cmyk
Investigate and fix backend bugs involving APIs, data flow, jobs, logs, or intermittent server behavior.