Ćwiczenie — dodawanie pliku parametrów i bezpiecznych parametrów

Ukończone

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 wpisów tajnych 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 środowiskach, szczegóły jednostki SKU planu usługi aplikacja systemu Azure zostaną podane w pliku parametrów, a nie wartością domyślną.

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 sqlServerAdministratorLoginparametry , sqlServerAdministratorPasswordi 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 sqlServerName zmienne i sqlDatabaseName poniżej istniejących zmiennych. 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

  1. W pliku main.bicep w programie Visual Studio Code dodaj następujący kod w dolnej części pliku:

    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. Zapisz zmiany w pliku.

Weryfikowanie pliku 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@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
  }
}

Jeśli tak nie jest, skopiuj przykład lub dostosuj szablon tak, aby był zgodny z przykładem.

Tworzenie pliku parametrów

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

  2. 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"
          }
        }
      }
    }
    
  3. Zapisz zmiany w pliku.

Wdrażanie szablonu Bicep przy użyciu pliku parametrów

Uruchom następujące polecenie interfejsu wiersza polecenia platformy Azure w terminalu. Zwróć uwagę, że udostępniasz plik parametrów dla wdrożenia.

az deployment group create \
  --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 `
  -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.

Napiwek

Po wprowadzeniu bezpiecznych parametrów wybrane wartości muszą być zgodne z kilkoma regułami:

  • sqlServerAdministratorLogin nie może być łatwą do odgadnięcia nazwą logowania, taką jak admin lub root. Może zawierać tylko znaki alfanumeryczne i musi zaczynać się literą.
  • sqlServerAdministratorPassword musi 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 Usługi SQL Azure haseł.

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.

Uwaga

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 $yourVariableName w wierszu polecenia lub za echo pomocą polecenia. W tym ćwiczeniu po utworzeniu wpisów tajnych magazynu można usunąć istniejącą wartość każdej zmiennej, uruchamiając read polecenia bez wprowadzania wartości.
  • Parametr az keyvault secret set używa parametru --value do utworzenia wartości wpisu tajnego. Dane wyjściowe polecenia wyświetla właściwość o nazwie value , 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

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 wpisów tajnych.

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

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 wpisów tajnych.

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.

Dodawanie odwołania do magazynu kluczy do pliku parametrów

  1. W pliku main.parameters.dev.json dołącz następujący kod po zamykającym nawiasie sqlDatabaseSku klamrowym parametru. Upewnij się, że zastąpisz YOUR-KEY-VAULT-RESOURCE-ID wartość 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"
          }
        }
      }
    }
    
  2. 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 interfejsu wiersza polecenia platformy Azure w terminalu. Udostępniasz plik parametrów wraz z plikiem Bicep.

az deployment group create \
  --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 `
  -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ą.

Sprawdzanie wdrożenia

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

  2. Wybierz link 1 Powodzenie.

  3. Wybierz wdrożenie o nazwie main.

  4. W menu po lewej stronie wybierz pozycję Dane wejściowe.

  5. Zwróć uwagę, że wartości parametrów appServicePlanSku i sqlDatabaseSku zostały ustawione na wartości w pliku parametrów. Zwróć również uwagę, że wartości parametrów sqlServerAdministratorLogin i sqlServerAdministratorPassword nie są wyświetlane, ponieważ do nich zastosowano @secure() dekorator.

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