Udostępnij za pośrednictwem


Uzyskiwanie dostępu do prywatnej sieci wirtualnej za pomocą skryptu wdrożenia Bicep

W Microsoft.Resources/deploymentScripts wersji 2023-08-01można uruchamiać skrypty wdrażania w sieciach prywatnych z kilkoma dodatkowymi konfiguracjami:

  • Utwórz tożsamość zarządzaną przypisaną przez użytkownika i określ ją we identity właściwości . Aby przypisać tożsamość, zobacz Tożsamość.

  • Utwórz konto magazynu w sieci prywatnej i określ skrypt wdrożenia, aby użyć istniejącego konta magazynu. Aby uzyskać więcej informacji, zobacz Używanie istniejącego konta magazynu. Niektóre dodatkowe konfiguracje są wymagane dla konta magazynu:

    1. Otwórz konto magazynu w witrynie Azure Portal.
    2. W menu po lewej stronie wybierz pozycję Kontrola dostępu (Zarządzanie dostępem i tożsamościami), a następnie wybierz kartę Przypisania ról.
    3. Dodaj rolę Współautor uprzywilejowanego współautora danych pliku magazynu do tożsamości zarządzanej przypisanej przez użytkownika.
    4. W menu po lewej stronie w obszarze Zabezpieczenia i sieć wybierz pozycję Sieć, a następnie wybierz pozycję Zapory i sieci wirtualne.
    5. Wybierz pozycję Włączone z wybranych sieci wirtualnych i adresów IP.
    6. W obszarze Sieci wirtualne dodaj podsieć. Na poniższym zrzucie ekranu podsieć nosi nazwę dspvnVnet.
    7. W obszarze Wyjątki wybierz pozycję Zezwalaj usługom platformy Azure na liście zaufanych usług, aby uzyskać dostęp do tego konta magazynu.

    Zrzut ekranu przedstawiający opcje konfigurowania konta magazynu na potrzeby uzyskiwania dostępu do sieci prywatnej.

Poniższy plik Bicep pokazuje, jak skonfigurować środowisko do uruchamiania skryptu wdrażania:

@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'
  }
}

Do przetestowania wdrożenia można użyć następującego pliku Bicep:

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'
  }
}

Następne kroki

W tym artykule przedstawiono sposób uzyskiwania dostępu do prywatnej sieci wirtualnej. Dodatkowe informacje: