Share via


Tutorial: usar a pilha de implantação com o Bicep (Visualização)

Neste tutorial, você aprenderá o processo de criação e gerenciamento de uma pilha de implantação. O tutorial se concentra na criação da pilha de implantação no escopo do grupo de recursos. No entanto, você também pode criar pilhas de implantação no escopo da assinatura. Para obter mais informações sobre a criação de pilhas de implantação, consulte Criar pilhas de implantação.

Pré-requisitos

Criar um arquivo Bicep

Crie um arquivo Bicep no Visual Studio Code para criar uma conta de armazenamento e uma rede virtual. Esse arquivo é usado para criar sua pilha de implantação.

param resourceGroupLocation string = resourceGroup().location
param storageAccountName string = 'store${uniqueString(resourceGroup().id)}'
param vnetName string = 'vnet${uniqueString(resourceGroup().id)}'

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: resourceGroupLocation
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2022-11-01' = {
  name: vnetName
  location: resourceGroupLocation
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.0.0/16'
      ]
    }
    subnets: [
      {
        name: 'Subnet-1'
        properties: {
          addressPrefix: '10.0.0.0/24'
        }
      }
      {
        name: 'Subnet-2'
        properties: {
          addressPrefix: '10.0.1.0/24'
        }
      }
    ]
  }
}

Salve o arquivo Bicep como main.bicep.

Criar uma pilha de implantação

Para criar um grupo de recursos e uma pilha de implantação, execute os comandos a seguir, garantindo que você forneça o caminho de arquivo Bicep apropriado com base no local de execução.

az group create \
  --name 'demoRg' \
  --location 'centralus'

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

O deny-settings-mode switch atribui um tipo específico de permissões aos recursos gerenciados, o que impede sua exclusão por entidades de segurança não autorizadas. Para obter mais informações, consulte Proteger recursos gerenciados contra exclusão.

Listar a pilha de implantação e os recursos gerenciados

Para verificar a implantação, você pode listar a pilha de implantação e listar os recursos gerenciados da pilha de implantação.

Para listar a pilha de implantação implantada:

az stack group show \
  --resource-group 'demoRg' \
  --name 'demoStack'

A saída mostra dois recursos gerenciados - uma conta de armazenamento e uma rede virtual:

{
  "actionOnUnmanage": {
    "managementGroups": "detach",
    "resourceGroups": "detach",
    "resources": "detach"
  },
  "debugSetting": null,
  "deletedResources": [],
  "denySettings": {
    "applyToChildScopes": false,
    "excludedActions": null,
    "excludedPrincipals": null,
    "mode": "none"
  },
  "deploymentId": "/subscriptions/00000000-0000-0000-0000-000000000000/demoRg/providers/Microsoft.Resources/deployments/demoStack-2023-06-08-14-58-28-fd6bb",
  "deploymentScope": null,
  "description": null,
  "detachedResources": [],
  "duration": "PT30.1685405S",
  "error": null,
  "failedResources": [],
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/demoRg/providers/Microsoft.Resources/deploymentStacks/demoStack",
  "location": null,
  "name": "demoStack",
  "outputs": null,
  "parameters": {},
  "parametersLink": null,
  "provisioningState": "succeeded",
  "resourceGroup": "demoRg",
  "resources": [
    {
      "denyStatus": "none",
      "id": "/subscriptions/00000000-0000-0000-0000-000000000000/demoRg/providers/Microsoft.Network/virtualNetworks/vnetthmimleef5fwk",
      "resourceGroup": "demoRg",
      "status": "managed"
    },
    {
      "denyStatus": "none",
      "id": "/subscriptions/00000000-0000-0000-0000-000000000000/demoRg/providers/Microsoft.Storage/storageAccounts/storethmimleef5fwk",
      "resourceGroup": "demoRg",
      "status": "managed"
    }
  ],
  "systemData": {
    "createdAt": "2023-06-08T14:58:28.377564+00:00",
    "createdBy": "johndole@contoso.com",
    "createdByType": "User",
    "lastModifiedAt": "2023-06-08T14:58:28.377564+00:00",
    "lastModifiedBy": "johndole@contoso.com",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "template": null,
  "templateLink": null,
  "type": "Microsoft.Resources/deploymentStacks"
}

Você também pode verificar a implantação listando os recursos gerenciados na pilha de implantação:

az stack group show \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --output 'json'

O resultado é semelhante a:

{
  "actionOnUnmanage": {
    "managementGroups": "detach",
    "resourceGroups": "detach",
    "resources": "detach"
  },
  "debugSetting": null,
  "deletedResources": [],
  "denySettings": {
    "applyToChildScopes": false,
    "excludedActions": null,
    "excludedPrincipals": null,
    "mode": "none"
  },
  "deploymentId": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/demoRg/providers/Microsoft.Resources/deployments/demoStack-2023-06-05-20-55-48-38d09",
  "deploymentScope": null,
  "description": null,
  "detachedResources": [],
  "duration": "PT29.006353S",
  "error": null,
  "failedResources": [],
  "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/demoRg/providers/Microsoft.Resources/deploymentStacks/demoStack",
  "location": null,
  "name": "demoStack",
  "outputs": null,
  "parameters": {},
  "parametersLink": null,
  "provisioningState": "succeeded",
  "resourceGroup": "demoRg",
  "resources": [
    {
      "denyStatus": "none",
      "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/demoRg/providers/Microsoft.Network/virtualNetworks/vnetzu6pnx54hqubm",
      "resourceGroup": "demoRg",
      "status": "managed"
    },
    {
      "denyStatus": "none",
      "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/demoRg/providers/Microsoft.Storage/storageAccounts/storezu6pnx54hqubm",
      "resourceGroup": "demoRg",
      "status": "managed"
    }
  ],
  "systemData": {
    "createdAt": "2023-06-05T20:55:48.006789+00:00",
    "createdBy": "johndole@contoso.com",
    "createdByType": "User",
    "lastModifiedAt": "2023-06-05T20:55:48.006789+00:00",
    "lastModifiedBy": "johndole@contoso.com",
    "lastModifiedByType": "User"
  },
  "tags": null,
  "template": null,
  "templateLink": null,
  "type": "Microsoft.Resources/deploymentStacks"
}

Atualizar a pilha de implantação

Para atualizar uma pilha de implantação, faça as modificações necessárias no arquivo Bicep subjacente e execute novamente o comando para criar a pilha de implantação ou use o comando set no Azure PowerShell.

Neste tutorial, você executa as seguintes atividades:

  • Atualizar uma propriedade de um recurso gerenciado.
  • Adicione um recurso à pilha.
  • Desanexe um recurso gerenciado.
  • Anexe um recurso existente à pilha.
  • Excluir um recurso gerenciado.

Atualizar um recurso gerenciado

No final da etapa anterior, você tem uma pilha com dois recursos gerenciados. Você atualizará uma propriedade do recurso da conta de armazenamento.

Edite o arquivo main.bicep para alterar o nome da sku de Standard_LRS para Standard_GRS:

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_GRS'
  }
}

Atualize o recurso gerenciado executando o seguinte comando:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

Você pode verificar a propriedade SKU executando o seguinte comando:

az resource list --resource-group 'demoRg'

Adicionar um recurso gerenciado

No final da etapa anterior, você tem uma pilha com dois recursos gerenciados. Você adicionará mais um recurso de conta de armazenamento à pilha.

Edite o arquivo main.bicep para incluir outra definição de conta de armazenamento:

resource storageAccount1 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '1${storageAccountName}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

Atualize a pilha de implantação executando o seguinte comando:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

Você pode verificar a implantação listando os recursos gerenciados na pilha de implantação:

az stack group show \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --output 'json'

Você verá a nova conta de armazenamento, além dos dois recursos existentes.

Desanexar um recurso gerenciado

No final da etapa anterior, você tem uma pilha com três recursos gerenciados. Você desanexará um dos recursos gerenciados. Depois que o recurso for desanexado, ele permanecerá no grupo de recursos.

Edite o arquivo main.bicep para remover a seguinte definição de conta de armazenamento da etapa anterior:

resource storageAccount1 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '1${storageAccountName}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

Atualize a pilha de implantação executando o seguinte comando:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

Você pode verificar a implantação listando os recursos gerenciados na pilha de implantação:

az stack group show \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --output 'json'

Você verá dois recursos gerenciados na pilha. No entanto, o recurso desanexado ainda está listado no grupo de recursos. Você pode listar os recursos no grupo de recursos executando o seguinte comando:

az resource list --resource-group 'demoRg'

Anexar um recurso existente à pilha

No final da etapa anterior, você tem uma pilha com dois recursos gerenciados. Há um recurso não gerenciado no mesmo grupo de recursos que os recursos gerenciados. Você anexará esse recurso não gerenciado à pilha.

Edite o arquivo main.bicep para incluir a definição de conta de armazenamento do recurso não gerenciado:

resource storageAccount1 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '1${storageAccountName}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

Atualize a pilha de implantação executando o seguinte comando:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

Você pode verificar a implantação listando os recursos gerenciados na pilha de implantação:

az stack group show \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --output 'json'

Você verá três recursos gerenciados.

Excluir um recurso gerenciado

No final da etapa anterior, você tem uma pilha com três recursos gerenciados. Em uma das etapas anteriores, você desanexou um recurso gerenciado. Às vezes, você pode querer excluir um recurso em vez de desanexar um. Para excluir um recurso, use uma opção delete-resources com o comando create/set.

Edite o arquivo main.bicep para remover a seguinte definição de conta de armazenamento:

resource storageAccount1 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: '1${storageAccountName}'
  location: location
  kind: 'StorageV2'
  sku: {
    name: 'Standard_LRS'
  }
}

Execute o seguinte comando com a opção delete-resources:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none' \
  --delete-resources

Além do delete-resources interruptor, existem dois outros switches disponíveis: delete-all e delete-resource-groups. Para obter mais informações, consulte Controlar descolamento e exclusão.

Você pode verificar a implantação listando os recursos gerenciados na pilha de implantação:

az stack group show \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --output 'json'

Você verá dois recursos gerenciados na pilha. O recurso também é removido do grupo de recursos. Você pode verificar o grupo de recursos executando o seguinte comando:

az resource list --resource-group 'demoRg'

Definir configurações de negação

Ao criar uma pilha de implantação, é possível atribuir um tipo específico de permissões aos recursos gerenciados, o que impede sua exclusão por entidades de segurança não autorizadas. Essas configurações são referenciadas como configurações de negação.

A CLI do Azure inclui estes parâmetros para personalizar a atribuição de negação:

  • deny-settings-mode: Define as operações que são proibidas nos recursos gerenciados para proteção contra entidades de segurança não autorizadas que tentam excluí-las ou atualizá-las. Esta restrição aplica-se a todos, a menos que o acesso seja explicitamente concedido. Os valores incluem: none, denyDeletee denyWriteAndDelete.
  • deny-settings-apply-to-child-scopes: As configurações de negação são aplicadas aos escopos de gerenciamento filho do Azure.
  • deny-settings-excluded-actions: Lista de operações de gerenciamento de controle de acesso baseado em função (RBAC) excluídas das configurações de negação. São permitidas até 200 ações.
  • deny-settings-excluded-principals: Lista de IDs principais do Microsoft Entra excluídas do bloqueio. São permitidos até cinco princípios.

Neste tutorial, você define o modo de negar configurações. Para obter mais informações sobre outras configurações de negação, consulte Proteger recursos gerenciados contra exclusão.

No final da etapa anterior, você tem uma pilha com dois recursos gerenciados.

Execute o seguinte comando com a opção de modo de configurações de negação definida como negar-excluir:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'denyDelete'

O seguinte comando delete deve falhar porque o modo deny settings está definido como deny-delete:

az resource delete \
  --resource-group 'demoRg' \
  --name '<storage-account-name>' \
  --resource-type 'Microsoft.Storage/storageAccounts'

Atualize a pilha com o modo de configurações de negação para nenhum, para que você possa concluir o restante do tutorial:

az stack group create \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --template-file './main.bicep' \
  --deny-settings-mode 'none'

Exportar modelo da pilha

Ao exportar uma pilha de implantação, você pode gerar um arquivo Bicep. Este arquivo Bicep serve como um recurso para desenvolvimento futuro e implantações subsequentes.

az stack group export \
  --name 'demoStack' \
  --resource-group 'demoRg'

Você pode canalizar a saída para um arquivo.

Excluir a pilha de implantação

Para excluir a pilha de implantação e os recursos gerenciados, execute o seguinte comando:

az stack group delete \
  --name 'demoStack' \
  --resource-group 'demoRg' \
  --delete-all

Se você executar os comandos delete sem excluir todos os parâmetros, os recursos gerenciados serão desanexados, mas não excluídos. Por exemplo:

az stack group delete \
  --name 'demoStack' \
  --resource-group 'demoRg'

Os parâmetros a seguir podem ser usados para controlar entre desanexar e excluir.

  • --delete-all: Exclua os recursos e os grupos de recursos.
  • --delete-resources: Exclua apenas os recursos.
  • --delete-resource-groups: exclua somente os grupos de recursos.

Para obter mais informações, consulte Excluir pilhas de implantação.

Próximos passos