Exercício - Adicionar um arquivo de parâmetros e parâmetros seguros

Concluído

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 sqlServerAdministratorLoginparâmetros , sqlServerAdministratorPassworde 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

  1. 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
      }
    }
    
  2. 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

  1. 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.

  2. 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"
          }
        }
      }
    }
    
  3. 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 como admin ou root. 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 o echo comando. Neste exercício, depois que os segredos do cofre forem criados, você poderá remover o valor existente de cada variável executando os read 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 chamada value 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 keyVaultNamevariáveis , logine , 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 keyVaultNamevariáveis , logine , 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

  1. No arquivo main.parameters.dev.json, acrescente o seguinte código após a sqlDatabaseSku chave de fechamento do parâmetro. Certifique-se de substituir YOUR-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"
          }
        }
      }
    }
    
  2. 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

  1. 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.

  2. Selecione o link 1 Êxito .

  3. Selecione a implantação chamada principal.

  4. No menu à esquerda, selecione Entradas.

  5. Observe que os valores e appServicePlanSku os sqlDatabaseSku parâmetros foram definidos para os valores no arquivo de parâmetros. Além disso, observe que os sqlServerAdministratorLogin valores e sqlServerAdministratorPassword parâmetro não são exibidos, porque você aplicou o @secure() decorador a eles.

    Captura de tela da interface do portal do Azure para a implantação específica mostrando os valores de parâmetro.