演習 - パラメーター ファイルとセキュリティで保護されたパラメーターを追加する
この演習では、以前に作成した 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@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
は、8 文字以上で、小文字、大文字、数字、記号を含める必要があります。 パスワードの複雑さの詳細については、SQL Azure パスワード ポリシーに関する記事を参照してください。
パラメーターの値が要件を満たさない場合、Azure SQL でサーバーはデプロイされません。
また、入力したログインとパスワードは必ずメモしておいてください。 これらは、次のセクションで使います。
デプロイが完了するまでに数分かかることがあります。
キー コンテナーとシークレットを作成する
おもちゃ会社には、デプロイに必要なシークレットを含むキー コンテナーが既に存在しています。 このシナリオをシミュレートするには、新しいキー コンテナーを作成し、使用するシークレットを追加します。
ターミナルで次のコマンドを実行して、キー コンテナーとシークレットを作成します。 これらのコマンドを実行する前に、変数の値を更新してください。 キー コンテナー名は、3 から 24 文字のグローバルに一意の文字列でなければならず、大文字と小文字、ハイフン (-
)、数字のみを使用できます。 たとえば、demo-kv-1234567abcdefg のようなものです。
注意事項
前の手順で使用したのと同じログインとパスワードを使用していることを確認します。 そうしないと、次のデプロイは正常に完了しません。
keyVaultName
では、YOUR-KEY-VAULT-NAME
をキー コンテナーの名前に置き換えます。 変数 login
と password
に対する read
コマンドでは、値の入力を求められます。 入力しても、値はターミナルに表示されず、コマンド履歴に保存されません。
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
Note
コンテナーで --enabled-for-template-deployment
設定をセットして、デプロイ中に Azure から資格情報コンテナーのシークレットを使用できるようにします。 この設定を行わなかった場合、既定では、デプロイで資格情報コンテナーのシークレットにアクセスできません。
また、デプロイを実行するユーザーは、コンテナーにアクセスするためのアクセス許可を持っている必要があります。 キー コンテナーを作成して所有者であるため、この演習でアクセス許可を明示的に付与する必要はありません。 独自のコンテナーについては、シークレットへのアクセス権を付与する必要があります。
keyVaultName
では、YOUR-KEY-VAULT-NAME
をキー コンテナーの名前に置き換えます。 変数 login
と password
に対する Read-Host
コマンドでは、値の入力を求められます。 入力しても、値はターミナルに表示されず、コマンド履歴に保存されません。 値はセキュリティで保護された文字列として格納されます。
変数 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
Note
コンテナーで -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 \
--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 portal に移動します。 ご利用のリソース グループにアクセスします。 このデプロイでは最初のデプロイと同じ名前が使用されたので、成功したデプロイの数として表示されるのは 1 件のままです。
成功した 1 件のリンクを選択します。
main という名前のデプロイを選択します。
左側のメニューで、[入力] を選択します。
appServicePlanSku
パラメーターの値とsqlDatabaseSku
パラメーターの値が両方ともパラメーター ファイルの値に設定されていることがわかります。 また、@secure()
デコレーターを適用したため、sqlServerAdministratorLogin
とsqlServerAdministratorPassword
の各パラメーターの値が表示されないことにも注意してください。