Este guia de início rápido descreve como criar e implantar uma especificação de modelo com um arquivo Bicep. Uma especificação de modelo é implantada em um grupo de recursos para que as pessoas em sua organização possam implantar recursos no Microsoft Azure. As especificações de modelo permitem compartilhar modelos de implantação sem a necessidade de conceder aos usuários acesso para alterar o arquivo Bicep. Este exemplo de especificação de modelo usa um arquivo Bicep para implantar uma conta de armazenamento.
Quando você cria uma especificação de modelo, o arquivo Bicep é transferido para JSON (JavaScript Object Notation). A especificação de modelo usa JSON para implantar recursos do Azure. Atualmente, não é possível usar o portal do Microsoft Azure importar um arquivo Bicep e criar um recurso de especificação de modelo.
Pré-requisitos
Criar um arquivo Bicep
Você criará uma especificação de modelo com base em um arquivo de Bicep local. Copie o exemplo a seguir e salve-o em seu computador como main.bicep. Os exemplos usam o caminho C:\templates\main.bicep. Você pode usar um caminho diferente, mas precisa alterar os comandos.
O arquivo Bicep a seguir é usado nas guias PowerShell e CLI. A guia arquivo Bicep usa um modelo diferente que combina Bicep e JSON para criar e implantar uma especificação de modelo.
@allowed([
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param ___location string = resourceGroup().___location
var storageAccountName = 'storage${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: storageAccountName
___location: ___location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
Criar especificação de modelo
A especificação de modelo é um tipo de recurso chamado Microsoft.Resources/templateSpecs. Para criar uma especificação de modelo, use a CLI do Azure, o Azure PowerShell ou um arquivo Bicep.
Este exemplo usa o nome do grupo de recursos templateSpecRG. Você pode usar um nome diferente, mas precisa alterar os comandos.
Crie um grupo de recursos para conter a especificação de modelo.
New-AzResourceGroup `
-Name templateSpecRG `
-Location westus2
Crie a especificação de modelo nesse grupo de recursos. Nomeie a nova especificação de modelo storageSpec.
New-AzTemplateSpec `
-Name storageSpec `
-Version "1.0" `
-ResourceGroupName templateSpecRG `
-Location westus2 `
-TemplateFile "C:\templates\main.bicep"
Crie um grupo de recursos para conter a especificação de modelo.
az group create \
--name templateSpecRG \
--___location westus2
Crie a especificação de modelo nesse grupo de recursos. Nomeie a nova especificação de modelo storageSpec.
az ts create \
--name storageSpec \
--version "1.0" \
--resource-group templateSpecRG \
--___location westus2 \
--template-file "C:\templates\main.bicep"
Você pode criar uma especificação de modelo com um arquivo Bicep, mas o mainTemplate deve estar em JSON. O modelo JSON não usa a sintaxe JSON padrão. Por exemplo, não há vírgulas de fim de linha, aspas duplas são substituídas por aspas simples e barras invertidas (\) são usadas para escapar aspas simples nas expressões.
Copie o modelo a seguir e salve-o em seu computador como main.bicep.
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '1.0'
@description('Location for all resources.')
param ___location string = resourceGroup().___location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
___location: ___location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
___location: ___location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
]
}
'___location': {
'type': 'string'
'defaultValue': '[resourceGroup().___location]'
'metadata': {
'description': 'Location for all resources.'
}
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', \'storage\', uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2025-06-01'
'name': '[variables(\'storageAccountName\')]'
'___location': '[parameters(\'___location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
Use o Azure PowerShell ou a CLI do Azure para criar um grupo de recursos.
New-AzResourceGroup `
-Name templateSpecRG `
-Location westus2
az group create \
--name templateSpecRG \
--___location westus2
Crie a especificação de modelo nesse grupo de recursos. O nome de especificação do modelo storageSpec e número de versão 1.0 são parâmetros no arquivo Bicep.
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
Implantar especificação de modelo
Use a especificação de modelo para implantar uma conta de armazenamento. Este exemplo usa o nome do grupo de recursos storageRG. Você pode usar um nome diferente, mas precisa alterar os comandos.
Crie um grupo de recursos para conter a nova conta de armazenamento.
New-AzResourceGroup `
-Name storageRG `
-Location westus2
Obtenha a ID do recurso da especificação de modelo.
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "1.0").Versions.Id
Implante a especificação de modelo.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG
Você fornece parâmetros exatamente como faria para uma implantação de arquivo Bicep. Reimplante a especificação de modelo com um parâmetro para o tipo de conta de armazenamento.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageAccountType Standard_GRS
Crie um grupo de recursos para conter a nova conta de armazenamento.
az group create \
--name storageRG \
--___location westus2
Obtenha a ID do recurso da especificação de modelo.
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "1.0" --query "id")
Observação
Há um problema conhecido na obtenção de uma ID de especificação de modelo e na atribuição dela a uma variável no Windows PowerShell.
Implante a especificação de modelo.
az deployment group create \
--resource-group storageRG \
--template-spec $id
Você fornece parâmetros exatamente como faria para uma implantação de arquivo Bicep. Reimplante a especificação de modelo com um parâmetro para o tipo de conta de armazenamento.
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageAccountType="Standard_GRS"
Para implantar uma especificação de modelo usando um arquivo Bicep, use um módulo. O módulo vincula-se a uma especificação de modelo existente. Para obter mais informações, consulte arquivo na especificação de modelo.
Copie o seguinte módulo Bicep e salve-o em seu computador como storage.bicep.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
}
Substituir <subscriptionId> no módulo. Use o Azure PowerShell ou a CLI do Azure para obter sua ID da assinatura.
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
Use o Azure PowerShell ou a CLI do Azure a fim de criar um grupo de recursos para a conta de armazenamento.
New-AzResourceGroup `
-Name storageRG `
-Location westus2
az group create \
--name storageRG \
--___location westus2
Implante a especificação de modelo com o Azure PowerShell ou a CLI do Azure.
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
Você pode adicionar um parâmetro e reimplantar a especificação de modelo com um tipo de conta de armazenamento diferente. Copie o exemplo e substitua o arquivo storage.bicep. Em seguida, reimplante a implantação de especificação de modelo.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:1.0' = {
name: 'deployVersion1'
params: {
storageAccountType: 'Standard_GRS'
}
}
Conceder acesso
Se você quiser permitir que outros usuários na sua organização implantem sua especificação de modelo, precisará conceder acesso de leitura a eles. Atribua a função Leitor a um grupo do Microsoft Entra do grupo de recursos que contém as especificações de modelo que deseja compartilhar. Para saber mais, confira Tutorial: Conceder a um grupo acesso aos recursos do Azure usando o Azure PowerShell.
Atualizar um arquivo Bicep
Após a criação da especificação de modelo, você decidiu atualizar o arquivo Bicep. Para continuar com os exemplos nas guias do PowerShell ou da CLI, copie a amostra e substitua seu arquivo main.bicep.
O parâmetro storageNamePrefix especifica um valor de prefixo para o nome da conta de armazenamento. A variável storageAccountName concatena o prefixo com uma cadeia de caracteres exclusiva.
@allowed([
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
])
@description('Storage account type.')
param storageAccountType string = 'Standard_LRS'
@description('Location for all resources.')
param ___location string = resourceGroup().___location
@maxLength(11)
@description('The storage account name prefix.')
param storageNamePrefix string = 'storage'
var storageAccountName = '${toLower(storageNamePrefix)}${uniqueString(resourceGroup().id)}'
resource storageAccount 'Microsoft.Storage/storageAccounts@2025-06-01' = {
name: storageAccountName
___location: ___location
sku: {
name: storageAccountType
}
kind: 'StorageV2'
properties: {}
}
output storageAccountNameOutput string = storageAccount.name
Atualizar a versão da especificação de modelo
Em vez de criar uma especificação de modelo para o modelo revisado, adicione uma versão chamada 2.0 à especificação de modelo. Os usuários podem escolher uma das duas versões para implantar.
Crie uma nova versão da especificação de modelo.
New-AzTemplateSpec `
-Name storageSpec `
-Version "2.0" `
-ResourceGroupName templateSpecRG `
-Location westus2 `
-TemplateFile "C:\templates\main.bicep"
Para implantar a nova versão, obtenha a ID do recurso para a versão 2.0.
$id = (Get-AzTemplateSpec -ResourceGroupName templateSpecRG -Name storageSpec -Version "2.0").Versions.Id
Implante a nova versão e use o storageNamePrefix para especificar um prefixo para o nome da conta de armazenamento.
New-AzResourceGroupDeployment `
-TemplateSpecId $id `
-ResourceGroupName storageRG `
-storageNamePrefix "demo"
Crie uma nova versão da especificação de modelo.
az ts create \
--name storageSpec \
--version "2.0" \
--resource-group templateSpecRG \
--___location westus2 \
--template-file "C:\templates\main.bicep"
Para implantar a nova versão, obtenha a ID do recurso para a versão 2.0.
id=$(az ts show --name storageSpec --resource-group templateSpecRG --version "2.0" --query "id")
Implante a nova versão e use o storageNamePrefix para especificar um prefixo para o nome da conta de armazenamento.
az deployment group create \
--resource-group storageRG \
--template-spec $id \
--parameters storageNamePrefix="demo"
Crie uma nova versão da especificação do modelo. Copie o exemplo e substitua seu arquivo main.bicep.
O parâmetro storageNamePrefix especifica um valor de prefixo para o nome da conta de armazenamento. A variável storageAccountName concatena o prefixo com uma cadeia de caracteres exclusiva.
param templateSpecName string = 'storageSpec'
param templateSpecVersionName string = '2.0'
@description('Location for all resources.')
param ___location string = resourceGroup().___location
resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2022-02-01' = {
name: templateSpecName
___location: ___location
}
resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2022-02-01' = {
parent: createTemplateSpec
name: templateSpecVersionName
___location: ___location
properties: {
mainTemplate: {
'$schema': 'https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#'
'contentVersion': '1.0.0.0'
'metadata': {}
'parameters': {
'storageAccountType': {
'type': 'string'
'defaultValue': 'Standard_LRS'
'metadata': {
'description': 'Storage account type.'
}
'allowedValues': [
'Premium_LRS'
'Premium_ZRS'
'Standard_GRS'
'Standard_GZRS'
'Standard_LRS'
'Standard_RAGRS'
'Standard_RAGZRS'
'Standard_ZRS'
]
}
'___location': {
'type': 'string'
'defaultValue': '[resourceGroup().___location]'
'metadata': {
'description': 'Location for all resources.'
}
}
'storageNamePrefix': {
'type': 'string'
'defaultValue': 'storage'
'metadata': {
'description': 'The storage account name prefix.'
}
'maxLength': 11
}
}
'variables': {
'storageAccountName': '[format(\'{0}{1}\', toLower(parameters(\'storageNamePrefix\')), uniqueString(resourceGroup().id))]'
}
'resources': [
{
'type': 'Microsoft.Storage/storageAccounts'
'apiVersion': '2025-06-01'
'name': '[variables(\'storageAccountName\')]'
'___location': '[parameters(\'___location\')]'
'sku': {
'name': '[parameters(\'storageAccountType\')]'
}
'kind': 'StorageV2'
'properties': {}
}
]
'outputs': {
'storageAccountNameOutput': {
'type': 'string'
'value': '[variables(\'storageAccountName\')]'
}
}
}
}
}
Para adicionar a nova versão à especificação de modelo, implante o modelo com o Azure PowerShell ou a CLI do Azure.
New-AzResourceGroupDeployment `
-ResourceGroupName templateSpecRG `
-TemplateFile "C:\templates\main.bicep"
az deployment group create \
--resource-group templateSpecRG \
--template-file "C:\templates\main.bicep"
Copie o seguinte módulo Bicep e salve-o em seu computador como storage.bicep.
module deployTemplateSpec 'ts:<subscriptionId>/templateSpecRG/storageSpec:2.0' = {
name: 'deployVersion2'
params: {
storageNamePrefix: 'demo'
}
}
Substituir <subscriptionId> no módulo. Use o Azure PowerShell ou a CLI do Azure para obter sua ID da assinatura.
(Get-AzContext).Subscription.Id
az account show --query "id" --output tsv
Implante a especificação de modelo com o Azure PowerShell ou a CLI do Azure.
New-AzResourceGroupDeployment `
-ResourceGroupName storageRG `
-TemplateFile "C:\templates\storage.bicep"
az deployment group create \
--resource-group storageRG \
--template-file "C:\templates\storage.bicep"
Limpar os recursos
Para limpar os recursos implantados neste início rápido, exclua ambos os grupos de recursos. O grupo de recursos, as especificações de modelo e as contas de armazenamento serão excluídos.
Use o Azure PowerShell ou a CLI do Azure para excluir o grupo de recursos.
Remove-AzResourceGroup -Name "templateSpecRG"
Remove-AzResourceGroup -Name "storageRG"
az group delete --name templateSpecRG
az group delete --name storageRG
Próximas etapas