Menjalankan skrip penyebaran Bicep secara privat melalui titik akhir privat
Microsoft.Resources/deploymentScripts
Dengan versi 2023-08-01
API 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.
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 diidentity
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: