Aracılığıyla paylaş


Bicep dağıtım betiğini özel uç nokta üzerinden özel olarak çalıştırma

Microsoft.Resources/deploymentScripts Kaynak API sürümü 2023-08-01ile dağıtım betiklerini bir Azure Container Instance (ACI) içinde özel olarak çalıştırabilirsiniz.

Ortamı yapılandırma

Bu kurulumda, dağıtım betiği tarafından oluşturulan ACI bir sanal ağ içinde çalışır ve özel bir IP adresi alır. Ardından özel bir uç nokta aracılığıyla yeni veya önceden var olan bir depolama hesabıyla bağlantı kurar. containerSettings/subnetIds özelliği, sanal ağın bir alt ağına dağıtılması gereken ACI'yi belirtir.

Altyapının dağıtım betiklerini özel olarak çalıştırmak için nasıl bağlanacaklarını gösteren üst düzey mimarinin ekran görüntüsü.

Dağıtım betiklerini özel olarak çalıştırmak için mimari diyagramında görüldüğü gibi aşağıdaki altyapıya ihtiyacınız vardır:

  • İki alt ağ ile bir sanal ağ oluşturun:
    • Özel uç nokta için bir alt ağ.
    • ACI için bir alt ağ, bu alt ağın bir Microsoft.ContainerInstance/containerGroups temsilciye ihtiyacı vardır.
  • Genel ağ erişimi olmadan bir depolama hesabı oluşturun.
  • Depolama hesabındaki alt kaynakla file yapılandırılmış sanal ağ içinde özel bir uç nokta oluşturun.
  • Özel bir DNS bölgesi privatelink.file.core.windows.net oluşturun ve özel uç nokta IP adresini A kaydı olarak kaydedin. Özel DNS bölgesini oluşturulan sanal ağa bağlayın.
  • Depolama hesabında izinlere sahip Storage File Data Privileged Contributor kullanıcı tarafından atanan bir yönetilen kimlik oluşturun ve bunu identity dağıtım betiği kaynağındaki özelliğinde belirtin. Kimliği atamak için bkz . Kimlik.
  • ACI kaynağı, dağıtım betiği kaynağı tarafından otomatik olarak oluşturulur.

Aşağıdaki Bicep dosyası, dağıtım betiğini özel olarak çalıştırmak için gereken altyapıyı yapılandırıyor:

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

ACI, Microsoft Container Registry'den kapsayıcı görüntülerini indirir. Güvenlik duvarı kullanıyorsanız görüntüyü indirmek için URL mcr.microsoft.com izin verilenler listesine ekleyin. Kapsayıcı görüntüsünün indirilememesi, ACI'nin bir waiting duruma girmesiyle sonuçlanır ve sonunda zaman aşımı hatasına neden olur.

Sonraki adımlar

Bu makalede, dağıtım betiklerini özel bir uç nokta üzerinden çalıştırmayı öğrendiniz. Daha fazlasını öğrenin: