Son muchas las buenas prácticas y consideraciones que deberías de tener en cuenta al desplegar tus recursos en Azure y obviamente es complicado recordar cada una de ellas. Hace ya un tiempo Microsoft puso a nuestra disposición el conocido WAF (Well-Architected Framework), que se encarga de recoger todas estas buenas prácticas desde diferentes perspectivas. Hoy quiero compartir contigo una herramienta llamada PSRule que te permite analizar, antes y después, cómo de bien estamos siguiendo estas prácticas.
¿Qué es PSRule?
Se trata de un módulo de PowerShell que nos permite analizar la infraestructura que vamos a desplegar, a través de plantillas ARM, Bicep o manifiestos de Kubernetes, o la que ya tenemos desplegada, con el fin de obtener un informe de cómo de bien estamos siguiendo las buenas prácticas. A día de hoy puedes usar tanto Windows, Linux o Mac para utilizar este módulo, ya que PowerShell está disponible en todas las plataformas. Puedes usar las reglas ya pre-construídas (unas 260 reglas) o si quieres puedes además generar las tuyas propias.
Instalar PSRule en local
Si no estás en Windows, y hasta ahora no has instalado PowerShell, es lo primero que necesitas. En mi caso, voy a hacer la instalación para Mac usando Homebrew:
# Install PowerShell on MacOs if you don't have it
brew install --cask powershell
Ahora, desde un terminal de PowerShell, necesitas instalar el módulo de PSRule de la galería:
#Install PSRule
Install-Module -Name 'PSRule.Rules.Azure' -Repository PSGallery -Scope CurrentUser
Exportar la configuración de tus recursos de Azure
En este artículo voy a centrarme en el uso de la herramienta en local, para que veas qué es lo que obtienes, y asumiendo que no tenemos código previo, ni en YAML, ni en Bicep ni manifiestos 😃. En este caso, lo primero que debes hacer es iniciar sesión:
# Connect to Azure
Connect-AzAccount;
# Confirm if you are in the right subscription
Get-AzContext;
y exportar o bien todos los recursos de la suscripción elegida o bien uno o varios grupos de recursos (también puedes exportar todos los recursos de todas las suscripciones a las que el usuario tenga acceso):
# Export all Azure resources for a subscription to JSON files
Export-AzRuleData -OutputPath 'out/';
#Export just a resource group
Export-AzRuleData -OutputPath 'out/' -ResourceGroupName 'private-app-svc';
El proceso puede tardar unos instances. Una vez que finalice tendrás un archivo en formato JSON por cada una de las suscripciones con los recursos y la configuración de estos.
Analizar la configuración de los recursos
Con la configuración exportada el análisis se realiza con el siguiente comando:
Invoke-PSRule -InputPath 'out/' -Module 'PSRule.Rules.Azure';
Al lanzarlo contrastará tu configuración con todas las reglas que vienen con el módulo y devolverá un resultado parecido a este:

Si quisieras además utilizar otras reglas disponibles en la galería deberías importarlas y usarlas de la siguiente manera:
# Analyze using CAF module
Install-Module -Name 'PSRule.Rules.CAF' -Scope CurrentUser;
Invoke-PSRule -Module 'PSRule.Rules.CAF' -InputPath 'out/';
También puedes crear tus propias reglas.
Por otro lado, si solo quieres que te devuelva los errores puedes añadir el parámetro -Outcome Fail:
Invoke-PSRule -InputPath 'out/' -Module 'PSRule.Rules.Azure' -Outcome Fail;
Y también puedes pedirle que te lo devuelva en otros formatos como YAML, JSON, Markdown, NUnit3, CSV o Wide:
# Output format (YAML, JSON, Markdown,NUnit3,CSV, Wide)
Invoke-PSRule -InputPath 'out/' -Module 'PSRule.Rules.Azure' -Outcome Fail -OutputFormat 'Markdown' > 'report.md';
Invoke-PSRule -InputPath 'out/' -Module 'PSRule.Rules.Azure' -Outcome Fail -OutputFormat 'Yaml'
Otra salida interesante puede ser el formato resumen:
# Show as summary
Invoke-PSRule -InputPath 'out/' -Module 'PSRule.Rules.Azure' -As Summary;
Automatizar el proceso con tu herramienta de CI/CD
Por supuesto, todo este proceso puedes integrarlo con tu herramienta para CI/CD. En la documentación tienes ejemplos para Azure DevOps y GitHub.
Para más información puedes echar un vistazo en su sitio oficial.
¡Saludos!