# Automatiser la création de souscriptions Azure

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:

```powershell
$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
```

```bash
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 :

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688657734543/122f422f-43c5-41e8-9049-9e94ab5a99d1.png align="center")

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Pensez à sauvegarder ces informations précieuses dans un coffre fort tel qu'un <strong>Azure Key Vault 🔐</strong></div>
</div>

# 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 :
        
        ```bash
        az ad sp list --display-name "SubscriptionsGenerator" --query "[].id" -o tsv
        ```
        
    * Via le portail :
        
        ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688719808368/9922d8a2-8adc-4dab-9336-40aec25622cf.png align="center")
        
* 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)](https://portal.azure.com/#view/Microsoft_Azure_GTM/ModernBillingMenuBlade/~/AccessControl)
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688656150814/cc070f7d-e638-424c-9acd-7ae4e1348427.png align="center")
    
* Le **billing acount ID** peut-être récupéré via ce lien : [Billing account Overview](https://portal.azure.com/#view/Microsoft_Azure_GTM/ModernBillingMenuBlade/~/Overview)
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688648013568/1f0b9160-de3f-422a-a1b5-727b47b5aa80.png align="center")

* L'**enrollment account ID** se trouve dans la liste suivante : [Accounts](https://portal.azure.com/#view/Microsoft_Azure_GTM/ModernBillingMenuBlade/~/accounts)
    

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1688648733036/c9734e04-878e-499f-8751-ef870f65eb73.png align="center")

# 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

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text">Pour cette étape ouvrez votre navigateur préféré en suivant cette URL: <a target="_blank" rel="noopener noreferrer nofollow" href="https://learn.microsoft.com/fr-fr/rest/api/billing/2019-10-01-preview/role-assignments/put?tabs=HTTP" style="pointer-events: none">https://learn.microsoft.com/fr-fr/rest/api/billing/2019-10-01-preview/role-assignments/put?tabs=HTTP</a></div>
</div>

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689002616340/0563558f-f135-407d-b558-9ec4515aeee8.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689002913301/ad5ac28d-1b30-4b83-9f37-0c9d6b78f18b.png align="center")

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](https://guidgenerator.com/online-guid-generator.aspx) soit via du PowerShell:
    
    ```powershell
    New-Guid
    ```
    
    ![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689783269589/3dde7b20-d831-4189-a590-47af4e852213.png align="center")
    
* **enrollmentAccountName:** 12666
    
* **body:**
    

```json
{
  "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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689004315078/b1e0f512-6a8a-43e8-8844-8ceaf3524d45.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689004382905/80963675-e71b-419e-94f4-f30833dae753.png align="center")

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

```json
{
  "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)":

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689783350221/3fb9c2e9-6603-4960-b0ee-e60c6a965bad.png align="center")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689068439522/2b8bd486-9761-48be-80d7-3fbd2f8d2444.png align="center")

Au final, vous devriez avoir ce résultat:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689068629343/0d54f898-68a0-46c1-84b9-10b6dc81aa9c.png align="center")

## 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:

```bash
az login --service-principal -u "<app-id>" -p "<secret>" --tenant "<tenant>"
```

<div data-node-type="callout">
<div data-node-type="callout-emoji">💡</div>
<div data-node-type="callout-text"><strong>Astuce</strong>: pour ne pas faire apparaitre le secret utilisez cette commande bash: <strong><em>read -sp "Azure password: " AZ_PASS &amp;&amp; echo &amp;&amp; az login --service-principal -u "&lt;app-id&gt;" -p $AZ_PASS --tenant "&lt;tenant&gt;"</em></strong></div>
</div>

```bash
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:

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689069205115/eeadb5f1-7976-4d0b-9022-5715c8c5fc3f.png align="left")

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

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689068939575/b561d9aa-a0c8-4c6b-990a-81c95792d0c6.png align="center")

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

```yaml
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 😍

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1689069415967/db3bb17a-3d13-46b1-9b11-d7ba43754dbf.png align="center")

# Liens utiles:

* [Attribuer des rôles à des noms de principal du service Contrat Entreprise Azure](https://learn.microsoft.com/fr-fr/azure/cost-management-billing/manage/assign-roles-azure-service-principals#permissions-that-can-be-assigned-to-the-spn)
    
* [API Management - Créez ou mettez à jour une attribution de rôle de facturation](https://learn.microsoft.com/fr-fr/rest/api/billing/2019-10-01-preview/enrollment-account-role-assignments/put?tabs=HTTP)
    
* [Azure CLI - Connexion avec un principal de service](https://learn.microsoft.com/fr-fr/cli/azure/authenticate-azure-cli#sign-in-with-a-service-principal)
    
* [Azure CLI - az account alias create](https://learn.microsoft.com/fr-fr/cli/azure/account/alias?view=azure-cli-latest#az-account-alias-create)
