Partilhar via


Acessar uma rede virtual privada a partir de um script de implantação do Bicep

Com Microsoft.Resources/deploymentScripts a versão 2023-08-01, você pode executar scripts de implantação em redes privadas com algumas configurações adicionais:

  • Crie uma identidade gerenciada atribuída pelo usuário e especifique-a identity na propriedade. Para atribuir a identidade, consulte Identidade.

  • Crie uma conta de armazenamento na rede privada e especifique o script de implantação para usar a conta de armazenamento existente. Para obter mais informações, consulte Usar uma conta de armazenamento existente. Algumas configurações adicionais são necessárias para a conta de armazenamento:

    1. Abra a conta de armazenamento no portal do Azure.
    2. No menu à esquerda, selecione Controle de acesso (IAM) e, em seguida, selecione a guia Atribuições de função.
    3. Adicione a função de Colaborador Privilegiado de Dados do Arquivo de Armazenamento à identidade gerenciada atribuída pelo usuário.
    4. No menu à esquerda, em Segurança + rede, selecione Rede e, em seguida, selecione Firewalls e redes virtuais.
    5. Selecione Ativado a partir de redes virtuais e endereços IP selecionados.
    6. Em Redes virtuais, adicione uma sub-rede. Na captura de tela a seguir, a sub-rede é chamada dspvnVnet.
    7. Em Exceções, selecione Permitir que os serviços do Azure na lista de serviços confiáveis acessem essa conta de armazenamento.

    Captura de ecrã de seleções para configurar uma conta de armazenamento para aceder a uma rede privada.

O seguinte arquivo Bicep mostra como configurar o ambiente para executar um script de implantação:

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

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    enableDdosProtection: false
    subnets: [
      {
        name: subnetName
        properties: {
          addressPrefix: '10.0.0.0/24'
          serviceEndpoints: [
            {
              service: 'Microsoft.Storage'
            }
          ]
          delegations: [
            {
              name: 'Microsoft.ContainerInstance.containerGroups'
              properties: {
                serviceName: 'Microsoft.ContainerInstance/containerGroups'
              }
            }
          ]
        }
      }
    ]
  }
}

resource subnet 'Microsoft.Network/virtualNetworks/subnets@2023-05-01' existing = {
  parent: vnet
  name: subnetName
}
resource storageAccount 'Microsoft.Storage/storageAccounts@2023-01-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    networkAcls: {
      bypass: 'AzureServices'
      virtualNetworkRules: [
        {
          id: subnet.id
          action: 'Allow'
          state: 'Succeeded'
        }
      ]
      defaultAction: 'Deny'
    }
  }
}

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

resource storageFileDataPrivilegedContributor 'Microsoft.Authorization/roleDefinitions@2022-04-01' existing = {
  name: '69566ab7-960f-475b-8e7c-b3118f30c6bd' // Storage File Data Privileged Contributor
  scope: tenant()
}

resource roleAssignment 'Microsoft.Authorization/roleAssignments@2022-04-01' = {
  scope: storageAccount

  name: guid(storageFileDataPrivilegedContributor.id, userAssignedIdentity.id, storageAccount.id)
  properties: {
    principalId: userAssignedIdentity.properties.principalId
    roleDefinitionId: storageFileDataPrivilegedContributor.id
    principalType: 'ServicePrincipal'
  }
}

Você pode usar o seguinte arquivo Bicep para testar a implantação:

param prefix string

param location string  = resourceGroup().location
param utcValue string = utcNow()

param storageAccountName string
param vnetName string
param subnetName string
param userAssignedIdentityName string

resource vnet 'Microsoft.Network/virtualNetworks@2023-05-01' existing = {
  name: vnetName

  resource subnet 'subnets' existing = {
    name: subnetName
  }
}

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

resource dsTest 'Microsoft.Resources/deploymentScripts@2023-08-01' = {
  name: '${prefix}DS'
  location: location
  identity: {
    type: 'userAssigned'
    userAssignedIdentities: {
      '${userAssignedIdentity.id}': {}
    }
  }
  kind: 'AzureCLI'
  properties: {
    forceUpdateTag: utcValue
    azCliVersion: '2.52.0'
    storageAccountSettings: {
      storageAccountName: storageAccountName
    }
    containerSettings: {
      subnetIds: [
        {
          id: vnet::subnet.id
        }
      ]
    }
    scriptContent: 'echo "Hello world!"'
    retentionInterval: 'P1D'
    cleanupPreference: 'OnExpiration'
  }
}

Próximos passos

Neste artigo, você aprendeu como acessar uma rede virtual privada. Para saber mais: