Exercício - Adicionar um arquivo de parâmetros e parâmetros seguros
Neste exercício, você criará um arquivo de parâmetro que fornece valores para o arquivo Bicep criado anteriormente. No mesmo arquivo de parâmetros, você também adicionará referências do Azure Key Vault para fornecer informações confidenciais com segurança.
Durante o processo, você fará as seguintes tarefas:
- Adicione alguns parâmetros seguros.
- Crie um arquivo de parâmetro.
- Teste a implantação para garantir que o arquivo de parâmetro seja válido.
- Crie um cofre de chaves e segredos.
- Atualize o arquivo de parâmetros para fazer referência aos segredos do cofre de chaves.
- Teste novamente a implantação para garantir que o arquivo de parâmetro ainda seja válido.
Remover o valor padrão para a SKU do plano do Serviço de Aplicativo
Para fazer seu modelo funcionar entre ambientes, os detalhes de SKU do plano do Serviço de Aplicativo do Azure serão fornecidos em um arquivo de parâmetro e não por um valor padrão.
No arquivo main.bicep no Visual Studio Code, atualize o appServicePlanSku
parâmetro para remover seu valor padrão.
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
Adicionar novos parâmetros
Agora você precisa adicionar um servidor SQL e um banco de dados. Primeiro, você adicionará parâmetros para o login e a senha do administrador e para a SKU do banco de dados. Você definirá seus valores mais tarde.
No arquivo main.bicep no Visual Studio Code, adicione os sqlServerAdministratorLogin
parâmetros , sqlServerAdministratorPassword
e sqlDatabaseSku
abaixo das declarações de parâmetro atuais. Quando terminar, suas declarações de parâmetro deverão ser parecidas com este exemplo:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
Observe que você não está especificando valores padrão para os sqlServerAdministratorLogin
parâmetros e sqlServerAdministratorPassword
. É uma má prática de segurança adicionar valores padrão para parâmetros seguros. Além disso, você não está especificando um valor padrão para sqlDatabaseSku
. Você especificará um valor em um arquivo de parâmetro.
Adicionar novas variáveis
No arquivo main.bicep no Visual Studio Code, adicione as sqlServerName
variáveis e sqlDatabaseName
abaixo das variáveis existentes. Quando terminar, suas declarações de variáveis deverão ser parecidas com este exemplo:
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
Adicionar recursos do SQL Server e do banco de dados
No arquivo main.bicep no Visual Studio Code, adicione o seguinte código à parte inferior do arquivo:
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlServerAdministratorLogin administratorLoginPassword: sqlServerAdministratorPassword } } resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: sqlDatabaseSku.name tier: sqlDatabaseSku.tier } }
Guarde as alterações ao ficheiro.
Verifique seu arquivo Bicep
Depois de concluir todas as alterações anteriores, o arquivo Bicep deve ter esta aparência:
@description('The name of the environment. This must be dev, test, or prod.')
@allowed([
'dev'
'test'
'prod'
])
param environmentName string = 'dev'
@description('The unique name of the solution. This is used to ensure that resource names are unique.')
@minLength(5)
@maxLength(30)
param solutionName string = 'toyhr${uniqueString(resourceGroup().id)}'
@description('The number of App Service plan instances.')
@minValue(1)
@maxValue(10)
param appServicePlanInstanceCount int = 1
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
@description('The Azure region into which the resources should be deployed.')
param location string = 'eastus'
@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string
@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorPassword string
@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
resource appServicePlan 'Microsoft.Web/serverfarms@2023-12-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSku.name
tier: appServicePlanSku.tier
capacity: appServicePlanInstanceCount
}
}
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: sqlServerAdministratorLogin
administratorLoginPassword: sqlServerAdministratorPassword
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
parent: sqlServer
name: sqlDatabaseName
location: location
sku: {
name: sqlDatabaseSku.name
tier: sqlDatabaseSku.tier
}
}
Caso contrário, copie o exemplo ou ajuste o modelo para corresponder ao exemplo.
Criar um arquivo de parâmetro
Abra o Visual Studio Code e abra a pasta onde o arquivo main.bicep está localizado. Na mesma pasta, crie um novo arquivo chamado main.parameters.dev.json.
No arquivo main.parameters.dev.json, adicione o seguinte código:
{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } } } }
Guarde as alterações ao ficheiro.
Implantar o modelo Bicep com o arquivo de parâmetro
Execute o seguinte comando da CLI do Azure no terminal. Observe que você está fornecendo um arquivo de parâmetro para a implantação.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
Execute o seguinte comando do Azure PowerShell no terminal. Observe que você está fornecendo um arquivo de parâmetro para a implantação.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Você será solicitado a inserir os valores e sqlServerAdministratorPassword
parâmetros ao sqlServerAdministratorLogin
executar a implantação. Não é necessário especificar solutionName
porque ele tem um valor padrão especificado no modelo. Não é necessário especificar os outros valores de parâmetro porque seus valores são especificados no arquivo de parâmetros.
Gorjeta
Quando você insere os parâmetros seguros, os valores escolhidos devem seguir algumas regras:
sqlServerAdministratorLogin
não deve ser um nome de login facilmente adivinhável comoadmin
ouroot
. Pode conter apenas caracteres alfanuméricos e deve começar com uma letra.sqlServerAdministratorPassword
deve ter pelo menos oito caracteres e incluir letras minúsculas, letras maiúsculas, números e símbolos. Para obter mais informações sobre a complexidade da senha, consulte a política de senha do SQL Azure.
Se os valores de parâmetro não atenderem aos requisitos, o SQL do Azure não implantará seu servidor.
Além disso, certifique-se de manter uma nota do login e senha que você digita. Você os usará na próxima seção.
A implantação pode levar alguns minutos para ser concluída.
Criar um cofre de chaves e segredos
Sua empresa de brinquedos já tem um cofre de chaves com os segredos necessários para suas implantações. Para simular esse cenário, você criará um novo cofre de chaves e adicionará alguns segredos para usar.
No terminal, execute os seguintes comandos para criar o cofre de chaves e segredos. Atualize os valores das variáveis antes de executar esses comandos. Os nomes dos cofres de chaves devem ser uma cadeia de caracteres globalmente exclusiva de 3 a 24 caracteres que pode conter apenas letras maiúsculas e minúsculas, hífenes (-
) e números. Por exemplo, demo-kv-1234567abcdefg.
Atenção
Certifique-se de usar o mesmo login e senha que você usou na etapa anterior. Caso contrário, a próxima implantação não será concluída com êxito.
Para a substituição YOUR-KEY-VAULT-NAME
por um nome para o keyVaultName
cofre de chaves. Os read
comandos para as login
variáveis e password
solicitarão valores. À medida que você digita, os valores não são exibidos no terminal e não são salvos no histórico de comandos.
Para proteger os valores das variáveis na sua sessão de terminal Bash, esteja ciente dos seguintes itens:
- Os valores das variáveis não são armazenados como uma cadeia de caracteres segura e podem ser exibidos inserindo um comando como
$yourVariableName
na linha de comando ou com oecho
comando. Neste exercício, depois que os segredos do cofre forem criados, você poderá remover o valor existente de cada variável executando osread
comandos sem inserir um valor. - O
az keyvault secret set
usa o parâmetro para criar o--value
valor de um segredo. A saída do comando exibe uma propriedade chamadavalue
que contém o valor do segredo. Você pode suprimir toda a saída do comando com o parâmetro--output none
, conforme mostrado no exemplo.
Para criar as keyVaultName
variáveis , login
e , execute password
cada comando separadamente. Em seguida, você pode executar o bloco de comandos para criar o cofre de chaves e segredos.
keyVaultName='YOUR-KEY-VAULT-NAME'
read -s -p "Enter the login name: " login
read -s -p "Enter the password: " password
az keyvault create --name $keyVaultName --location eastus --enabled-for-template-deployment true
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorLogin" --value $login --output none
az keyvault secret set --vault-name $keyVaultName --name "sqlServerAdministratorPassword" --value $password --output none
Nota
Você está definindo a --enabled-for-template-deployment
configuração no cofre para que o Azure possa usar os segredos do seu cofre durante as implantações. Se você não definir essa configuração, por padrão, suas implantações não poderão acessar segredos em seu cofre.
Além disso, quem executa a implantação também deve ter permissão para acessar o cofre. Como você criou o cofre de chaves, você é o proprietário, portanto, não precisará conceder explicitamente a permissão neste exercício. Para seus próprios cofres, você precisa conceder acesso aos segredos.
Para a substituição YOUR-KEY-VAULT-NAME
por um nome para o keyVaultName
cofre de chaves. Os Read-Host
comandos para as login
variáveis e password
solicitarão valores. À medida que você digita, os valores não são exibidos no terminal e não são salvos no histórico de comandos. Os valores são armazenados como uma cadeia de caracteres segura.
Para criar as keyVaultName
variáveis , login
e , execute password
cada comando separadamente. Em seguida, você pode executar o bloco de comandos para criar o cofre de chaves e segredos.
$keyVaultName = 'YOUR-KEY-VAULT-NAME'
$login = Read-Host "Enter the login name" -AsSecureString
$password = Read-Host "Enter the password" -AsSecureString
New-AzKeyVault -VaultName $keyVaultName -Location eastus -EnabledForTemplateDeployment
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorLogin' -SecretValue $login
Set-AzKeyVaultSecret -VaultName $keyVaultName -Name 'sqlServerAdministratorPassword' -SecretValue $password
Nota
Você está definindo a -EnabledForTemplateDeployment
configuração no cofre para que o Azure possa usar os segredos do seu cofre durante as implantações. Se você não definir essa configuração, por padrão, suas implantações não poderão acessar segredos em seu cofre.
Além disso, quem executa a implantação também deve ter permissão para acessar o cofre. Como você criou o cofre de chaves, você é o proprietário, portanto, não precisará conceder explicitamente a permissão neste exercício. Para seus próprios cofres, você precisa conceder acesso aos segredos.
Obter o ID de recurso do cofre de chaves
Para usar os segredos do cofre de chaves em sua implantação, você precisa do ID de recurso do cofre. Execute o seguinte comando para recuperar o ID de recurso do cofre de chaves:
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
O ID do recurso será semelhante a este exemplo:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
Copie o ID do recurso. Irá utilizá-lo no próximo passo.
Adicionar uma referência de cofre de chaves a um arquivo de parâmetros
No arquivo main.parameters.dev.json, acrescente o seguinte código após a
sqlDatabaseSku
chave de fechamento do parâmetro. Certifique-se de substituirYOUR-KEY-VAULT-RESOURCE-ID
pelo valor do ID do recurso do cofre de chaves copiado na etapa anterior. Depois de terminar, o arquivo de parâmetros deve se parecer com este exemplo:{ "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#", "contentVersion": "1.0.0.0", "parameters": { "appServicePlanSku": { "value": { "name": "F1", "tier": "Free" } }, "sqlDatabaseSku": { "value": { "name": "Standard", "tier": "Standard" } }, "sqlServerAdministratorLogin": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorLogin" } }, "sqlServerAdministratorPassword": { "reference": { "keyVault": { "id": "YOUR-KEY-VAULT-RESOURCE-ID" }, "secretName": "sqlServerAdministratorPassword" } } } }
Guarde as alterações ao ficheiro.
Implantar o modelo Bicep com arquivo de parâmetro e referências do Azure Key Vault
Execute o seguinte comando da CLI do Azure no terminal. Você está fornecendo um arquivo de parâmetro junto com um arquivo Bicep.
az deployment group create \
--template-file main.bicep \
--parameters main.parameters.dev.json
Execute o seguinte comando do Azure PowerShell no terminal. Você está fornecendo um arquivo de parâmetro junto com um arquivo Bicep.
New-AzResourceGroupDeployment `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Você não será solicitado a inserir os valores e sqlServerAdministratorPassword
parâmetros quando sqlServerAdministratorLogin
executar a implantação desta vez. Em vez disso, o Azure recupera os valores do seu cofre de chaves.
Desta vez, a implantação é concluída mais rapidamente porque os recursos do Azure já existem.
Verificar a implementação
No navegador, volte para o portal do Azure. Vá para o seu grupo de recursos. Você ainda verá uma implantação bem-sucedida, porque a implantação usou o mesmo nome da primeira implantação.
Selecione o link 1 Êxito .
Selecione a implantação chamada principal.
No menu à esquerda, selecione Entradas.
Observe que os valores e
appServicePlanSku
ossqlDatabaseSku
parâmetros foram definidos para os valores no arquivo de parâmetros. Além disso, observe que ossqlServerAdministratorLogin
valores esqlServerAdministratorPassword
parâmetro não são exibidos, porque você aplicou o@secure()
decorador a eles.