Introduction to PowerShell in Azure Functions

Azure Functions provides a powerful serverless compute experience. PowerShell allows you to leverage your existing scripting skills to build and deploy serverless applications on Azure. This guide will walk you through the essentials of developing Azure Functions using PowerShell.

With PowerShell Functions, you can:

  • Automate tasks and workflows.
  • Process data from various Azure services.
  • Build event-driven applications.
  • Integrate with other services using REST APIs.

Getting Started

To develop Azure Functions with PowerShell, you'll need the following:

  • Azure Functions Core Tools: Install the latest version from the official documentation.
  • PowerShell: Version 5.1 or later is recommended.
  • Visual Studio Code (Recommended): With the Azure Functions extension installed for a streamlined development experience.

Initialize a new project:

func init MyPowerShellProject --powershell
cd MyPowerShellProject

Creating Your First Function

Use the Azure Functions Core Tools to create a new function. For example, to create an HTTP-triggered function:

func new --template "HTTP trigger" --name MyHttpFunction

This will create a new folder named MyHttpFunction containing a run.ps1 file and a function.json file.

The run.ps1 file contains the PowerShell script that executes when the function is triggered. The function.json file defines the function's triggers and bindings.

Example run.ps1:

param(
    [System.Net.Http.HttpRequestMessage] $req
)

# Get request body or query parameters
$name = ($req.Content.ReadAsStringAsync().GetAwaiter().GetResult() -split '=|&')[1]
if (-not $name) {
    $name = (Invoke-Webrequest -Uri "$($req.RequestUri.AbsoluteUri)&name=World").Content.ReadAsStringAsync().GetAwaiter().GetResult()
}

$body = "Hello, $name. This HTTP triggered function executed successfully."

return @{
    StatusCode = 200
    Body = $body
}

Triggers and Bindings

Triggers start the execution of a function, and bindings connect your function to other services. They are configured in the function.json file.

HTTP Trigger

The most common trigger, allowing functions to be invoked via HTTP requests.

{
  "scriptFile": "run.ps1",
  "bindings": [
    {
      "authLevel": "function",
      "type": "httpTrigger",
      "direction": "in",
      "name": "req",
      "methods": [
        "get",
        "post"
      ]
    },
    {
      "type": "http",
      "direction": "out",
      "name": "res"
    }
  ]
}

Timer Trigger

Executes your function on a schedule defined by a CRON expression.

{
  "scriptFile": "run.ps1",
  "bindings": [
    {
      "name": "mytimer",
      "type": "timerTrigger",
      "direction": "in",
      "schedule": "0 */5 * * * *" # Every 5 minutes
    }
  ]
}

The mytimer object will be available in your run.ps1 script.

Queue Trigger

Triggers when a message is added to an Azure Storage Queue.

{
  "scriptFile": "run.ps1",
  "bindings": [
    {
      "name": "msg",
      "type": "queueTrigger",
      "direction": "in",
      "queueName": "myqueue-items",
      "connection": "AzureWebJobsStorage"
    }
  ]
}

The message content will be available in the $msg variable in your script.

Working with Dependencies

You can manage PowerShell dependencies using a requirements.psd1 file. Add your required modules to the RootModule or ModuleList.

Example requirements.psd1:

#
# This file defines the modules that the Azure Functions PowerShell runtime
# will make available to your functions.
#
@{
    'PSVersion' = '5.1'

    'Modules' = @(
        'Az.Storage',
        'Az.Compute',
        'Newtonsoft.Json'
    )
}

When your function app starts, the runtime will attempt to install these modules.

Testing Your Functions

You can test your functions locally using the Azure Functions Core Tools. Run your function app with:

func start

Then, use tools like curl or Postman to send requests to your HTTP-triggered functions. For other triggers, you might need to simulate events (e.g., adding messages to a queue).

Tip: Consider using Pester for unit testing your PowerShell logic within functions.

Deployment

Deploy your PowerShell Functions to Azure using various methods:

  • Azure CLI: az functionapp create and az functionapp deploy.
  • VS Code: Use the Azure Functions extension.
  • Azure DevOps/GitHub Actions: Automate deployments with CI/CD pipelines.

Ensure your host.json and local.settings.json (for local development) are correctly configured for your Azure environment.

Advanced Topics

Explore these advanced concepts for more robust function development:

  • Durable Functions: For orchestrating complex workflows.
  • Application Insights: For monitoring and debugging.
  • Custom Handlers: For advanced scenarios.
  • Using the Azure PowerShell Module: Directly interact with Azure resources from your functions.