Delen via


Bicep-implementatiescript privé uitvoeren via een privé-eindpunt

Met de Microsoft.Resources/deploymentScripts resource-API-versie 2023-08-01kunt u implementatiescripts privé uitvoeren binnen een Azure Container Instance (ACI).

De omgeving configureren

In deze installatie wordt de ACI die door het implementatiescript is gemaakt, uitgevoerd in een virtueel netwerk en wordt een privé-IP-adres verkregen. Vervolgens wordt een verbinding tot stand gebracht met een nieuw of bestaand opslagaccount via een privé-eindpunt. De containerSettings/subnetIds eigenschap geeft de ACI op die moet worden geïmplementeerd in een subnet van het virtuele netwerk.

Schermopname van architectuur op hoog niveau die laat zien hoe de infrastructuur is verbonden om implementatiescripts privé uit te voeren.

Als u implementatiescripts privé wilt uitvoeren, hebt u de volgende infrastructuur nodig, zoals te zien is in het architectuurdiagram:

  • Maak een virtueel netwerk met twee subnetten:
    • Een subnet voor het privé-eindpunt.
    • Voor een subnet voor de ACI heeft dit subnet een Microsoft.ContainerInstance/containerGroups delegatie nodig.
  • Maak een opslagaccount zonder openbare netwerktoegang.
  • Maak een privé-eindpunt in het virtuele netwerk dat is geconfigureerd met de file subresource in het opslagaccount.
  • Maak een privé-DNS-zone privatelink.file.core.windows.net en registreer het IP-adres van het privé-eindpunt als een A-record. Koppel de privé-DNS-zone aan het gemaakte virtuele netwerk.
  • Maak een door de gebruiker toegewezen beheerde identiteit met Storage File Data Privileged Contributor machtigingen voor het opslagaccount en geef deze op in de identity eigenschap in de implementatiescriptresource. Zie Identiteit om de identiteit toe te wijzen.
  • De ACI-resource wordt automatisch gemaakt door de implementatiescriptresource.

Met het volgende Bicep-bestand configureert u de infrastructuur die nodig is voor het uitvoeren van een implementatiescript privé:

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

var roleNameStorageFileDataPrivilegedContributor = '69566ab7-960f-475b-8e7c-b3118f30c6bd'
var vnetAddressPrefix = '192.168.4.0/23'
var subnetEndpointAddressPrefix = '192.168.4.0/24'
var subnetACIAddressPrefix = '192.168.5.0/24'

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

resource storageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = {
  name: storageAccountName
  kind: 'StorageV2'
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  properties: {
    publicNetworkAccess: 'Disabled'
    networkAcls: {
      defaultAction: 'Deny'
      bypass: 'AzureServices'
    }
  }
}

resource privateEndpoint 'Microsoft.Network/privateEndpoints@2023-11-01' = {
   name: storageAccount.name
   location: location
   properties: {
    privateLinkServiceConnections: [
      {
        name: storageAccount.name
        properties: {
          privateLinkServiceId: storageAccount.id
          groupIds: [
            'file'
          ]
        }
      }
    ]
    customNetworkInterfaceName: '${storageAccount.name}-nic'
    subnet: {
      id: virtualNetwork::privateEndpointSubnet.id
    }
   }
}

resource storageFileDataPrivilegedContributorReference 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  name: roleNameStorageFileDataPrivilegedContributor
  scope: tenant()
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  name: guid(storageFileDataPrivilegedContributorReference.id, managedIdentity.id, storageAccount.id)
  scope: storageAccount
  properties: {
    principalId: managedIdentity.properties.principalId
    roleDefinitionId: storageFileDataPrivilegedContributorReference.id
    principalType: 'ServicePrincipal'
  }
}

resource privateDnsZone 'Microsoft.Network/privateDnsZones@2020-06-01' = {
  name: 'privatelink.file.core.windows.net'
  location: 'global'

  resource virtualNetworkLink 'virtualNetworkLinks' = {
    name: uniqueString(virtualNetwork.name)
    location: 'global'
    properties: {
      registrationEnabled: false
      virtualNetwork: {
        id: virtualNetwork.id
      }
    }
  }

  resource resRecord 'A' = {
    name: storageAccount.name
    properties: {
      ttl: 10
      aRecords: [
        {
          ipv4Address: first(first(privateEndpoint.properties.customDnsConfigs)!.ipAddresses)
        }
      ]
    }
  }
}

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' = {
  name: vnetName
  location: location
  properties:{
    addressSpace: {
      addressPrefixes: [
        vnetAddressPrefix
      ]
    }
  }

  resource privateEndpointSubnet 'subnets' = {
    name: 'PrivateEndpointSubnet'
    properties: {
      addressPrefixes: [
        subnetEndpointAddressPrefix
      ]
    }
  }

  resource containerInstanceSubnet 'subnets' = {
    name: 'ContainerInstanceSubnet'
    properties: {
      addressPrefix: subnetACIAddressPrefix
      delegations: [
        {
          name: 'containerDelegation'
          properties: {
            serviceName: 'Microsoft.ContainerInstance/containerGroups'
          }
        }
      ]
    }
  }
}

resource privateDeploymentScript 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: deploymentScriptName
  dependsOn: [
    privateEndpoint
    privateDnsZone::virtualNetworkLink
  ]
  location: location
  kind: 'AzurePowerShell'
  identity: {
    type: 'UserAssigned'
    userAssignedIdentities: {
      '${managedIdentity.id}' : {}
    }
  }
  properties: {
    storageAccountSettings: {
      storageAccountName: storageAccount.name
    }
    containerSettings: {
      subnetIds: [
        {
          id: virtualNetwork::containerInstanceSubnet.id
        }
      ]
    }
    azPowerShellVersion: '9.0'
    retentionInterval: 'P1D'
    scriptContent: 'Write-Host "Hello World!"'
  }
}

De ACI downloadt containerinstallatiekopieën uit het Microsoft Container Registry. Als u een firewall gebruikt, staat u de URL toe mcr.microsoft.com om de installatiekopieën te downloaden. Het downloaden van de containerinstallatiekopie resulteert in de ACI die een waiting status invoert, wat uiteindelijk leidt tot een time-outfout.

Volgende stappen

In dit artikel hebt u geleerd hoe u implementatiescripts uitvoert via een privé-eindpunt. Zie voor meer informatie: