Validar la configuración de tus recursos en Azure con PSRule

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:

Resultado de PSRule

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!