Monitoring Azure en multi-tenant

Nous avons vus précédemment comme aborder la facturation dans un contexte CSP, cela ne représente qu’une petite partie de l’esprit du CSP dans le sens  où celui-ci doit offrir un ensemble de services managés, dont le monitoring fait partie. Nous allons voir dans cet article comment monitorer les ressources Azure en environnement Multi-Tenant.

L’idée est de pouvoir centraliser l’ensemble des informations essentielles de vos clients CSP au travers d’un outillage centralisé se basant sur les outils natifs disponible dans Azure. La solution se base sur le déploiement de ressources Azure du côté du Service Provider mais également les tenants clients. L’architecture de la solution repose sur:

  • Tenant / Subscription client
    • Log Analytics
    • Azure Automation
  • Service Provider / Central Repository
    • Azure Storage Account (BLOB)
    • Stream Analytics
    • Azure Cosmos DB
    • Azure Automation
    • Power BI PRO

Nous allons bien entendu parler coût de la solution afin de pouvoir refacturer la quote-part monitoring. Celui-ci est forcément variable car dépendant de taille des environnements à surveiller.

Déploiement côté Service Provider

Voici comment fonctionne la solution

  1. Réception des journaux OMS du client CSP en tant que fichier CSV dans le conteneur du compte de stockage
  2. Utilisation de Stream Analytics pour déplacer le contenu CSV dans Cosmos DB (anciennement DocumentDB)
  3. Exécution du processus de nettoyage via Azure Automation au moins une fois par jour (nettoyage du conteneur CSV et archivage des fichiers CSV traités)
  4. Visualisation au travers de PowerBI pour l’affichage des données

Nous allons créer un compte de stockage de type BLOB LRS, avec deux containers, un pour les logs, un autre pour une Long Term Retention des logs.

Nous allons maintenant créer un compte d’automation.

Au sein de cet Automation Account, il faut déployer un runbook, disponible ici. Celui-ci opère du cleanup sur les logs. Il faudra le lancer tous les jours à minima, avec une recommandation de toutes 1 à 2 heures.

#Use the local AzureRunAsConnection account for actions within the tenant
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

# Set service provider Azure storage account
$StorageAccountName = "<STORAGE ACCOUNT>"
$StorageContainerName = "<MAIN CONTAINER NAME>"
$TargetStorageContainerName = "<ARCHIVE CONTAINER NAME>"
$StorageAccountKey = "<STORAGE ACCOUNT KEY>"

$Ctx = New-AzureStorageContext $StorageAccountName -StorageAccountKey $StorageAccountKey

#Cleanup all 0 byte files - should no longer be needed
Get-AzureStorageBlob -Container $StorageContainerName -Context @Ctx | Where-Object {$_.Length -eq 0} | Remove-AzureStorageBlob

#Get all blobs older than an hour
$blobs = Get-AzureStorageBlob -Container $StorageContainerName -Context @Ctx | Where-Object {$_.LastModified -lt (Get-Date).AddHours(-1)}

#Copy blobs from one container to another.
$blobs| Start-AzureStorageBlobCopy -DestContainer $TargetStorageContainerName -DestContext $Ctx

$blobs| Remove-AzureStorageBlob

Changer les valeurs suivantes pour ce script Powershell par celles présentées dans la capture ci-dessous:

  • $StorageAccountName = « <STORAGE ACCOUNT> »
  • $StorageContainerName = « <MAIN CONTAINER NAME> »
  • $TargetStorageContainerName = « <ARCHIVE CONTAINER NAME> »
  • $StorageAccountKey = « <STORAGE ACCOUNT KEY> »

Une fois le script sauvegardé, on l’importe dans la créatrion d’un Runbook dans le compte d’automation.

On va tester le script Powershell, pour ensuite le publier et lui attribuer le schedule à s’exéctuer toutes les 2 heures.

 

Nous allons maintenant créer un CosmoDB.

On y rajoute une collection.

 

Il faut maintenant modifier le TTL. Ceci supprime automatiquement les enregistrements dans Cosmos DB plus anciens que ceux spécifiés dans le paramètre TTL. Cela permet de limiter la taille de la collection et d’obtenir des performances de requête raisonnables. N’oubliez pas que les données d’origine sont archivées dans le conteneur d’archives BLOB.

Nous allons maintenant un créer un Stream Analytics job avec Stream Input en BLOB et un Stream Ouput en Cosmo DB et changer la QUERY par défaut.

Configurer les Tenants à monitorer

Le prérequis est d’avoir un OMS de déployé. Si ce n’est pas le cas, rendez-vous ici pour en déployer un.

Nous allons déployer un Runbook que nous aurons préalablement modifié pour notre configuration.

[CmdletBinding()]
Param(
[Parameter (Mandatory=$true,Position=1)]
[string]$reportname,

[Parameter (Mandatory=$true,Position=2)]
[string]$dynamicQuery
)

#Use the local AzureRunAsConnection account for actions within the tenant
$Conn = Get-AutomationConnection -Name AzureRunAsConnection
Add-AzureRMAccount -ServicePrincipal -Tenant $Conn.TenantID -ApplicationId $Conn.ApplicationID -CertificateThumbprint $Conn.CertificateThumbprint

# Set service provider Azure storage account and get the context
$StorageAccountName = "COMPTESTOCKAGE"
$StorageContainerName = "CONTAINER"
$StorageAccountKey = "VOTRECLE
$Ctx = New-AzureStorageContext $StorageAccountName -StorageAccountKey $StorageAccountKey

$workspace = Get-AutomationVariable -Name "OMSWorkspaceName"
$date = get-date -f yyyyMMddHHmm

# Run the OMS Query Search
# NOTE : Results are limited to 5000 results by the API
$result = Get-AzureRmOperationalInsightsSearchResults -ResourceGroupName "zMonitor" -WorkspaceName $($workspace) -Top 5000 -Query $dynamicQuery

# Process the report if it contains data
if ($result.Value.Count -gt 0)
{
    $result.Value | ConvertFrom-Json | Export-Csv -NoTypeInformation $env:TEMP\$($workspace)-$($reportname)-$($date)-temp.csv -Force

    Import-Csv $env:TEMP\$(Get-AutomationVariable -Name "OMSWorkspaceName")-$($reportname)-$($date)-temp.csv | 
        select-Object *,@{Name='tenantworkspace';Expression={$($workspace)}},@{Name='reportname';Expression={$($reportname)}} | 
        Export-Csv -NoTypeInformation $env:TEMP\$($workspace)-$($reportname)-$($date).csv

    #Write-Output "Moving CSV Results File to Azure Blob Storage."
    Set-AzureStorageBlobContent -Context $Ctx -File $env:TEMP\$($workspace)-$($reportname)-$($date).csv -Container $StorageContainerName -Force | Out-Null
}

Importer également les deux scripts RB-Ops-Daily.ps1 et RB-Ops-Hourly.ps1 disponible ici et publier les (EDIT => Publish) puis créer les schedules associés.

Dans PowerBI, il faut modifier la source de données du template.

La documentation nous montre également comment rajouter certains éléments à surveiller. Ensuite, la visualisation au travers du template PowerBI fourni (ici) nous permet de visualiser les données collectées. Celui-ci, en l’état demeure assez « light » mais est hautement personnalisable. Cela pose les bases, une customisation s’avère nécessaire pour obtenir un outil vraiment performant.