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 :

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 tsvVia 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Île | Actions autorisées | ID du rÎle |
| EnrollmentReader | Les 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 purchaser | Acheter 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 |
| DepartmentReader | TĂ©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 |
| SubscriptionCreator | CrĂ©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
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>"
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 :
Azure Resource Manager
Service principal (manual)
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 đ







