Azure PowerShell Best Practices

Microsoft Docs

Key Best Practices

1. Use the Latest Az Module

Always install the most recent Az module to benefit from security patches and new cmdlets.

Install-Module -Name Az -AllowClobber -Scope CurrentUser

2. Prefer WhatIf and Confirm Parameters

During development, add -WhatIf or -Confirm to preview actions without making changes.

Remove-AzResourceGroup -Name MyResourceGroup -WhatIf

3. Secure Credential Handling

Never hard‑code credentials. Use Connect-AzAccount with managed identities or Azure AD service principals.

$sp = Get-AzADServicePrincipal -DisplayName "MyApp"
Connect-AzAccount -ServicePrincipal -ApplicationId $sp.ApplicationId -Tenant $sp.TenantId -CertificateThumbprint "YOUR_CERT_THUMBPRINT"

4. Implement Idempotent Scripts

Design scripts that can be re‑run safely. Check for existence before creating resources.

if (-not (Get-AzResourceGroup -Name $rgName -ErrorAction SilentlyContinue)) {
    New-AzResourceGroup -Name $rgName -Location $location
}

5. Use Structured Logging

Output JSON logs for better integration with monitoring tools.

$log = @{
    Time = (Get-Date).ToString("o")
    Action = "CreateVM"
    Status = "Success"
}
$log | ConvertTo-Json | Out-File "deployment.log" -Append

6. Parameter Validation

Validate script parameters to catch errors early.

param(
    [Parameter(Mandatory)][ValidateNotNullOrEmpty()][string]$ResourceGroup,
    [Parameter(Mandatory)][ValidatePattern('^[a-z0-9-]{3,24}$')][string]$VmName
)

7. Leverage Parallelism

Use ForEach-Object -Parallel (PowerShell 7+) for concurrent operations.

$vms = @('vm1','vm2','vm3')
$vms | ForEach-Object -Parallel {
    Start-AzVM -Name $_ -ResourceGroupName "MyRG"
}

Additional Resources