Partager via


Accéder à un réseau virtuel privé à partir d’un script de déploiement Bicep

Avec la version Microsoft.Resources/deploymentScripts2023-08-01, vous pouvez exécuter des scripts de déploiement dans des réseaux privés avec des configurations supplémentaires :

  • Créez une identité managée affectée par l’utilisateur et spécifiez-la dans la propriété identity. Pour affecter l’identité, consultez Identité.

  • Créez un compte de stockage dans le réseau privé et spécifiez le script de déploiement pour utiliser le compte de stockage existant. Pour plus d’informations, consultez Utiliser un compte de stockage existant. Une autre configuration est requise pour le compte de stockage :

    1. Ouvrez le compte de stockage dans le portail Microsoft Azure.
    2. Dans le menu de gauche, sélectionnez Gestion des identités et des accès (IAM), puis l’onglet Attributions de rôles.
    3. Ajoutez le rôle Contributeur privilégié aux données de fichier de stockage à l’identité managée affectée par l’utilisateur.
    4. Dans le menu de gauche, sous Sécurité et mise en réseau, sélectionnezMise en réseau, puis Pare-feu et réseaux virtuels.
    5. Sélectionnez Activé à partir de réseaux virtuels et d’adresses IP sélectionnés.
    6. Sous Réseaux virtuels, ajoutez un sous-réseau. Dans la capture d’écran suivante, le sous-réseau est appelé dspvnVnet.
    7. Sous Exceptions, sélectionnez Autoriser les services Azure de la liste des services approuvés à accéder à ce de stockage.

    Capture d’écran des sélections permettant la configuration d’un compte de stockage pour accéder à un réseau privé.

Le fichier Bicep suivant montre comment configurer l’environnement pour l’exécution d’un script de déploiement :

@maxLength(10) // Required maximum length, because the storage account has a maximum of 26 characters
param prefix string
param location string = resourceGroup().location
param userAssignedIdentityName string = '${prefix}Identity'
param storageAccountName string = '${prefix}stg${uniqueString(resourceGroup().id)}'
param vnetName string = '${prefix}Vnet'
param subnetName string = '${prefix}Subnet'

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    enableDdosProtection: false
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: '10.0.0.0/24'
          serviceEndpoints: [
            {
              service: 'Microsoft.Storage'
            }
          ]
          delegations: [
            {
              name: 'Microsoft.ContainerInstance.containerGroups'
              properties: {
                serviceName: 'Microsoft.ContainerInstance/containerGroups'
              }
            }
          ]
        }
      }
    ]
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-05-01' existing = {
  parent: vnet
  name: subnetName
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: [
        {
          id: subnet.id
          action: 'Allow'
          state: 'Succeeded'
        }
      ]
      defaultAction: 'Deny'
    }
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' = {
  name: userAssignedIdentityName
  location: location
}

resource storageFileDataPrivilegedContributor 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  name: '69566ab7-960f-475b-8e7c-b3118f30c6bd' // Storage File Data Privileged Contributor
  scope: tenant()
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount

  name: guid(storageFileDataPrivilegedContributor.id, userAssignedIdentity.id, storageAccount.id)
  properties: {
    principalId: userAssignedIdentity.properties.principalId
    roleDefinitionId: storageFileDataPrivilegedContributor.id
    principalType: 'ServicePrincipal'
  }
}

Vous pouvez utiliser le fichier Bicep suivant pour tester le déploiement :

param prefix string

param location string  = resourceGroup().location
param utcValue string = utcNow()

param storageAccountName string
param vnetName string
param subnetName string
param userAssignedIdentityName string

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' existing = {
  name: vnetName

  resource subnet 'subnets' existing = {
    name: subnetName
  }
}

resource userAssignedIdentity 'Microsoft.ManagedIdentity/userAssignedIdentities@2023-01-31' existing = {
  name: userAssignedIdentityName
}

resource dsTest 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: '${prefix}DS'
  location: location
  identity: {
    type: 'userAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  kind: 'AzureCLI'
  properties: {
    forceUpdateTag: utcValue
    azCliVersion: '2.52.0'
    storageAccountSettings: {
      storageAccountName: storageAccountName
    }
    containerSettings: {
      subnetIds: [
        {
          id: vnet::subnet.id
        }
      ]
    }
    scriptContent: 'echo "Hello world!"'
    retentionInterval: 'P1D'
    cleanupPreference: 'OnExpiration'
  }
}

Étapes suivantes

Dans cet article, vous avez appris à accéder à un réseau virtuel privé. Pour en savoir plus :