Dashboard Power BI de vos environnements Azure


Cloud / lundi, décembre 17th, 2018
Temps de lecture estimé: 4 minutes

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 RESTAzure Security Center REST APIAzure Graph REST APILog 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 ProviderPermissions
Azure AdvisorMicrosoft.Advisor/generateRecommendations/action
Microsoft.Advisor/Recommendations/Read
Azure SecurityMicrosoft.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ÉSNIVEAU GRATUITNIVEAU STANDARD
Stratégie de sécurité, évaluation et recommandationsDisponibleDisponible
Solutions partenaires connectéesDisponibleDisponible
Recherche et collecte des événements de sécurité‐ ‐Non disponibleDisponible
Accès aux machines virtuelles juste-à-temps‐ ‐Non disponibleDisponible
Contrôles d’application adaptatifs‐ ‐Non disponibleDisponible
Détection avancée des menaces‐ ‐Non disponibleDisponible
Alertes intégrées et personnalisées‐ ‐Non disponibleDisponible
Informations sur les menaces‐ ‐Non disponibleDisponible
TYPE DE RESSOURCENIVEAU GRATUITNIVEAU STANDARD
Machine virtuelleGratuit0,017 €/Serveur/Heure
Données incluses – 500 Mo/Jour
Services d’applicationGratuit0,017 €/App Service/Heure
SQL DBNon disponible0,018 €/Serveur/Heure
MySQL (version préliminaire)Non disponible0,009 €/Serveur/Heure*
PostgreSQL (version préliminaire)Non disponible0,009 €/Serveur/Heure*
Stockage (version préliminaire)Non disponible0 €/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 🙂

image_printImprimer l'article

Je travaille actuellement en tant que Cloud Solution Architect et CoE Azure Lead pour le groupe CAPGEMINI. Acteur et expert communautaire reconnu depuis de nombreuses années, j’anime cette communauté autour des technologies Microsoft, modère les forums officiels Microsoft Technet et participe régulièrement aux  évènements  tels  que  les  Microsoft  Techdays/Expériences  ou  les  Microsoft  Days  en  tant  qu’Ask  The  Expert ou speaker. Je suis à l’origine de nombreuses publications dans le presse IT.

Mon implication communautaire m’a valu la reconnaissance de mes pairs et de Microsoft Corp au titre de Most Valuble Professionnal depuis plus de 9 années et suis également Microsoft P-Seller.

Partagez si ça vous plait !