Bagikan melalui


Menjalankan skrip penyebaran Bicep secara privat melalui titik akhir privat

Microsoft.Resources/deploymentScripts Dengan versi 2023-08-01API sumber daya , Anda dapat menjalankan skrip penyebaran secara privat dalam Azure Container Instance (ACI).

Mengonfigurasi lingkungan

Dalam penyiapan ini, ACI yang dibuat oleh skrip penyebaran berjalan dalam jaringan virtual dan mendapatkan alamat IP privat. Kemudian membuat koneksi ke akun penyimpanan baru atau yang sudah ada sebelumnya melalui titik akhir privat. Properti containerSettings/subnetIds menentukan ACI yang harus disebarkan dalam subnet jaringan virtual.

Cuplikan layar arsitektur tingkat tinggi memperlihatkan bagaimana infrastruktur terhubung untuk menjalankan skrip penyebaran secara privat.

Untuk menjalankan skrip penyebaran secara privat, Anda memerlukan infrastruktur berikut seperti yang terlihat dalam diagram arsitektur:

  • Buat jaringan virtual dengan dua subnet:
    • Subnet untuk titik akhir privat.
    • Subnet untuk ACI, subnet ini memerlukan Microsoft.ContainerInstance/containerGroups delegasi.
  • Buat akun penyimpanan tanpa akses jaringan publik.
  • Buat titik akhir privat dalam jaringan virtual yang dikonfigurasi dengan file sub-sumber daya pada akun penyimpanan.
  • Buat zona privatelink.file.core.windows.net DNS privat dan daftarkan alamat IP titik akhir privat sebagai catatan A. Tautkan zona DNS privat ke jaringan virtual yang dibuat.
  • Buat identitas terkelola yang ditetapkan pengguna dengan Storage File Data Privileged Contributor izin di akun penyimpanan dan tentukan di identity properti di sumber daya skrip penyebaran. Untuk menetapkan identitas, lihat Identitas.
  • Sumber daya ACI dibuat secara otomatis oleh sumber daya skrip penyebaran.

File Bicep berikut mengonfigurasi infrastruktur yang diperlukan untuk menjalankan skrip penyebaran secara privat:

@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 mengunduh gambar kontainer dari Microsoft Container Registry. Jika Anda menggunakan firewall, izinkan daftar URL mcr.microsoft.com untuk mengunduh gambar. Kegagalan untuk mengunduh gambar kontainer menghasilkan ACI yang memasuki status waiting , akhirnya menyebabkan kesalahan waktu habis.

Langkah berikutnya

Dalam artikel ini, Anda mempelajari cara menjalankan skrip penyebaran melalui titik akhir privat. Untuk mempelajari selengkapnya: