(+351) 21 24 10006  ·  info@bconcepts.pt
Carnaxide, Lisboa
Infraestrutura como Código & DevOps
Infraestrutura como Código & DevOps 1 min

Testes de infraestrutura com Pester e Azure Policy: validar IaC antes e depois do deploy

João Barros 19 de June de 2026 1 min de leitura

IaC (Bicep/Terraform) sem testes é uma promessa não verificada. Pester valida que o deploy criou exactamente o que era esperado; Azure Policy garante conformidade contínua mesmo depois de alterações manuais.

Testes Pester pós-deploy

BeforeAll {
    Connect-AzAccount -Identity
    $rg = "rg-analytics-prod"
}

Describe "Infra Analytics Prod" {
    It "Storage Account existe e tem ADLS Gen2 activado" {
        $sa = Get-AzStorageAccount -ResourceGroupName $rg -Name "stadatalakeprod"
        $sa | Should -Not -BeNullOrEmpty
        $sa.EnableHierarchicalNamespace | Should -Be $true
    }

    It "Key Vault tem purge protection" {
        $kv = Get-AzKeyVault -VaultName "kv-bconcepts-prod"
        $kv.EnablePurgeProtection | Should -Be $true
    }

    It "ADF usa Managed Identity" {
        $adf = Get-AzDataFactoryV2 -ResourceGroupName $rg -Name "adf-bconcepts-prod"
        $adf.Identity.Type | Should -Be "SystemAssigned"
    }

    It "Nenhum NSG permite SSH (22) da internet" {
        $nsgs = Get-AzNetworkSecurityGroup -ResourceGroupName $rg
        foreach ($nsg in $nsgs) {
            $sshRule = $nsg.SecurityRules | Where-Object {
                $_.DestinationPortRange -eq "22" -and $_.SourceAddressPrefix -eq "*"
            }
            $sshRule | Should -BeNullOrEmpty -Because "SSH da internet não é permitido"
        }
    }
}

Azure Policy — conformidade contínua

# Policy: forçar HTTPS em storage accounts
az policy assignment create \
  --name "enforce-https-storage" \
  --policy "Secure transfer to storage accounts should be enabled" \
  --scope "/subscriptions/${SUBSCRIPTION_ID}/resourceGroups/rg-analytics-prod" \
  --enforcement-mode Default  # Deny — bloqueia recursos não conformes

# Ver recursos não conformes
az policy state list \
  --resource-group rg-analytics-prod \
  --filter "complianceState eq 'NonCompliant'" \
  --query "[].{Resource:resourceId, Policy:policyDefinitionName}"

Integrar Pester no pipeline CI/CD
- stage: PostDeploy_Tests
  jobs:
    - job: InfraTests
      steps:
        - task: PowerShell@2
          inputs:
            script: |
              Install-Module Pester -Force -Scope CurrentUser
              $result = Invoke-Pester -Path ./tests/infra -PassThru -OutputFile results.xml -OutputFormat NUnitXml
              if ($result.FailedCount -gt 0) { exit 1 }
        - task: PublishTestResults@2
          inputs: { testResultsFiles: "results.xml" }

Conclusão

A combinação Pester (validação pós-deploy) + Azure Policy (conformidade contínua) fecha o ciclo de segurança de IaC. Pester verifica que o deploy funcionou como esperado; Policy garante que ninguém altera manualmente um recurso para fora das normas da organização.

Partilhar: