Упражнение. Добавление файла параметров и безопасных параметров

Завершено

В этом упражнении вы создадите файл параметров, предоставляющий значения для созданного ранее файла Bicep. В том же файле параметров вы также будете добавлять ссылки Azure Key Vault для безопасного предоставления конфиденциальных сведений.

Во время процесса вы выполните следующие задачи:

  • Добавьте некоторые безопасные параметры.
  • Создайте файл параметров.
  • Протестируйте развертывание, чтобы убедиться, что файл параметров действителен.
  • Создание хранилища ключей и секретов.
  • Измените файл параметров так, чтобы он ссылался на секреты хранилища ключей.
  • Протестируйте развертывание снова, чтобы убедиться, что файл параметров все еще действителен.

Удаление значения по умолчанию для SKU плана службы приложений

Чтобы сделать шаблон работой в разных средах, сведения о SKU плана обслуживания приложение Azure будут предоставлены в файле параметров, а не по значению по умолчанию.

В файле main.bicep в Visual Studio Code измените параметр appServicePlanSku, чтобы удалить его значение по умолчанию.

@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object

Добавление новых параметров

Следующим шагом будет добавление SQL Server и базы данных. Сначала необходимо добавить параметры для имени для входа и пароля администратора, а также номер SKU базы данных. Вы задали их значения позже.

В файле main.bicep в Visual Studio Code добавьте параметры sqlServerAdministratorLogin, sqlServerAdministratorPassword и sqlDatabaseSku под текущими объявлениями параметров. После выполнения необходимых действий ваши объявления параметров должны выглядеть, как в следующем примере:

@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

Обратите внимание, для параметров sqlServerAdministratorLogin и sqlServerAdministratorPassword указывать значения по умолчанию не нужно. Добавлять значения по умолчанию для безопасных параметров — недопустимая практика с точки зрения безопасности. Кроме того, не указывайте значение по умолчанию для параметра sqlDatabaseSku. В файле параметров укажите значение.

Добавление новых переменных

В файле main.bicep в Visual Studio Code добавьте переменные sqlServerName и sqlDatabaseName под существующими переменными. После выполнения необходимых действий ваши объявления переменных должны выглядеть, как в следующем примере:

var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'

Добавление ресурсов SQL Server и базы данных

  1. В файле main.bicep в Visual Studio Code добавьте следующий код в конец файла:

    resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {
      name: sqlServerName
      location: location
      properties: {
        administratorLogin: sqlServerAdministratorLogin
        administratorLoginPassword: sqlServerAdministratorPassword
      }
    }
    
    resource sqlDatabase 'Microsoft.Sql/servers/databases@2022-05-01-preview' = {
      parent: sqlServer
      name: sqlDatabaseName
      location: location
      sku: {
        name: sqlDatabaseSku.name
        tier: sqlDatabaseSku.tier
      }
    }
    
  2. Сохраните изменения в файле.

Проверка файла Bicep

После выполнения всех описанных выше изменений файл Bicep должен выглядеть, как в следующем примере:

@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@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSku.name
    tier: appServicePlanSku.tier
    capacity: appServicePlanInstanceCount
  }
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceAppName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
  }
}

resource sqlServer 'Microsoft.Sql/servers@2022-05-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2022-05-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: {
    name: sqlDatabaseSku.name
    tier: sqlDatabaseSku.tier
  }
}

Если это не так, скопируйте пример или настройте шаблон в соответствии с примером.

Создание файла параметров

  1. Откройте Visual Studio Code, а затем папку, в которой расположен файл main.bicep. В той же папке создайте новый файл с именем main.parameters.dev.json.

  2. Добавьте в файл main.parameters.dev.json следующий код:

    {
      "$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. Сохраните изменения в файле.

Развертывание шаблона Bicep с помощью файла параметров

В терминале выполните следующую команду Azure CLI. Обратите внимание, что вы предоставляете файл параметров для развертывания.

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.dev.json

В терминале выполните следующую команду Azure PowerShell. Обратите внимание, что вы предоставляете файл параметров для развертывания.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json

При выполнении развертывания вам будет предложено ввести значения для параметров sqlServerAdministratorLogin и sqlServerAdministratorPassword. Задавать свойство solutionName не нужно, поскольку в шаблоне указано значение по умолчанию. Вам также не нужно задавать другие значения параметров, поскольку они указаны в файле параметров.

Совет

При вводе параметров безопасности нужные значения должны соответствовать определенным правилам:

  • Значение имени для входа sqlServerAdministratorLogin не должно быть легко подбираемым, например admin или root. Оно должно содержать только буквенно-цифровые символы и начинаться с буквы.
  • Длина значения sqlServerAdministratorPassword должна составлять не менее восьми символов. В этом значении должны быть буквы нижнего регистра, верхнего регистра, цифры и символы. Дополнительные сведения о сложности пароля см. в статье Политика паролей документации по Azure SQL.

Если значения параметров не соответствуют требованиям, Azure SQL не будет развертывать сервер.

Кроме того, не забудьте записать введенные имя для входа и пароль. Они будут использоваться в следующем разделе.

Развертывание может занять несколько минут.

Создание хранилища ключей и секретов

В компании по производству игрушек уже есть хранилище ключей с секретами, необходимыми для развертываний. Чтобы смоделировать этот сценарий, вы создадите хранилище ключей и добавите несколько секретов для дальнейшего использования.

В окне терминала выполните следующие команды, чтобы создать хранилище ключей и секреты. Перед выполнением этих команд измените значения переменных. Имена хранилища ключей должны быть глобально уникальной строкой от 3 до 24 символов, которые могут содержать только строчные и строчные буквы, дефисы (-) и цифры. Например, demo-kv-1234567abcdefg.

Внимание

Убедитесь, что вы используете те же имя входа и пароль, которые использовались на предыдущем шаге. В противном случае следующее развертывание не будет выполнено.

keyVaultName Для замены YOUR-KEY-VAULT-NAME именем хранилища ключей. Команды read для loginpassword переменных будут запрашивать значения. При вводе значения не отображаются в терминале и не сохраняются в журнале команд.

Чтобы защитить значения переменной в сеансе терминала Bash, помните о следующих элементах:

  • Значения переменных не хранятся в виде безопасной строки и могут отображаться путем ввода команды, например $yourVariableName в командной строке или с echo помощью команды. В этом упражнении после создания секретов хранилища можно удалить существующее значение каждой переменной, выполнив read команды без ввода значения.
  • --value Использует az keyvault secret set параметр для создания значения секрета. Выходные данные команды отображают свойство с именем value , содержащее значение секрета. Вы можете отключить все выходные данные команды с помощью параметра --output none , как показано в примере.

Чтобы создать keyVaultNameloginпеременные и password переменные, выполните каждую команду отдельно. Затем можно запустить блок команд, чтобы создать хранилище ключей и секреты.

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

Примечание.

Вы устанавливаете параметр --enabled-for-template-deployment для хранилища, чтобы во время развертываний в Azure использовались секреты из вашего хранилища. Если этот параметр не задан, по умолчанию развертывания не смогут получить доступ к секретам в хранилище.

Кроме того, у пользователя, выполняющего развертывание, также должно быть разрешение на доступ к хранилищу. Так как хранилище ключей создали вы, вы являетесь его владельцем, и вам не нужно явно предоставлять разрешение в этом упражнении. Для собственных хранилищ вам нужно предоставить доступ к секретам.

keyVaultName Для замены YOUR-KEY-VAULT-NAME именем хранилища ключей. Команды Read-Host для loginpassword переменных будут запрашивать значения. При вводе значения не отображаются в терминале и не сохраняются в журнале команд. Значения хранятся в виде безопасной строки.

Чтобы создать keyVaultNameloginпеременные и password переменные, выполните каждую команду отдельно. Затем можно запустить блок команд, чтобы создать хранилище ключей и секреты.

$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

Примечание.

Вы устанавливаете параметр -EnabledForTemplateDeployment для хранилища, чтобы во время развертываний в Azure использовались секреты из вашего хранилища. Если этот параметр не задан, по умолчанию развертывания не смогут получить доступ к секретам в хранилище.

Кроме того, у пользователя, выполняющего развертывание, также должно быть разрешение на доступ к хранилищу. Так как хранилище ключей создали вы, вы являетесь его владельцем, и вам не нужно явно предоставлять разрешение в этом упражнении. Для собственных хранилищ вам нужно предоставить доступ к секретам.

Получение идентификатора ресурса для хранилища ключей

Чтобы в развертывании использовались секреты из хранилища ключей, требуется идентификатор ресурса хранилища. Выполните следующую команду, чтобы получить идентификатор ресурса для хранилища ключей:

az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId

Идентификатор ресурса будет выглядеть примерно так:

/subscriptions/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets

Скопируйте идентификатор ресурса. Он понадобится вам дальше.

Добавление ссылки на хранилище ключей в файл параметров

  1. Добавьте в файл main.parameters.dev.js следующий код после закрывающей скобки параметра sqlDatabaseSku. Обязательно замените YOUR-KEY-VAULT-RESOURCE-ID значением идентификатора ресурса хранилища ключей, который вы скопировали на предыдущем шаге. В итоге файл параметров должен выглядеть примерно так:

    {
      "$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. Сохраните изменения в файле.

Развертывание шаблона Bicep с использованием файла параметров и ссылок Azure Key Vault

В терминале выполните следующую команду Azure CLI. Файл параметров предоставляется вместе с файлом Bicep.

az deployment group create \
  --template-file main.bicep \
  --parameters main.parameters.dev.json

В терминале выполните следующую команду Azure PowerShell. Файл параметров предоставляется вместе с файлом Bicep.

New-AzResourceGroupDeployment `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json

В этот раз при выполнении развертывания вам не будет предложено ввести значения для параметров sqlServerAdministratorLogin и sqlServerAdministratorPassword. Эти значения Azure получит из вашего хранилища ключей.

Развертывания завершится быстрее, так как ресурсы Azure уже существуют.

Проверка развертывания

  1. В своем браузере вернитесь на портал Azure. Перейдите к группе ресурсов. Вы увидите одно успешное развертывание, как и прежде, так как для этого развертывания использовалось то же имя, что и для первого.

  2. Выберите ссылку 1 Выполнено.

  3. Выберите развертывание с именем main.

  4. В меню слева выберите Входные данные.

  5. Обратите внимание, что параметрам appServicePlanSku и sqlDatabaseSku заданы значения из файла параметров. Также обратите внимание, что значения параметров sqlServerAdministratorLogin и sqlServerAdministratorPassword не отображаются, так как вы применили к ним декоратор @secure().

    Screenshot of the Azure portal interface for the specific deployment showing the parameter values.