Automatiser la création de souscriptions Azure

Photo by Sufyan on Unsplash

Automatiser la création de souscriptions Azure

L'automatisation de la création des souscriptions Azure et l'une des premières étapes à mettre en œuvre voici comment y arriver avec un SPN.

L'objectif de cet article est de détailler comment déléguer les privilèges d'un titulaire d'un compte EA à un SPN, qui pourra être exploité pour créer de façon automatisée des souscriptions Azure.

Création d'un SPN dédié

Ce SPN sera dédié à la création de souscription de façon automatisée.
Pour le créer, rien de plus simple, utilisez une des ces deux possibilités:

$password = "S3çR€t?P@ssw0rd!!!" ## TODO: Update it with your secret 🤗
$credentials = New-Object Microsoft.Azure.Commands.ActiveDirectory.PSADPasswordCredential -Property @{StartDate=Get-Date; EndDate=Get-Date -Year 2024; Password=$password}
$sp = New-AzAdServicePrincipal -DisplayName "SubscriptionsGenerator" -PasswordCredential $credentials
az ad sp create-for-rbac --name "SubscriptionsGenerator"

Pour ma part, j'ai opté pour l'Azure CLI et j'ai obtenu ce résultat :

💡
Pensez à sauvegarder ces informations précieuses dans un coffre fort tel qu'un Azure Key Vault 🔐

Identifier les pré-requis

Pour ajouter le rôle "Subscription Creator" à votre SPN vous avez besoin d'avoir un compte ayant le rôle "Enterprise Administrator" ainsi que des informations associées à la facturation Azure:

  • Récupérer l'Object ID de l'Enterprise application associée à votre SPN; vous avez plusieurs possibilités :

    • En ligne de commande :

        az ad sp list --display-name "SubscriptionsGenerator" --query "[].id" -o tsv
      
    • Via le portail :

  • Vérifier votre rôle EA pour valider que vous êtes bien "Enterprise administrator", vous pouvez suivre ce lien pour le vérifier: Access control (IAM)

  • Le billing acount ID peut-être récupéré via ce lien : Billing account Overview

  • L'enrollment account ID se trouve dans la liste suivante : Accounts

Ajout du rôle "Subscription Creator"

Autorisations pouvant être attribuées au SPN

Voici la liste des autorisations pouvant être attribuées à notre SPN, pensez à mettre de côté l'ID du rôle qui sera utilisé dans l'étape suivante.

RôleActions autoriséesID du rôle
EnrollmentReaderLes lecteurs d’inscription peuvent afficher les données dans les étendues d’inscription, de service et de compte. Les données contiennent des frais pour tous les abonnements dans les étendues, y compris entre les locataires. Permet d’afficher le solde du paiement anticipé Azure (précédemment appelé engagement financier) associé à l’inscription.24f8edb6-1668-4659-b5e2-40bb5f3a7d7e
EA purchaserAcheter des ordres de réservation et afficher les transactions de réservation. Il dispose de toutes les autorisations de EnrollmentReader, qui aura à son tour toutes les autorisations de DepartmentReader. Il permet d’afficher l’utilisation et les frais pour tous les comptes et abonnements. Permet d’afficher le solde du paiement anticipé Azure (précédemment appelé engagement financier) associé à l’inscription.da6647fb-7651-49ee-be91-c43c4877f0c4
DepartmentReaderTélécharger les détails d’utilisation pour le service qu’il administre. Permet d’afficher l’utilisation et les frais associés à son service.db609904-a47f-4794-9be8-9bd86fbffd8a
SubscriptionCreatorCréer des abonnements dans l’étendue de compte donnée.a0bcee42-bf30-4d1b-926a-48d21664ef71
  • Un rôle EnrollmentReader peut être attribué à un SPN uniquement par un utilisateur qui a le rôle d’auteur d’inscription.
    Le rôle EnrollmentReader attribué à un SPN n’est pas affiché dans le portail EA.
    Il est créé programmatiquement et ne sert qu’à des fins de programmation.

  • Un rôle DepartmentReader peut être attribué à un SPN uniquement par un utilisateur qui a le rôle d’auteur d’inscription ou d’auteur de service.

  • Un rôle SubscriptionCreator peut être attribué à un SPN uniquement par un utilisateur qui est propriétaire du compte d’inscription (administrateur EA).
    Le rôle n’apparaît pas dans le portail EA.
    Il est créé programmatiquement et ne sert qu’à des fins de programmation.

  • Le rôle EA purchaser n’apparaît pas dans le portail EA.
    Il est créé programmatiquement et ne sert qu’à des fins de programmation.

Ajout de l'autorisation SubscriptionCreator

Pour ajouter l'autorisation à notre SPN nous allons utiliser l'API REST en utilisant le lien suivant, les informations listées dans les pré-requis ainsi que l'ID du rôle SubscriptionCreator :

a0bcee42-bf30-4d1b-926a-48d21664ef71

💡
Pour cette étape ouvrez votre navigateur préféré en suivant cette URL: https://learn.microsoft.com/fr-fr/rest/api/billing/2019-10-01-preview/role-assignments/put?tabs=HTTP

Puis cliquez sur le bouton vert "Essayer" ou "Try it" :

Sur cette étape, connectez-vous avec votre compte EA Administrator pour suivre les pré-requis nécessaire pour l'ajout de droit à votre SPN.

En suivant les indications renseignez les informations, soit dans mon exemple :

  • billingAccountName: 60789023

  • billingRoleAssignmentName: a4525b46-f397-4ceb-b7cf-5b2ea04ff33e
    Pour ce paramêtre il suffit de générer un GUID soit via ce site soit via du PowerShell:

      New-Guid
    

  • enrollmentAccountName: 12666

  • body:

{
  "properties": {
    "principalId": "ccd99ff9-5c10-4e5a-b925-dd99a9cc7c5f",
    "principalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
    "roleDefinitionId": "/providers/Microsoft.Billing/billingAccounts/60789023/billingRoleDefinitions/a0bcee42-bf30-4d1b-926a-48d21664ef71"
  }
}

Le roleDefinitionId correspond à votre Billing Account suivi du rôle que vous souhaitez ajouter à votre compte.

Au final, vous devriez avoir quelque chose proche de cette image:

Descendez en bas du formulaire puis "Exécuter" cet appel API:

En retour vous devez avoir une réponse HTTP 200 de ce type:

{
  "id": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666/billingRoleAssignments/a4525b46-f397-4ceb-b7cf-5b2ea04ff33e",
  "name": "a4525b46-f397-4ceb-b7cf-5b2ea04ff33e",
  "properties": {
    "createdOn": "2023-07-04T15:48:08.4278754+00:00",
    "createdByPrincipalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
    "createdByPrincipalId": "a7d3be93-f32d-45f0-9529-eb8023b75e17",
    "createdByPrincipalPuid": "666320025A3E1393",
    "createdByUserEmailAddress": "blabla@smartcloudarchitect.fr",
    "principalId": "ccd99ff9-5c10-4e5a-b925-dd99a9cc7c5f",
    "principalTenantId": "40d0d33d-94bb-4ec5-9333-c571e343b366",
    "roleDefinitionId": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666/billingRoleDefinitions/a0bcee42-bf30-4d1b-926a-48d21664ef71",
    "scope": "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666",
    "userAuthenticationType": "Organization"
  },
  "type": "Microsoft.Billing/billingRoleAssignments"
}

Création d'une souscription

Maintenant que notre compte SPN possède le droit de "SubscriptionCreator" nous allons voir comment l'exploiter au travers d'un pipeline Azure DevOps pour automatiser la création de souscription via cet outil.

Ajout du rôle Contributeur sur le management group

Mon organisation Azure utilise les management groups, je vais donc ajouter à mon SPN le rôle de contribution sur le niveau qui m'intéresse pour le déploiement de mes nouvelles souscriptions.

Pour ce faire, depuis le management group cliquez sur "Access control (IAM)":

Puis ajouter le rôle "Contributor" à votre SPN:

Au final, vous devriez avoir ce résultat:

Création de la souscription

Pour créer la souscription Azure il suffit de se connecter avec votre SPN depuis votre terminal préféré en utilisant cette commande:

az login --service-principal -u "<app-id>" -p "<secret>" --tenant "<tenant>"
💡
Astuce: pour ne pas faire apparaitre le secret utilisez cette commande bash: read -sp "Azure password: " AZ_PASS && echo && az login --service-principal -u "<app-id>" -p $AZ_PASS --tenant "<tenant>"
az account alias create --name "PoC" --billing-scope "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666" --display-name "PoC Subscription" --workload "DevTest"

Automatisation via Azure DevOps

La première étape est de mettre en place le "service connection" en utilisant les informations de votre SPN et de votre contexte Azure au niveau du management group surlequel nous avons positionné le rôle "Contributor".

Dans la partie "Service connections" de votre projet Azure DevOps, ajouter une nouvelle connexion en sélectionnant :

  1. Azure Resource Manager

  2. Service principal (manual)

  3. Management Group

Renseignez les informations demandées par rapport à votre contexte:

Une fois les éléments renseignés et validés vous devriez avoir quelque chose de proche de cette image:

Maintenant voici comment utiliser la commande du chapitre précédent via un pipeline Azure DevOps exploitant la connexion à notre management group:

pool:
  vmImage: 'ubuntu-latest'

steps:
- task: AzureCLI@2
  inputs:
    azuresubscription: ManagementGroupServiceConnection
    scriptType: 'bash'
    ScriptType: InlineScript
    Inline: |
        az account alias create --name "PoC" --billing-scope "/providers/Microsoft.Billing/billingAccounts/60789023/enrollmentAccounts/12666" --display-name "PoC Subscription" --workload "DevTest"

Une fois exécuté, vous pourrez trouver votre nouvelle souscription fraichement créée de façon automatisée 😍

Liens utiles:

Did you find this article valuable?

Support Antoine LOIZEAU by becoming a sponsor. Any amount is appreciated!