Упражнение. Добавление файла параметров и безопасных параметров
В этом упражнении вы создадите файл параметров, предоставляющий значения для созданного ранее файла 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 и базы данных
В файле main.bicep в Visual Studio Code добавьте следующий код в конец файла:
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 } }
Сохраните изменения в файле.
Проверка файла 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@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
}
}
Если это не так, скопируйте пример или настройте шаблон в соответствии с примером.
Создание файла параметров
Откройте Visual Studio Code, а затем папку, в которой расположен файл main.bicep. В той же папке создайте новый файл с именем main.parameters.dev.json.
Добавьте в файл 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" } } } }
Сохраните изменения в файле.
Развертывание шаблона 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
для login
password
переменных будут запрашивать значения. При вводе значения не отображаются в терминале и не сохраняются в журнале команд.
Чтобы защитить значения переменной в сеансе терминала Bash, помните о следующих элементах:
- Значения переменных не хранятся в виде безопасной строки и могут отображаться путем ввода команды, например
$yourVariableName
в командной строке или сecho
помощью команды. В этом упражнении после создания секретов хранилища можно удалить существующее значение каждой переменной, выполнивread
команды без ввода значения. --value
Используетaz keyvault secret set
параметр для создания значения секрета. Выходные данные команды отображают свойство с именемvalue
, содержащее значение секрета. Вы можете отключить все выходные данные команды с помощью параметра--output none
, как показано в примере.
Чтобы создать keyVaultName
login
переменные и 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
для login
password
переменных будут запрашивать значения. При вводе значения не отображаются в терминале и не сохраняются в журнале команд. Значения хранятся в виде безопасной строки.
Чтобы создать keyVaultName
login
переменные и 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/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
Скопируйте идентификатор ресурса. Он понадобится вам дальше.
Добавление ссылки на хранилище ключей в файл параметров
Добавьте в файл 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" } } } }
Сохраните изменения в файле.
Развертывание шаблона 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 уже существуют.
Проверка развертывания
В своем браузере вернитесь на портал Azure. Перейдите к группе ресурсов. Вы увидите одно успешное развертывание, как и прежде, так как для этого развертывания использовалось то же имя, что и для первого.
Выберите ссылку 1 Выполнено.
Выберите развертывание с именем main.
В меню слева выберите Входные данные.
Обратите внимание, что параметрам
appServicePlanSku
иsqlDatabaseSku
заданы значения из файла параметров. Также обратите внимание, что значения параметровsqlServerAdministratorLogin
иsqlServerAdministratorPassword
не отображаются, так как вы применили к ним декоратор@secure()
.