演習 - パラメーター ファイルとセキュリティで保護されたパラメーターを追加する

完了

この演習では、以前に作成した 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 ファイルで、現在のパラメーター宣言の下に、sqlServerAdministratorLoginsqlServerAdministratorPasswordsqlDatabaseSku の各パラメーターを追加します。 完了すると、パラメーター宣言は次の例のようになります。

@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

sqlServerAdministratorLoginsqlServerAdministratorPassword の各パラメーターに既定値を指定していないことに注意してください。 セキュリティで保護されたパラメーターに既定値を追加するのは、セキュリティ上好ましくありません。 また、sqlDatabaseSku には既定値を指定していません。 パラメーター ファイルで値を指定します。

新しい変数を追加する

Visual Studio Code の main.bicep ファイルで、既存の変数の下に sqlServerNamesqlDatabaseName 変数を追加します。 完了すると、変数宣言は次の例のようになります。

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

SQL サーバーとデータベース リソースを追加する

  1. Visual Studio Code の main.bicep ファイルで、ファイルの末尾に次のコードを追加します。

    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. 変更をファイルに保存します。

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

そうでない場合は、例をコピーするか、例に合わせてテンプレートを調整します。

パラメーター ファイルを作成する

  1. Visual Studio Code を開き、main.bicep ファイルがあるフォルダーを開きます。 同じフォルダー内に、main.parameters.dev.json という名前で新しいファイルを作成します。

  2. 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"
          }
        }
      }
    }
    
  3. 変更をファイルに保存します。

パラメーター ファイルを使用して 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

デプロイを実行するときに、sqlServerAdministratorLoginsqlServerAdministratorPassword の各パラメーターの値を入力するように求めるメッセージが表示されます。 solutionName はテンプレートで既定値が指定されているので、指定する必要はありません。 その他のパラメーター値はパラメーター ファイルで指定されているため、指定する必要はありません。

ヒント

セキュリティで保護されたパラメーターを入力する場合、選択する値はいくつかの規則に従う必要があります。

  • sqlServerAdministratorLogin は、adminroot のような簡単に推測できるログイン名にしてはなりません。 英数字のみを使用でき、文字で始める必要があります。
  • sqlServerAdministratorPassword は、8 文字以上で、小文字、大文字、数字、記号を含める必要があります。 パスワードの複雑さの詳細については、SQL Azure パスワード ポリシーに関する記事を参照してください。

パラメーターの値が要件を満たさない場合、Azure SQL でサーバーはデプロイされません。

また、入力したログインとパスワードは必ずメモしておいてください。 これらは、次のセクションで使います。

デプロイが完了するまでに数分かかることがあります。

キー コンテナーとシークレットを作成する

おもちゃ会社には、デプロイに必要なシークレットを含むキー コンテナーが既に存在しています。 このシナリオをシミュレートするには、新しいキー コンテナーを作成し、使用するシークレットを追加します。

ターミナルで次のコマンドを実行して、キー コンテナーとシークレットを作成します。 これらのコマンドを実行する前に、変数の値を更新してください。 キー コンテナー名は、3 から 24 文字のグローバルに一意の文字列でなければならず、大文字と小文字、ハイフン (-)、数字のみを使用できます。 たとえば、demo-kv-1234567abcdefg のようなものです。

注意事項

前の手順で使用したのと同じログインとパスワードを使用していることを確認します。 そうしないと、次のデプロイは正常に完了しません。

keyVaultName では、YOUR-KEY-VAULT-NAME をキー コンテナーの名前に置き換えます。 変数 loginpassword に対する read コマンドでは、値の入力を求められます。 入力しても、値はターミナルに表示されず、コマンド履歴に保存されません。

Bash ターミナル セッションの変数値を保護するには、次の点に注意してください。

  • 変数値は安全な文字列として格納されず、コマンド ラインに $yourVariableName のようなコマンドを入力するか、echo コマンドを使用することで表示できます。 この演習では、コンテナー シークレットの作成後、値を入力せず、read コマンドを実行することで各変数の既存値を削除できます。
  • az keyvault secret set では、シークレットの値の作成に --value パラメーターが使用されます。 コマンドの出力は、シークレットの値が含まれる、value という名前のプロパティが表示されます。 例に示されているように、パラメーター --output none を利用することでコマンドの出力全体を非表示にできます。

変数 keyVaultNameloginpassword を作成するには、各コマンドを個別に実行します。 その後、コマンドのブロックを実行して、キー コンテナーとシークレットを作成できます。

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 をキー コンテナーの名前に置き換えます。 変数 loginpassword に対する Read-Host コマンドでは、値の入力を求められます。 入力しても、値はターミナルに表示されず、コマンド履歴に保存されません。 値はセキュリティで保護された文字列として格納されます。

変数 keyVaultNameloginpassword を作成するには、各コマンドを個別に実行します。 その後、コマンドのブロックを実行して、キー コンテナーとシークレットを作成できます。

$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/f0750bbe-ea75-4ae5-b24d-a92ca601da2c/resourceGroups/PlatformResources/providers/Microsoft.KeyVault/vaults/toysecrets

リソース ID をコピーします。 これは、次の手順で使用します。

キー コンテナー参照をパラメーター ファイルに追加する

  1. 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"
          }
        }
      }
    }
    
  2. 変更をファイルに保存します。

パラメーター ファイルと 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

この時点でデプロイを実行するときに、sqlServerAdministratorLoginsqlServerAdministratorPassword の各パラメーターの値を入力するように求められることはありません。 代わりに、Azure によってキー コンテナーから値が取得されます。

Azure リソースが既に存在するため、デプロイは短時間で完了します。

デプロイをチェックする

  1. ブラウザーで、Azure portal に移動します。 ご利用のリソース グループにアクセスします。 このデプロイでは最初のデプロイと同じ名前が使用されたので、成功したデプロイの数として表示されるのは 1 件のままです。

  2. 成功した 1 件のリンクを選択します。

  3. main という名前のデプロイを選択します。

  4. 左側のメニューで、[入力] を選択します。

  5. appServicePlanSku パラメーターの値と sqlDatabaseSku パラメーターの値が両方ともパラメーター ファイルの値に設定されていることがわかります。 また、@secure() デコレーターを適用したため、sqlServerAdministratorLoginsqlServerAdministratorPassword の各パラメーターの値が表示されないことにも注意してください。

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