Latihan - Menambahkan file parameter dan parameter aman

Selesai

Dalam latihan ini, Anda akan membuat file parameter yang menyediakan nilai untuk file Bicep yang sebelumnya Anda buat. Dalam file parameter yang sama, Anda juga akan menambahkan referensi Azure Key Vault untuk memberikan informasi sensitif dengan aman.

Selama proses, Anda akan melakukan tugas-tugas berikut:

  • Tambahkan beberapa parameter aman.
  • Buat file parameter.
  • Uji penyebaran untuk memastikan file parameter valid.
  • Buat key vault dan rahasia.
  • Perbarui file parameter untuk merujuk ke rahasia key vault.
  • Uji ulang penyebaran untuk memastikan file parameter masih valid.

Menghapus nilai default untuk SKU paket App Service

Untuk membuat templat Anda berfungsi di seluruh lingkungan, detail SKU paket Azure App Service akan disediakan dalam file parameter daripada dengan nilai default.

Dalam file main.bicep di Visual Studio Code, perbarui parameter appServicePlanSku untuk menghapus nilai defaultnya.

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

Menambahkan parameter baru

Sekarang Anda harus menambahkan server dan database SQL. Pertama, Anda akan menambahkan parameter untuk login dan kata sandi administrator, serta SKU database. Anda akan mengatur nilainya nanti.

Dalam file main.bicep di Visual Studio Code, tambahkan parameter sqlServerAdministratorLogin, sqlServerAdministratorPassword, dan sqlDatabaseSku di bawah deklarasi parameter saat ini. Setelah selesai, deklarasi parameter Anda akan terlihat seperti contoh ini:

@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

Perhatikan bahwa Anda tidak menentukan nilai default untuk parameter sqlServerAdministratorLogin dan sqlServerAdministratorPassword. Ini adalah praktik keamanan yang buruk untuk menambahkan nilai default untuk parameter aman. Selain itu, Anda tidak menentukan nilai default untuk sqlDatabaseSku. Anda akan menentukan nilai dalam file parameter.

Menambahkan variabel baru

Dalam file main.bicep di Visual Studio Code, tambahkan variabel sqlServerName dan sqlDatabaseName di bawah variabel yang ada. Setelah selesai, deklarasi variabel Anda akan terlihat seperti contoh ini:

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

Menambahkan sumber daya server dan database SQL

  1. Dalam file main.bicep di Visual Studio Code, tambahkan kode berikut ke bagian bawah file:

    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. Simpan perubahan pada file.

Memverifikasi file Bicep Anda

Setelah Anda menyelesaikan semua perubahan sebelumnya, file Bicep Anda akan terlihat seperti contoh ini:

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

Jika tidak, salin contoh atau sesuaikan templat Anda agar sesuai dengan contoh.

Membuat file parameter

  1. Buka Visual Studio Code, dan buka folder lokasi file main.bicep. Di folder yang sama, buat file baru yang disebut main.parameters.dev.json.

  2. Di file main.parameters.dev.json, tambahkan kode berikut:

    {
      "$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. Simpan perubahan pada file.

Menyebarkan templat Bicep dengan file parameter

Jalankan perintah Azure CLI berikut di terminal. Perhatikan bahwa Anda menyediakan file parameter untuk penyebaran.

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

Jalankan perintah Azure PowerShell berikut di terminal. Perhatikan bahwa Anda menyediakan file parameter untuk penyebaran.

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

Anda diminta untuk memasukkan nilai untuk parameter sqlServerAdministratorLogin dan sqlServerAdministratorPassword saat menjalankan penyebaran. Anda tidak harus menentukan solutionName karena memiliki nilai default yang ditentukan dalam templat. Anda tidak harus menentukan nilai parameter lainnya karena nilainya ditentukan dalam file parameter.

Tip

Saat Anda memasukkan parameter aman, nilai yang Anda pilih harus mengikuti beberapa aturan:

  • sqlServerAdministratorLogin tidak boleh menjadi nama login yang mudah ditebak seperti admin atau root. Nama untuk masuk hanya dapat berisi karakter alfanumerik dan harus dimulai dengan huruf.
  • Panjang sqlServerAdministratorPassword mimal harus delapan karakter dan menyertakan huruf kecil, huruf besar, angka, dan simbol. Untuk informasi selengkapnya tentang kompleksitas kata sandi, lihat kebijakan kata sandi SQL Azure.

Jika nilai parameter tidak memenuhi persyaratan, Azure SQL tidak akan menyebarkan server Anda.

Selain itu, pastikan Anda menyimpan catatan login dan kata sandi yang Anda masukkan. Anda akan menggunakannya di bagian berikutnya.

Penyebaran mungkin perlu waktu beberapa menit untuk diselesaikan.

Membuat key vault dan rahasia

Perusahaan mainan Anda sudah memiliki key vault dengan rahasia yang dibutuhkan untuk penyebarannya. Untuk menyimulasikan skenario ini, Anda akan membuat key vault baru dan menambahkan beberapa rahasia yang akan digunakan.

Di terminal, jalankan perintah berikut untuk membuat key vault dan rahasia. Perbarui nilai variabel sebelum Anda menjalankan perintah ini. Nama brankas kunci harus berupa string unik global 3 hingga 24 karakter yang hanya dapat berisi huruf besar dan kecil, tanda hubung (-), dan angka. Misalnya, demo-kv-1234567abcdefg.

Perhatian

Pastikan Anda menggunakan login dan kata sandi yang sama dengan yang Anda gunakan di langkah sebelumnya. Jika tidak, penyebaran berikutnya tidak akan berhasil diselesaikan.

keyVaultName Untuk ganti YOUR-KEY-VAULT-NAME dengan nama untuk brankas kunci Anda. Perintah read untuk login variabel dan password akan meminta nilai kepada Anda. Saat Anda mengetik, nilai tidak ditampilkan di terminal dan tidak disimpan dalam riwayat perintah Anda.

Untuk melindungi nilai variabel dalam sesi terminal Bash Anda, ketahui item berikut:

  • Nilai variabel tidak disimpan sebagai string aman dan dapat ditampilkan dengan memasukkan perintah seperti $yourVariableName pada baris perintah atau dengan echo perintah . Dalam latihan ini, setelah rahasia vault Dibuat, Anda dapat menghapus nilai setiap variabel yang ada dengan menjalankan read perintah tanpa memasukkan nilai.
  • az keyvault secret set menggunakan --value parameter untuk membuat nilai rahasia. Output perintah menampilkan properti bernama value yang berisi nilai rahasia. Anda dapat menekan seluruh output perintah dengan parameter --output none seperti yang ditunjukkan dalam contoh.

Untuk membuat keyVaultNamevariabel , login, dan password , jalankan setiap perintah secara terpisah. Kemudian Anda dapat menjalankan blok perintah untuk membuat brankas kunci dan rahasia.

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

Catatan

Anda menetapkan pengaturan --enabled-for-template-deployment pada vault sehingga Azure dapat menggunakan rahasia dari vault Anda selama penyebaran. Jika Anda tidak menetapkan pengaturan ini, secara default, penyebaran Anda tidak dapat mengakses rahasia di vault Anda.

Selain itu, siapa pun yang menjalankan penyebaran juga harus memiliki izin untuk mengakses vault. Karena Anda membuat key vault, Anda adalah pemiliknya, jadi, Anda tidak perlu secara eksplisit memberikan izin dalam latihan ini. Untuk vault Anda sendiri, Anda perlu memberikan akses ke rahasia.

keyVaultName Untuk ganti YOUR-KEY-VAULT-NAME dengan nama untuk brankas kunci Anda. Perintah Read-Host untuk login variabel dan password akan meminta nilai kepada Anda. Saat Anda mengetik, nilai tidak ditampilkan di terminal dan tidak disimpan dalam riwayat perintah Anda. Nilai disimpan sebagai string aman.

Untuk membuat keyVaultNamevariabel , login, dan password , jalankan setiap perintah secara terpisah. Kemudian Anda dapat menjalankan blok perintah untuk membuat brankas kunci dan rahasia.

$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

Catatan

Anda menetapkan pengaturan -EnabledForTemplateDeployment pada vault sehingga Azure dapat menggunakan rahasia dari vault Anda selama penyebaran. Jika Anda tidak menetapkan pengaturan ini, secara default, penyebaran Anda tidak dapat mengakses rahasia di vault Anda.

Selain itu, siapa pun yang menjalankan penyebaran juga harus memiliki izin untuk mengakses vault. Karena Anda membuat key vault, Anda adalah pemiliknya, jadi, Anda tidak perlu secara eksplisit memberikan izin dalam latihan ini. Untuk vault Anda sendiri, Anda perlu memberikan akses ke rahasia.

Mendapatkan ID sumber daya key vault

Untuk menggunakan rahasia key vault dalam penyebaran Anda, Anda memerlukan ID sumber daya vault. Jalankan perintah berikut untuk mengambil ID sumber daya key vault:

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

ID sumber daya akan terlihat seperti contoh ini:

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

Salin ID sumber daya. Anda akan menggunakannya di langkah berikutnya.

Menambahkan referensi key vault ke file parameter

  1. Di file main.parameters.dev.json, tambahkan kode berikut setelah kurung kurawal penutup parametersqlDatabaseSku. Pastikan Anda mengganti YOUR-KEY-VAULT-RESOURCE-ID dengan nilai ID sumber daya key vault yang Anda salin di langkah sebelumnya. Setelah selesai, file parameter Anda akan terlihat seperti contoh ini:

    {
      "$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. Simpan perubahan pada file.

Menyebarkan templat Bicep dengan file parameter dan referensi Azure Key Vault

Jalankan perintah Azure CLI berikut di terminal. Anda menyediakan file parameter bersama dengan file Bicep.

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

Jalankan perintah Azure PowerShell berikut di terminal. Anda menyediakan file parameter bersama dengan file Bicep.

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

Anda tidak diminta untuk memasukkan nilai untuk parameter sqlServerAdministratorLogin dan sqlServerAdministratorPassword saat menjalankan penyebaran kali ini. Azure mengambil nilai dari key vault Anda sebagai gantinya.

Penyebaran selesai lebih cepat kali ini karena sumber daya Azure sudah ada.

Memeriksa penyebaran Anda

  1. Di browser Anda, kembali ke portal Microsoft Azure. Buka grup sumber daya. Anda tetap bisa melihat satu penyebaran yang berhasil karena penyebaran menggunakan nama yang sama dengan penyebaran pertama.

  2. Pilih tautan 1 Berhasil.

  3. Pilih penyebaran yang disebut main.

  4. Di menu sebelah kiri, pilih Input.

  5. Perhatikan bahwa appServicePlanSku dan nilai paramater sqlDatabaseSku sudah menetapkan nilai di file parameter. Selain itu, perhatikan bahwa sqlServerAdministratorLogin dan nilai parameter sqlServerAdministratorPassword tidak ditampilkan, karena Anda menerapkan dekorator @secure() ke keduanya.

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