Compartilhar via


Acessar uma rede virtual privada de u script de implantação do Bicep

Com o Microsoft.Resources/deploymentScripts 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 na propriedade identity. 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, então, selecione a guia Atribuições de função.
    3. Atribua a função de Colaborador com privilégios de dados de 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 Habilitado a partir das 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 esta conta de armazenamento.

    Captura de tela das seleções de configuração de uma conta de armazenamento para acessar 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óximas etapas

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