Exercice – Déploiement de ressources dans plusieurs étendues avec des modules

Effectué

Notes

Cet exercice nécessite un abonnement Azure. À défaut, vous pouvez créer un abonnement gratuit.

L’équipe R&D vous a demandé votre aide pour créer un réseau virtuel dans l’abonnement Project Teddybear. Or, vous savez que vous allez seconder l’équipe sur d’autres abonnements à l’avenir. Vous décidez donc d’étendre votre modèle Bicep réutilisable pour déployer un réseau virtuel que les membres de l’équipe pourront utiliser.

Dans cet exercice, vous allez mettre à jour le modèle que vous avez commencé à construire dans le dernier exercice.

Pendant ce processus, vous allez :

  • Mettre à jour le modèle étendu à l’abonnement pour créer un groupe de ressources
  • Créer un module Bicep distinct avec un réseau virtuel et utiliser des paramètres pour contrôler la façon dont le réseau virtuel est configuré
  • Mettre à jour le modèle pour déployer le module dans le groupe de ressources
  • Déployez le modèle.

Pour mener à bien cet exercice, vous devez disposer de l’autorisation de déployer des ressources dont l’étendue est délimitée par l’abonnement. Si vous ne pouvez pas répondre à cet impératif avec votre compte Azure actuel, vous pouvez obtenir un essai gratuit pour créer un abonnement Azure et un locataire. Vous pouvez également ignorer les étapes de déploiement de cet exercice.

Créer un groupe de ressources

  1. Dans Visual Studio Code, ouvrez le fichier main.bicep que vous avez créé dans l’exercice précédent.

  2. Sous les définitions de variables actuelles, ajoutez la définition de variable suivante :

    var resourceGroupName = 'ToyNetworking'
    
  3. En bas du fichier, ajoutez la définition de ressource suivante :

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    Comme vous pouvez le constater, le groupe de ressources est défini comme n’importe quelle autre ressource. Un groupe de ressources constitue une ressource étendue à l’abonnement qui peut être déployée et gérée dans des fichiers Bicep pour lesquels targetScope est égal à subscription.

  4. Enregistrez les modifications du fichier.

Ajout d’un module pour créer un réseau virtuel

Vous allez maintenant créer un module Bicep pour le réseau virtuel de l’équipe R&D. Vous déploierez les ressources du module dans le groupe de ressources plus tard dans cet exercice.

  1. Dans Visual Studio Code, créez un nouveau dossier appelé modules dans le même dossier que celui où vous avez créé votre fichier main.bicep.

  2. Dans le dossier modules, créez et enregistrez un fichier appelé virtualNetwork.bicep.

  3. Dans le fichier virtualNetwork.bicep, ajoutez le contenu suivant :

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    Comme vous pouvez le constater, aucun targetScope n’est spécifié pour ce module. Ce n’est en effet pas nécessaire lorsque le fichier Bicep cible un groupe de ressources.

  4. Enregistrez les modifications du fichier.

Utilisation du module dans le déploiement de l’abonnement

Vous pouvez maintenant indiquer à Bicep de déployer le module dans le groupe de ressources.

  1. Dans le fichier main.bicep dans Visual Studio Code, ajoutez les définitions de paramètre suivantes sous la ligne targetScope :

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    Ces paramètres rendent le modèle réutilisable. Chaque fois que l’équipe R&D a besoin d’un nouvel abonnement, vous pouvez créer un réseau virtuel avec un nom et une plage d’adresses IP uniques.

  2. En bas du fichier, ajoutez la définition de module suivante :

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    Comme vous pouvez le constater, le scope du module est spécifié explicitement. Bicep comprend que les ressources du module doivent être déployées dans le groupe de ressources créé plus tôt dans le fichier.

Vérification du modèle

Votre fichier main.bicep se présente ainsi :

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

Votre fichier modules/virtualNetwork.bicep se présente ainsi :

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

Si l’un des fichiers ne correspond pas, copiez l’exemple ou ajustez votre modèle.

Déployer le modèle sur Azure

Dans le terminal Visual Studio Code, déployez le modèle en utilisant les commandes Azure CLI suivantes :

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

Dans le terminal Visual Studio Code, déployez le modèle en utilisant les commandes Azure PowerShell suivantes :

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

Comme vous pouvez le constater, des valeurs sont transmises pour les paramètres virtualNetworkName et virtualNetworkAddressPrefix. Si une autre équipe R&D vous demande de lui préparer un abonnement, vous pouvez modifier ces valeurs pour lui fournir son propre réseau virtuel.

Le déploiement peut prendre une ou deux minutes. Une notification de déploiement réussi s’affiche ensuite.

Vérifier le déploiement

Vous allez maintenant vérifier le groupe de ressources et le déploiement que le module a créés.

  1. Accédez au portail Azure.

  2. Dans le volet gauche, sélectionnez Groupes de ressources. Comme vous pouvez le constater, le groupe de ressources ToyNetworking a été créé.

  3. Sélectionnez le groupe de ressources ToyNetworking. Comme vous pouvez le constater, le module a bien été déployé dans le groupe de ressources, et le réseau virtuel a été créé :

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

Nettoyer les ressources

Vous avez déployé les ressources étendues à l’abonnement (notamment un groupe de ressources). Vous avez par ailleurs utilisé un module pour déployer la ressource dans le groupe de ressources que vous avez créé. Vous pouvez supprimer les ressources de stratégie et le groupe de ressources que vous avez créés.

Attention

Cette commande supprime définitivement le groupe de ressources nommé ToyNetworking et toutes ses ressources. Si vous avez déployé autre chose dans ce groupe de ressources, ignorez cette étape.

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking