Ćwiczenie — dodawanie pliku parametrów i bezpiecznych parametrów
W tym ćwiczeniu utworzysz plik parametrów zawierający wartości utworzonego wcześniej pliku Bicep. W tym samym pliku parametrów dodasz również odwołania do usługi Azure Key Vault, aby bezpiecznie udostępniać poufne informacje.
Podczas tego procesu wykonasz następujące zadania:
- Dodaj kilka bezpiecznych parametrów.
- Utwórz plik parametrów.
- Przetestuj wdrożenie, aby upewnić się, że plik parametrów jest prawidłowy.
- Utwórz magazyn kluczy i wpisy tajne.
- Zaktualizuj plik parametrów, aby odwoływać się do tajemnic magazynu kluczy.
- Ponownie przetestuj wdrożenie, aby upewnić się, że plik parametrów jest nadal prawidłowy.
Usuwanie wartości domyślnej jednostki SKU planu usługi App Service
Aby szablon działał w różnych środowiskach, szczegóły jednostki SKU planu usługi Azure App Service zostaną podane w pliku parametrów, a nie w wartości domyślnej.
W pliku main.bicep w programie Visual Studio Code zaktualizuj appServicePlanSku parametr , aby usunąć jego wartość domyślną.
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
Dodawanie nowych parametrów
Teraz musisz dodać serwer SQL i bazę danych. Najpierw dodasz parametry identyfikatora logowania i hasła administratora oraz jednostkę SKU bazy danych. Później ustawisz ich wartości.
W pliku main.bicep w programie Visual Studio Code dodaj parametry sqlServerAdministratorLogin, sqlServerAdministratorPassword oraz sqlDatabaseSku poniżej bieżących deklaracji parametrów. Po zakończeniu deklaracje parametrów powinny wyglądać następująco:
@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
Zwróć uwagę, że nie określasz wartości domyślnych parametrów sqlServerAdministratorLogin i sqlServerAdministratorPassword . Dobrym rozwiązaniem jest dodanie wartości domyślnych dla bezpiecznych parametrów. Ponadto nie określasz wartości domyślnej dla elementu sqlDatabaseSku. Określisz wartość w pliku parametrów.
Dodawanie nowych zmiennych
W pliku main.bicep w programie Visual Studio Code dodaj zmienne sqlServerName i sqlDatabaseName pod istniejącymi zmiennymi. Po zakończeniu deklaracje zmiennych powinny wyglądać następująco:
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
Dodawanie zasobów serwera SQL i bazy danych
W pliku main.bicep w programie Visual Studio Code dodaj następujący kod w dolnej części pliku:
resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = { name: sqlServerName location: location properties: { administratorLogin: sqlServerAdministratorLogin administratorLoginPassword: sqlServerAdministratorPassword } } resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = { parent: sqlServer name: sqlDatabaseName location: location sku: { name: sqlDatabaseSku.name tier: sqlDatabaseSku.tier } }Zapisz zmiany w pliku.
Zweryfikuj plik Bicep
Po zakończeniu wszystkich powyższych zmian plik Bicep powinien wyglądać następująco:
@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@2024-04-01' = {
name: appServicePlanName
location: location
sku: {
name: appServicePlanSku.name
tier: appServicePlanSku.tier
capacity: appServicePlanInstanceCount
}
}
resource appServiceApp 'Microsoft.Web/sites@2024-04-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
resource sqlServer 'Microsoft.Sql/servers@2024-05-01-preview' = {
name: sqlServerName
location: location
properties: {
administratorLogin: sqlServerAdministratorLogin
administratorLoginPassword: sqlServerAdministratorPassword
}
}
resource sqlDatabase 'Microsoft.Sql/servers/databases@2024-05-01-preview' = {
parent: sqlServer
name: sqlDatabaseName
location: location
sku: {
name: sqlDatabaseSku.name
tier: sqlDatabaseSku.tier
}
}
Jeśli tak nie jest, skopiuj przykład lub dostosuj szablon tak, aby był zgodny z przykładem.
Tworzenie pliku parametrów
Otwórz program Visual Studio Code i otwórz folder, w którym znajduje się plik main.bicep . W tym samym folderze utwórz nowy plik o nazwie main.parameters.dev.json.
W pliku main.parameters.dev.json dodaj następujący kod:
{ "$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" } } } }Zapisz zmiany w pliku.
Wdrażanie szablonu Bicep przy użyciu pliku parametrów
Uruchom następujące polecenie Azure CLI w terminalu. Zwróć uwagę, że udostępniasz plik parametrów dla wdrożenia.
az deployment group create \
--name main \
--template-file main.bicep \
--parameters main.parameters.dev.json
Uruchom następujące polecenie programu Azure PowerShell w terminalu. Zwróć uwagę, że udostępniasz plik parametrów dla wdrożenia.
New-AzResourceGroupDeployment `
-Name main `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Podczas wykonywania wdrożenia zostanie wyświetlony monit o wprowadzenie wartości parametrów sqlServerAdministratorLogin i .sqlServerAdministratorPassword Nie musisz określać solutionName , ponieważ ma ona wartość domyślną określoną w szablonie. Nie musisz określać innych wartości parametrów, ponieważ ich wartości są określone w pliku parametrów.
Wskazówka
Po wprowadzeniu bezpiecznych parametrów wybrane wartości muszą być zgodne z kilkoma regułami:
-
sqlServerAdministratorLoginnie może być łatwą do odgadnięcia nazwą logowania, taką jakadminlubroot. Może zawierać tylko znaki alfanumeryczne i musi zaczynać się literą. -
sqlServerAdministratorPasswordmusi zawierać co najmniej osiem znaków i zawierać małe litery, wielkie litery, cyfry i symbole. Aby uzyskać więcej informacji na temat złożoności hasła, zobacz zasady haseł platformy Azure SQL.
Jeśli wartości parametrów nie spełniają wymagań, usługa Azure SQL nie wdroży serwera.
Upewnij się również, że zanotujesz wprowadzone dane logowania i hasło. Będą one używane w następnej sekcji.
Ukończenie wdrożenia może potrwać kilka minut.
Tworzenie magazynu kluczy i wpisów tajnych
Twoja firma z toy ma już magazyn kluczy z wpisami tajnymi, których potrzebuje do swoich wdrożeń. Aby zasymulować ten scenariusz, utworzysz nowy magazyn kluczy i dodasz niektóre wpisy tajne do użycia.
W terminalu wykonaj następujące polecenia, aby utworzyć magazyn kluczy i wpisy tajne. Zaktualizuj wartości zmiennych przed wykonaniem tych poleceń. Nazwy magazynów kluczy muszą być globalnie unikatowym ciągiem od 3 do 24 znaków, które mogą zawierać tylko wielkie i małe litery, łączniki (-) i cyfry. Na przykład demo-kv-1234567abcdefg.
Ostrzeżenie
Upewnij się, że używasz tego samego identyfikatora logowania i hasła użytego w poprzednim kroku. Jeśli tego nie zrobisz, następne wdrożenie nie zakończy się pomyślnie.
keyVaultName Zastąp YOUR-KEY-VAULT-NAME ciąg nazwą magazynu kluczy. Polecenia read dla login zmiennych i password spowodują wyświetlenie monitu o podanie wartości. Podczas wpisywania wartości nie są wyświetlane w terminalu i nie są zapisywane w historii poleceń.
Aby chronić wartości zmiennych w sesji terminalu powłoki Bash, należy pamiętać o następujących elementach:
- Wartości zmiennych nie są przechowywane jako bezpieczny ciąg i mogą być wyświetlane przez wprowadzenie polecenia, takiego jak
$yourVariableNamew wierszu polecenia lub zaechopomocą polecenia. W tym ćwiczeniu po utworzeniu wpisów tajnych magazynu można usunąć istniejącą wartość każdej zmiennej, uruchamiającreadpolecenia bez wprowadzania wartości. - Parametr
az keyvault secret setużywa parametru--valuedo utworzenia wartości wpisu tajnego. Dane wyjściowe polecenia wyświetla właściwość o nazwievalue, która zawiera wartość wpisu tajnego. Całe dane wyjściowe polecenia można pominąć za pomocą parametru--output none, jak pokazano w przykładzie.
Aby utworzyć keyVaultNamezmienne , logini password , uruchom każde polecenie oddzielnie. Następnie możesz uruchomić blok poleceń, aby utworzyć magazyn kluczy i wpisy tajne.
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
Uwaga / Notatka
Ustawiasz --enabled-for-template-deployment ustawienie w magazynie, aby platforma Azure mogła używać wpisów tajnych z magazynu podczas wdrożeń. Jeśli to ustawienie nie zostanie ustawione, domyślnie wdrożenia nie będą mogły uzyskiwać dostępu do wpisów tajnych w magazynie.
Ponadto każdy, kto wykonuje wdrożenie, musi mieć również uprawnienia dostępu do magazynu. Ponieważ utworzono magazyn kluczy, jesteś właścicielem, więc nie musisz jawnie udzielać uprawnień w tym ćwiczeniu. W przypadku własnych magazynów musisz udzielić dostępu do tajemnic.
keyVaultName Zastąp YOUR-KEY-VAULT-NAME ciąg nazwą magazynu kluczy. Polecenia Read-Host dla login zmiennych i password spowodują wyświetlenie monitu o podanie wartości. Podczas wpisywania wartości nie są wyświetlane w terminalu i nie są zapisywane w historii poleceń. Wartości są przechowywane jako bezpieczny ciąg.
Aby utworzyć keyVaultNamezmienne , logini password , uruchom każde polecenie oddzielnie. Następnie możesz uruchomić blok poleceń, aby utworzyć magazyn kluczy i wpisy tajne.
$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
Uwaga / Notatka
Ustawiasz -EnabledForTemplateDeployment ustawienie w magazynie, aby platforma Azure mogła używać wpisów tajnych z magazynu podczas wdrożeń. Jeśli to ustawienie nie zostanie ustawione, domyślnie wdrożenia nie będą mogły uzyskiwać dostępu do wpisów tajnych w magazynie.
Ponadto każdy, kto wykonuje wdrożenie, musi mieć również uprawnienia dostępu do magazynu. Ponieważ utworzono magazyn kluczy, jesteś właścicielem, więc nie musisz jawnie udzielać uprawnień w tym ćwiczeniu. W przypadku własnych magazynów musisz udzielić dostępu do tajemnic.
Uzyskiwanie identyfikatora zasobu magazynu kluczy
Aby używać wpisów tajnych magazynu kluczy we wdrożeniu, potrzebny jest identyfikator zasobu magazynu. Uruchom następujące polecenie, aby pobrać identyfikator zasobu magazynu kluczy:
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
Identyfikator zasobu będzie wyglądać mniej więcej tak:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
Skopiuj identyfikator zasobu. Będzie on używany w następnym kroku.
Dodaj odwołanie do magazynu kluczy do pliku parametrów
W pliku main.parameters.dev.json dodaj następujący kod po zamykającym nawiasie klamrowym parametru
sqlDatabaseSku. Upewnij się, że zastąpiszYOUR-KEY-VAULT-RESOURCE-IDwartość identyfikatora zasobu magazynu kluczy skopiowaną w poprzednim kroku. Po zakończeniu plik parametrów powinien wyglądać następująco:{ "$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" } } } }Zapisz zmiany w pliku.
Wdrażanie szablonu Bicep z plikami parametrów i odwołaniami do usługi Azure Key Vault
Uruchom następujące polecenie Azure CLI w terminalu. Udostępniasz plik parametrów wraz z plikiem Bicep.
az deployment group create \
--name main \
--template-file main.bicep \
--parameters main.parameters.dev.json
Uruchom następujące polecenie programu Azure PowerShell w terminalu. Udostępniasz plik parametrów wraz z plikiem Bicep.
New-AzResourceGroupDeployment `
-Name main `
-TemplateFile main.bicep `
-TemplateParameterFile main.parameters.dev.json
Nie zostanie wyświetlony monit o wprowadzenie wartości parametrów sqlServerAdministratorLogin i podczas sqlServerAdministratorPassword wykonywania wdrożenia tym razem. Platforma Azure pobiera zamiast tego wartości z magazynu kluczy.
Wdrożenie zostanie ukończone szybciej tym razem, ponieważ zasoby platformy Azure już istnieją.
Sprawdź swoje wdrożenie
W przeglądarce wróć do witryny Azure Portal. Przejdź do grupy zasobów. Nadal zobaczysz jedno pomyślne wdrożenie, ponieważ wdrożenie używało tej samej nazwy co pierwsze wdrożenie.
Wybierz link 1 Zakończono z sukcesem.
Wybierz wdrożenie o nazwie main.
W menu po lewej stronie wybierz pozycję Dane wejściowe.
Zwróć uwagę, że wartości parametrów
appServicePlanSkuisqlDatabaseSkuzostały ustawione na wartości w pliku parametrów. Zwróć również uwagę, że wartości parametrówsqlServerAdministratorLoginisqlServerAdministratorPasswordnie są wyświetlane, ponieważ do nich zastosowano@secure()dekorator.