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-01
ile 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.
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 bunuidentity
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: