演習 - パラメーター ファイルとセキュリティで保護されたパラメーターを追加する
この演習では、前に作成した Bicep ファイルの値を提供するパラメーター ファイルを作成します。 同じパラメーター ファイルに Azure Key Vault 参照を追加して、機密情報を安全に提供します。
プロセスの間に、次のタスクを実行します。
- セキュリティで保護されたパラメーターを追加します。
 - パラメーター ファイルを作成します。
 - デプロイをテストして、パラメーター ファイルが有効であることを確認します。
 - キー コンテナーとシークレットを作成します。
 - キー ボールトのシークレットを参照するようにパラメーター ファイルを更新します。
 - デプロイを再テストして、パラメーター ファイルがまだ有効であることを確認します。
 
App Service プラン SKU の既定値を削除する
環境間でテンプレートを機能させるために、Azure App Service プランの SKU の詳細は、既定値ではなくパラメーター ファイルで提供されます。
Visual Studio Code の main.bicep ファイルで、 appServicePlanSku パラメーターを更新して既定値を削除します。
@description('The name and tier of the App Service plan SKU.')
param appServicePlanSku object
新しいパラメーターを追加する
ここで、SQL サーバーとデータベースを追加する必要があります。 まず、管理者ログインとパスワード、データベース SKU のパラメーターを追加します。 それらの値は後で設定します。
Visual Studio Code の main.bicep ファイルで、現在のパラメーター宣言の下に 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 には既定値を指定していません。 パラメーター ファイルで値を指定します。
新しい変数を追加する
Visual Studio Code の main.bicep ファイルで、既存の変数の下に sqlServerName 変数と sqlDatabaseName 変数を追加します。 完了すると、変数宣言は次の例のようになります。
var appServicePlanName = '${environmentName}-${solutionName}-plan'
var appServiceAppName = '${environmentName}-${solutionName}-app'
var sqlServerName = '${environmentName}-${solutionName}-sql'
var sqlDatabaseName = 'Employees'
SQL サーバーとデータベース リソースを追加する
Visual Studio Code の main.bicep ファイルで、ファイルの下部に次のコードを追加します。
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 } }変更をファイルに保存します。
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@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
  }
}
そうでない場合は、例をコピーするか、例に合わせてテンプレートを調整します。
パラメーター ファイルを作成する
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 \
  --name main \
  --template-file main.bicep \
  --parameters main.parameters.dev.json
ターミナルで、次の Azure PowerShell コマンドを実行します。 デプロイ用のパラメーター ファイルを指定していることに注意してください。
New-AzResourceGroupDeployment `
  -Name main `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json
デプロイを実行するときに、sqlServerAdministratorLogin と sqlServerAdministratorPassword の各パラメーターの値を入力するように求めるメッセージが表示されます。 solutionName はテンプレートで既定値が指定されているので、指定する必要はありません。 他のパラメーター値はパラメーター ファイルで指定されているため、他のパラメーター値を指定する必要はありません。
ヒント
セキュリティで保護されたパラメーターを入力する場合、選択する値はいくつかの規則に従う必要があります。
sqlServerAdministratorLoginは、adminやrootのような簡単に推測できるログイン名にしてはなりません。 英数字のみを使用でき、文字で始める必要があります。sqlServerAdministratorPasswordは、8 文字以上で、小文字、大文字、数字、記号を含める必要があります。 パスワードの複雑さの詳細については、 SQL Azure パスワード ポリシーを参照してください。
パラメーターの値が要件を満たさない場合、Azure SQL でサーバーはデプロイされません。
また、 入力したログインとパスワードもメモしておいてください。 これらは、次のセクションで使います。
デプロイが完了するまでに数分かかることがあります。
キー コンテナーとシークレットを作成する
おもちゃ会社には、デプロイに必要なシークレットを含むキー コンテナーが既に存在しています。 このシナリオをシミュレートするには、新しいキー コンテナーを作成し、使用するシークレットを追加します。
ターミナルで次のコマンドを実行して、キー コンテナーとシークレットを作成します。 これらのコマンドを実行する前に、変数の値を更新してください。 キー コンテナー名は、3 から 24 文字のグローバルに一意の文字列でなければならず、大文字と小文字、ハイフン (-)、数字のみを使用できます。 たとえば、 demo-kv-1234567abcdefg です。
注意事項
前の手順で使用したのと同じログインとパスワードを使用していることを確認します。 そうしないと、次のデプロイは正常に完了しません。
keyVaultName では、YOUR-KEY-VAULT-NAME をキー コンテナーの名前に置き換えます。 変数 read と login に対する password コマンドでは、値の入力を求められます。 入力しても、値はターミナルに表示されず、コマンド履歴に保存されません。
Bash ターミナル セッションの変数値を保護するには、次の点に注意してください。
- 変数値は安全な文字列として格納されず、コマンド ラインに 
$yourVariableNameのようなコマンドを入力するか、echoコマンドを使用することで表示できます。 この演習では、コンテナー シークレットの作成後、値を入力せず、readコマンドを実行することで各変数の既存値を削除できます。 az keyvault secret setでは、シークレットの値の作成に--valueパラメーターが使用されます。 コマンドの出力は、シークレットの値が含まれる、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 から資格情報コンテナーのシークレットを使用できるようにします。 この設定を行わなかった場合、既定では、デプロイで資格情報コンテナーのシークレットにアクセスできません。
また、デプロイを実行するユーザーは、コンテナーにアクセスするためのアクセス許可を持っている必要があります。 キー コンテナーを作成して所有者であるため、この演習でアクセス許可を明示的に付与する必要はありません。 独自のコンテナーの場合は、シークレットへのアクセスを許可する必要があります。
キー コンテナーのリソース ID を取得する
デプロイでキー コンテナーのシークレットを使用するには、コンテナーのリソース ID が必要です。 次のコマンドを実行して、キー コンテナーのリソース ID を取得します。
az keyvault show --name $keyVaultName --query id --output tsv
(Get-AzKeyVault -Name $keyVaultName).ResourceId
リソース ID は次の例のようになります。
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets
リソース ID をコピーします。 次のステップでそれを使います。
パラメーター ファイルにキー コンテナー参照を追加する
main.parameters.dev.json ファイルで、
sqlDatabaseSkuパラメーターの閉じ中かっこの後に次のコードを追加します。YOUR-KEY-VAULT-RESOURCE-IDは、前の手順でコピーしたキー コンテナー リソース 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" } } } }変更をファイルに保存します。
パラメーター ファイルと Azure Key Vault 参照を使用して Bicep テンプレートをデプロイする
ターミナルで、次の Azure CLI コマンドを実行します。 Bicep ファイルと共にパラメーター ファイルを提供しています。
az deployment group create \
  --name main \
  --template-file main.bicep \
  --parameters main.parameters.dev.json
ターミナルで、次の Azure PowerShell コマンドを実行します。 Bicep ファイルと共にパラメーター ファイルを提供しています。
New-AzResourceGroupDeployment `
  -Name main `
  -TemplateFile main.bicep `
  -TemplateParameterFile main.parameters.dev.json
この時点でデプロイを実行するときに、sqlServerAdministratorLogin と sqlServerAdministratorPassword の各パラメーターの値を入力するように求められることはありません。 代わりに、Azure によってキー コンテナーから値が取得されます。
Azure リソースが既に存在するため、デプロイは短時間で完了します。
デプロイをチェックする
ブラウザーで、Azure portal に移動します。 ご利用のリソース グループにアクセスします。 このデプロイでは最初のデプロイと同じ名前が使用されたので、成功したデプロイの数として表示されるのは 1 件のままです。
[1 成功] リンクを選択します。
main という名前のデプロイを選択 します。
左側のメニューで、[入力] を選択 します。
appServicePlanSkuとsqlDatabaseSkuの両方のパラメーター値がパラメーター ファイル内の値に設定されていることに注意してください。 また、sqlServerAdministratorLoginデコレーターを適用したため、sqlServerAdministratorPasswordと@secure()の各パラメーターの値が表示されないことにも注意してください。