Dashboard Power BI de vos environnements Azure
Microsoft propose un tableau Power BI pour superviser vos ressources Azure qui se nomme Continuous Cloud Optimization Power BI Dashboard (CCO Dashboard pour les intimes). Développé à l’aide du langage Power Query M, il extrait les informations directement à partir des différentes API Azure Advisor REST, Azure Security Center REST API, Azure Graph REST API, Log Analytics API et pas mal d’APIs REST Azure IaaS. Il présente les informations dans un format simplifié pour suivre les recommandations potentielles d’Azure Advisor ou d’Azure Security Center, vous permettant ainsi de filtrer par abonnements, groupes de ressources, balises ou ressources particulières.
Les prérequis sont assez légers, Power BI version Desktop, version octobre 2018, Windows 10 version 14393.0 ou ultérieur. Je ne saurais que vous recommander la vraie version Desktop de Power BI et non celle distribuée via le Windows Store, j’ai eu un problème avec les customs connectors.
Au niveau des droits, voici les providers sollicités:
Resource Provider | Permissions |
---|---|
Azure Advisor | Microsoft.Advisor/generateRecommendations/action Microsoft.Advisor/Recommendations/Read |
Azure Security | Microsoft.Security/tasks/read Microsoft.Security/Alerts/Read Microsoft.Security/Policies/Read Microsoft.Security/locations/alerts/read |
Bien que certains des fournisseurs de ressources puissent être activés par défaut, vous devez vous assurer qu’au moins les fournisseurs de ressources Microsoft.Advisor et Microsoft.Security sont enregistrés dans tous les abonnements que vous prévoyez d’analyser à l’aide de CCO Dashboard.
Il faut également générer un première recommandations de l’Advisor de Azure soir via le portail ou ce script Powershell:
<#
.SYNOPSIS
Generates Azure Advisor recommendations for all the subscriptions to the given Azure Account.
.DESCRIPTION
Generates Azure Advisor recommendations for all the subscriptions to the given Azure Account.
The script calls Login-AzureRmAccount to require authentication before it can start generating/updating Azure Advisor recommendations.
.EXAMPLE
GenerateAllSubsAdvisorRecommendations.ps1
#>
Login-AzureRmAccount
if (-not (Get-Module AzureRm.Profile))
{
Import-Module AzureRm.Profile
}
$azureRmProfileModuleVersion = (Get-Module AzureRm.Profile).Version
# refactoring performed in AzureRm.Profile v3.0 or later
if ($azureRmProfileModuleVersion.Major -ge 3)
{
$azureRmProfile = [Microsoft.Azure.Commands.Common.Authentication.Abstractions.AzureRmProfileProvider]::Instance.Profile
if (-not $azureRmProfile.Accounts.Count)
{
Write-Error "Please run Login-AzureRmAccount before calling this function."
break
}
}
else
{
# AzureRm.Profile < v3.0
$azureRmProfile = [Microsoft.WindowsAzure.Commands.Common.AzureRmProfileProvider]::Instance.Profile
if (-not $azureRmProfile.Context.Account.Count)
{
Write-Error "Please run Login-AzureRmAccount before calling this function."
break
}
}
$Timeout = 60
$currentAzureContext = Get-AzureRmContext
$profileClient = New-Object Microsoft.Azure.Commands.ResourceManager.Common.RMProfileClient($azureRmProfile)
Write-Debug ("Getting access token for tenant" + $currentAzureContext.Subscription.TenantId)
$token = $profileClient.AcquireAccessToken($currentAzureContext.Subscription.TenantId)
$headers = @{"Authorization"="Bearer " + $token.AccessToken}
Write-Debug $token.AccessToken
$SubsList = Get-AzureRmSubscription | where {$_.state -eq "Enabled"}
foreach ($sub in $SubsList)
{
$uri = ("https://management.azure.com/subscriptions/$sub/providers/Microsoft.Advisor/generateRecommendations?api-version=2017-03-31")
Write-Debug ("POST {0}" -f $uri)
$response = Invoke-WebRequest -Uri $uri -Method Post -Headers $headers
$statusUri = $response.Headers.Location
Write-Debug ("GET {0}" -f $statusUri)
$secondsElapsed = 0
while ($secondsElapsed -lt $Timeout)
{
$response = Invoke-WebRequest -Uri $statusUri -Method Get -Headers $headers
if ($response.StatusCode -eq 204) {break}
Write-Verbose ("Waiting for generation to complete for subscription {0}..." -f $sub)
Start-Sleep -Seconds 1
$secondsElapsed++
}
$result = New-Object PSObject -Property @{"SubscriptionId" = $sub; "Status" = "Success"; "SecondsElapsed" = $secondsElapsed}
if ($secondsElapsed -ge $Timeout)
{
$result.Status = "Timed out"
}
Write-Output $result
}
Azure Security Center doit également être activé, soit en version gratuite ou standard. Le niveau standard est gratuit les 30 premiers jours. L’utilisation au-delà des 30 jours est facturée automatiquement en fonction de la tarification ci-dessous (au 17 décembre 2018).
FONCTIONNALITÉS | NIVEAU GRATUIT | NIVEAU STANDARD |
---|---|---|
Stratégie de sécurité, évaluation et recommandations | ||
Solutions partenaires connectées | ||
Recherche et collecte des événements de sécurité | ‐ ‐ | |
Accès aux machines virtuelles juste-à-temps | ‐ ‐ | |
Contrôles d’application adaptatifs | ‐ ‐ | |
Détection avancée des menaces | ‐ ‐ | |
Alertes intégrées et personnalisées | ‐ ‐ | |
Informations sur les menaces | ‐ ‐ |
TYPE DE RESSOURCE | NIVEAU GRATUIT | NIVEAU STANDARD |
---|---|---|
Machine virtuelle | Gratuit | 0,017 €/Serveur/Heure Données incluses – 500 Mo/Jour |
Services d’application | Gratuit | 0,017 €/App Service/Heure |
SQL DB | Non disponible | 0,018 €/Serveur/Heure |
MySQL (version préliminaire) | Non disponible | 0,009 €/Serveur/Heure* |
PostgreSQL (version préliminaire) | Non disponible | 0,009 €/Serveur/Heure* |
Stockage (version préliminaire) | Non disponible | 0 €/10 000 transactions* |
Un custom role peut également être crée pour l’Azure RBAC via ce script Powershell:
<#
.SYNOPSIS
This script creates a new AzureRmRole and assign it to all the subscriptions for a given Azure Account with enough permissions
.DESCRIPTION
This script creates a new AzureRmRole and assign it to all the subscriptions for a given Azure Account with enough permissions
The new AzureRmRole name is defined in $RoleName variable and can be customized
. SECURITY
The script calls Login-AzureRmAccount to require authentication before it can start generating/updating Azure Advisor recommendations.
.EXAMPLE
PowerBIDashboardReadPermissionsRole.ps1
List roles
(Get-AzureRmRoleDefinition | FT Name, Description).count
List custom Roles
Get-AzureRmRoleDefinition | ?{$_.IsCustom -eq $true} | FT Name, IsCustom
#delete custom role
#Get-AzureRmRoleDefinition "Continuous Optimization Power BI Dashboard Reader" | Remove-AzureRmRoleDefinition
actions
Listing Resource Providers Operations
Get-AzureRMProviderOperation "Microsoft.Advisor/*" | FT OperationName, Operation , Description -AutoSize
Get-AzureRMProviderOperation "Microsoft.Security/*" | FT OperationName, Operation , Description -AutoSize
Get-AzureRMProviderOperation "Microsoft.ResourceHealth/*" | FT OperationName, Operation , Description -AutoSize
#>
Login-AzureRmAccount
$RoleName = "Continuous Optimization Power BI Dashboard Reader"
Get-AzureRmRoleDefinition $RoleName | Remove-AzureRmRoleDefinition
$SubsList = Get-AzureRmSubscription
$role = Get-AzureRmRoleDefinition "Contributor"
$role.Id = $null
$role.Name = $RoleName
$role.Description = $RoleName
$role.Actions.Clear()
#Azure Advisor Resource Provider Permissions
$role.Actions.Add("Microsoft.Advisor/generateRecommendations/action")
$role.Actions.Add("Microsoft.Advisor/Recommendations/Read")
#Azure Security Resource Provider Permissions
$role.Actions.Add("Microsoft.Security/tasks/read")
$role.Actions.Add("Microsoft.Security/Alerts/Read")
$role.Actions.Add("Microsoft.Security/Policies/Read")
$role.Actions.Add("Microsoft.Security/locations/alerts/read")
#Azure ResourceHealth Resource Provider Permissions
$role.Actions.Add("Microsoft.Resourcehealth/AvailabilityStatuses/read")
$role.Actions.Add("Microsoft.Resourcehealth/AvailabilityStatuses/current/read")
$role.AssignableScopes.Clear()
foreach($Sub in $SubsList)
{
$temp = $Sub.SubscriptionID
$role.AssignableScopes.Add("/subscriptions/$temp")
}
New-AzureRmRoleDefinition -Role $role
Ouvrons le template Power BI qui va nous demander en premier lieu le nom du tenant en xxx.onmicrosoft.com et de s’authentifier en Organizational Account.
Et là, c’est le drame, accès refusé…
Cela provient des Managements Groups, pour corriger le problème annulez tout et, il faut éditer la requête en ne chargeant pas les Managements Groups. Vous aurez peut être une erreur, cliquez sur FIX THIS et REFRESH et la dashboard va apparaître.
Bref, j’ai déployé ces Dashboard chez mes clients, ce qui me permet d’avoir un overview complet des ressources Azure des mes clients. La visualisation est très sympa notamment pour:
- VMs: regroupement par taille, resource group, …
- Réseau: les VNETs, subnet (in use, disponible !), VNET peerings (super cool !)
- L’advisor et Security Center
Bref, un must have 🙂
Je travaille actuellement en tant qu’Enterprise Architect pour le groupe CAPGEMINI. Acteur et expert communautaire reconnu depuis de nombreuses années, j’anime ce site autour des technologies Microsoft, des thématiques du Cloud, des infrastructures, … Je suis également à l’origine de nombreuses publications dans la presse IT.