Exercício — Adicionar lógica condicional ao modelo do ARM
Nos exercícios anteriores, você trabalhou com máquinas virtuais do Linux. Aqui, você muda um pouco e se concentra no gerenciamento de contas de armazenamento.
Digamos que você tenha três ambientes que precise implantar: desenvolvimento, preparo eprodução.
- O ambiente de desenvolvimento é o primeiro lugar onde tudo que o seu aplicativo precisa se reúne. Esse ambiente pode incluir servidores Web, um balanceador de carga e um banco de dados.
- O ambiente de preparo é onde o teste final acontece antes que novos recursos do aplicativo sejam lançados para seus usuários finais.
- O ambiente de produção é onde os usuários finais acessam seu aplicativo.
Conforme você se move do desenvolvimento para a produção, precisa de uma infraestrutura adicional. Por exemplo, na produção, você precisa de uma conta de armazenamento adicional que não é necessária nos ambientes anteriores.
Aqui, você usa uma condição para controlar quando uma conta de armazenamento é provisionada. Isso permite que você dê suporte a cada um de seus ambientes de infraestrutura pelo mesmo modelo do ARM.
Criar um modelo do ARM
Aqui, você criará um modelo do ARM (Azure Resource Manager) que define um recurso de conta de armazenamento.
O modelo também define dois parâmetros:
environment
: o nome do ambiente atual.storageAccountName
: o nome da conta de armazenamento.
environment
pode ter um destes três valores: dev
, staging
ou production
. A condição provisiona a conta de armazenamento somente quando environment
é igual a production
.
No Visual Studio Code, crie um arquivo chamado condition.json no mesmo diretório que contém azuredeploy.json.
Adicione esse conteúdo ao condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Aqui, você implantará um modelo do ARM, com um constructo de condição, usando o PowerShell e o módulo Az.
Provisionar o ambiente de desenvolvimento
Aqui, você implanta o modelo do ARM no ambiente de desenvolvimento. Faça isso definindo o parâmetro de modelo environment
como dev
.
Como a condição provisiona a conta de armazenamento apenas quando environment
é igual a production
, você espera que o modelo não provisione a conta de armazenamento. Em outras palavras, você espera uma implantação que contenha zero recurso.
Crie uma variável do PowerShell que contenha o nome da conta de armazenamento.
$STORAGE_ACCT_NAME="tailwindsa"+ (Get-Random -COUNT 1 -Maximum 9999999 )
Os nomes da conta de armazenamento devem ser exclusivos. A parte
Get-Random
garante que o nome da conta de armazenamento termine em uma série aleatória de números.Execute o seguinte comando
New-AzResourceGroupDeployment
para implantar o modelo no ambiente de desenvolvimento:New-AzResourceGroupDeployment ` -TemplateFile "./condition.json" ` -storageAccountName $STORAGE_ACCT_NAME ` -environment dev
Verificar a implantação no desenvolvimento
Lembre-se: o esperado é que o modelo não tenha provisionado a conta de armazenamento.
Para verificar esse fato, execute o comando Get-AzStorageAccount
para confirmar se o nome da conta de armazenamento já está em uso.
Execute o comando Get-AzStorageAccount
:
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
A saída será semelhante a esta:
Get-AzStorageAccount: The Resource 'Microsoft.Storage/storageAccounts/tailwindsa4736629' under resource group '<rgn>name of resource group</rgn>' was not found. For more details please go to https://aka.ms/ARMResourceNotFoundFix
Isso indica que a conta de armazenamento ainda não foi provisionada. Você espera isso porque ainda não fez a implantação no ambiente de produção.
Provisionar o ambiente de produção
Aqui, você implementa o modelo do ARM no ambiente de produção, de forma semelhante ao que fez para o ambiente de desenvolvimento.
Como um atualizador, esta é a aparência da condição em seu modelo:
"condition": "[equals(parameters('environment'),'production')]"
Para disparar essa condição, defina o parâmetro de modelo environment
como production
.
Execute o seguinte comando New-AzResourceGroupDeployment
para implantar o modelo no ambiente de produção:
New-AzResourceGroupDeployment `
-TemplateFile "./condition.json" `
-storageAccountName $STORAGE_ACCT_NAME `
-environment production
Verificar a implantação na produção
Desta vez, você espera que o modelo tenha provisionado a conta de armazenamento.
Para verificar esse fato, execute o comando Get-AzStorageAccount
novamente para confirmar se o nome da conta de armazenamento já está em uso.
Execute o comando seguinte Get-AzStorageAccount
:
Get-AzStorageAccount -Name $STORAGE_ACCT_NAME -ResourceGroupName <rgn>sandbox resource group</rgn>
Desta vez, você obterá outra saída. Em vez de uma mensagem de erro, ele mostra a saída da tabela que exibe informações sobre o recurso de conta de armazenamento:
A saída será semelhante a esta:
Location Name Type Kind
-------- ---- ---- ----
westus tailwindsa4736629 Microsoft.Storage/storageAccounts StorageV2
Esses valores informam que a conta de armazenamento foi provisionada conforme o esperado.
Embora esse seja um exemplo básico, você vê como implantar com base em uma condição.
Na prática, os ambientes de desenvolvimento, preparo e produção conteriam recursos adicionais do Azure para dar suporte às suas necessidades de computação, rede e armazenamento. Cada ambiente provavelmente seria gerenciado por meio de seu próprio grupo de recursos para que pudesse ser provisionado e tratado como uma única unidade.
Criar um modelo do ARM
Aqui, você criará um modelo do ARM (Azure Resource Manager) que define um recurso de conta de armazenamento.
O modelo também define dois parâmetros:
environment
: o nome do ambiente atual.storageAccountName
: o nome da conta de armazenamento.
environment
pode ter um destes três valores: dev
, staging
ou production
. A condição provisiona a conta de armazenamento somente quando environment
é igual a production
.
No Visual Studio Code, crie um arquivo chamado condition.json no mesmo diretório que contém azuredeploy.json.
Adicione esse conteúdo ao condition.json:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#", "contentVersion": "1.0.0.0", "parameters": { "environment": { "type": "string", "defaultValue": "dev", "allowedValues": [ "dev", "staging", "production" ], "metadata": { "description": "a value that represents the current environment" } }, "storageAccountName": { "type": "string", "metadata": { "description": "a name for the account" } } }, "functions": [], "variables": {}, "resources": [ { "condition": "[equals(parameters('environment'),'production')]", "name": "[parameters('storageAccountName')]", "type": "Microsoft.Storage/storageAccounts", "apiVersion": "2019-06-01", "tags": { "displayName": "[parameters('storageAccountName')]" }, "location": "[resourceGroup().location]", "kind": "StorageV2", "sku": { "name": "Premium_LRS", "tier": "Premium" } } ], "outputs": {} }
Provisionar o ambiente de desenvolvimento
Aqui, você implanta o modelo do ARM no ambiente de desenvolvimento. Faça isso definindo o parâmetro de modelo environment
como dev
.
Como a condição provisiona a conta de armazenamento apenas quando environment
é igual a production
, você espera que o modelo não provisione a conta de armazenamento. Em outras palavras, você espera uma implantação que contenha zero recurso.
Crie uma variável Bash que contenha o nome da conta de armazenamento.
STORAGE_ACCT_NAME=tailwindsa$RANDOM
Os nomes da conta de armazenamento devem ser exclusivos. A parte
$RANDOM
garante que o nome da conta de armazenamento termine em uma série aleatória de números.Execute o seguinte comando
az deployment group create
para implantar o modelo no ambiente de desenvolvimento:az deployment group create \ --template-file condition.json \ --parameters storageAccountName=$STORAGE_ACCT_NAME environment=dev
Verificar a implantação no desenvolvimento
Lembre-se: o esperado é que o modelo não tenha provisionado a conta de armazenamento.
Para verificar esse fato, execute o comando az storage account check-name
para conferir se o nome da conta de armazenamento já está em uso.
Execute o seguinte comando az storage account check-name
:
az storage account check-name --name $STORAGE_ACCT_NAME
Você verá isto:
{
"message": null,
"nameAvailable": true,
"reason": null
}
O valor de nameAvailable
é true
, o que significa que o nome da conta de armazenamento ainda está disponível e ainda não foi provisionado. Você espera isso porque ainda não fez a implantação no ambiente de produção.
Provisionar o ambiente de produção
Aqui, você implementa o modelo do ARM no ambiente de produção, de forma semelhante ao que fez para o ambiente de desenvolvimento.
Como um atualizador, esta é a aparência da condição em seu modelo:
"condition": "[equals(parameters('environment'),'production')]"
Para disparar essa condição, defina o parâmetro de modelo environment
como production
.
Execute o seguinte comando az deployment group create
para implantar o modelo no ambiente de produção:
az deployment group create \
--template-file condition.json \
--parameters storageAccountName=$STORAGE_ACCT_NAME environment=production
Verificar a implantação na produção
Desta vez, você espera que o modelo tenha provisionado a conta de armazenamento.
Para verificar esse fato, execute o comando az storage account check-name
novamente para confirmar se o nome da conta de armazenamento já está em uso.
Execute o seguinte comando az storage account check-name
:
az storage account check-name --name $STORAGE_ACCT_NAME
A saída será semelhante a esta:
{
"message": "The storage account named tailwindsa32100 is already taken.",
"nameAvailable": false,
"reason": "AlreadyExists"
}
Esses valores informam que a conta de armazenamento foi provisionada conforme o esperado.
Embora esse seja um exemplo básico, você vê como implantar com base em uma condição.
Na prática, os ambientes de desenvolvimento, preparo e produção conteriam recursos adicionais do Azure para dar suporte às suas necessidades de computação, rede e armazenamento. Cada ambiente provavelmente seria gerenciado por meio de seu próprio grupo de recursos para que pudesse ser provisionado e tratado como uma única unidade.