Swap Slots in Azure Function App using PowerShell

Introduction

Swapping deployment slots for your Azure Function App is an essential part of managing your application lifecycle. Deployment slots allow you to create a staging environment for testing new changes before pushing them to production. In this blog, we will discuss how to automate the slot swapping process using PowerShell.

Use Cases

  1. Testing in Staging Before Production: Deploy updates to a staging slot, perform tests, and then swap the staging slot with the production slot once the tests pass.
  2. Zero-Downtime Deployments: Ensure continuous availability by swapping slots, allowing users to seamlessly experience new updates without downtime.
  3. Rollback Scenarios: Quickly revert to a previous stable version by swapping the production slot with a backup slot in case of issues with the current deployment.
  4. Blue-Green Deployment: Implement blue-green deployment strategies by using two slots (e.g., blue and green) to alternate between deployments.
  5. A/B Testing: Use different slots to test features with a subset of users before rolling out changes to the broader audience.

Create Slots in Azure Function App

Have at least two slots in Azure Function App.

Azure Function App

Run PowerShell Script

Ensure you have the Azure CLI installed and you are authenticated to your Azure subscription. You can download and install the Azure CLI from here.

Login using the below command in PowerShell.

az login

Below is a PowerShell script that swaps slots for an Azure Function App. This script will help you automate the slot swapping process in your CI/CD pipeline.

# Function to Swap Slot for FunctionApp
Function Swap-SlotFunctionApp {
    # Parameters - FunctionAppName, ResourceGroupName, SubscriptionId, Slot
    [CmdletBinding()]
    param (
      # FunctionApp Name
      [Parameter(Mandatory = $true)]
      [ValidateNotNullOrEmpty()]
      [String]$FunctionAppName,
  
      # ResourceGroup Name
      [Parameter(Mandatory = $true)]
      [ValidateNotNullOrEmpty()]
      [String]$ResourceGroupName,
  
      # Subscription Id
      [Parameter(Mandatory = $true)]
      [ValidateNotNullOrEmpty()]
      [String]$SubscriptionId,
  
      # Slots to Swap
      [Parameter(Mandatory = $true)]
      [ValidateNotNullOrEmpty()]
      [array]$Swap
    )
    
    Write-Host "##[debug] -----Starting Swap-SlotFunctionApp Function-----" -ForegroundColor Cyan
    Write-Host "##[command] Parameters" -ForegroundColor Yellow
    "_" * 10
  
    # Set Subscription
    Write-Host "Setting Subscription"
    az account set -s $SubscriptionId
  
    try {
  
      # Swapping Slot
      Write-Host "Source Slot: $($Swap[0])"
      Write-Host "Target Slot: $($Swap[1])"
      az functionapp deployment slot swap --name $FunctionAppName --resource-group $ResourceGroupName --slot $Swap[0] --target-slot $Swap[1]
      Write-Host "##[debug] -----Completed Swap-SlotFunctionApp Function-----" -ForegroundColor Cyan
    }
    catch [Exception] {
      Write-Host $_.Exception.Message
      Write-Host "`nError in Line: " $_.InvocationInfo.Line
      Write-Host "`nError in Line Number: " $_.InvocationInfo.ScriptLineNumber
      Write-Host "`nError Item Name: " $_.Exception.ItemName
      throw $_.Exception.Message
    } 
  }

  $swap = @("staging","production")

  Swap-SlotFunctionApp -FunctionAppName "samplefunc-rg" -ResourceGroupName "sample-rg" -SubscriptionId "6ba2dfac-9ebd-4585-bf87-0" -Swap $swap

This will Output,

Output

Note. It will take 2 to 3 Minutes to Swap.

Validate in Azure Portal. Function App -> Activity Log.

Activity Log

Conclusion

By automating the slot swapping process using PowerShell, you can streamline your deployment workflow, reduce downtime, and maintain high availability for your Azure Function Apps. This script ensures efficient and consistent slot management, making it a valuable tool in your DevOps toolkit.