演習 - リソースを条件付きでデプロイする

完了

Note

初めてサンドボックスをアクティブ化して利用規約に同意すると、Microsoft アカウントが Microsoft Learn Sandbox という名前の新しい Azure ディレクトリに関連付けられます。 また、コンシェルジェ サブスクリプションという名前の特殊なサブスクリプションにも追加されます。

あなたは、玩具会社のリソースをさまざまな環境にデプロイする必要があり、パラメーターと条件を使って、各環境にデプロイされるものを制御しようと考えています。

この演習では、Azure SQL の論理サーバーとデータベースを作成します。 その後、監査設定を追加して監査を有効にしますが、有効にするのは運用環境にデプロイするときだけです。 監査のためには、ストレージ アカウントが必要であり、それも運用環境にリソースをデプロイする場合にのみデプロイします。

このプロセスでは、次のことを行います。

  • データベースを含む論理サーバーを定義する Bicep ファイルを作成します。
  • ストレージ アカウントと SQL 監査設定を追加します。どちらも条件付きでデプロイされます。
  • 開発環境用のインフラストラクチャを設定し、結果を検証します。
  • 運用環境に対してインフラストラクチャを再デプロイし、変更を確認します。

この演習では、Visual Studio Code 用の Bicep 拡張機能を使用します。 この拡張機能を Visual Studio Code にインストールしてください。

論理サーバーとデータベースについての Bicep テンプレートを作成する

  1. Visual Studio Code を開きます。

  2. main.bicep という名前の新しいファイルを作成します。

  3. Visual Studio Code によって Bicep ツールが読み込まれるように、空のファイルを保存します。

    [ファイル]>[名前を付けて保存] を選択するか、Windows で Ctrl+S (macOS では ⌘+S) を選択できます。 ファイルを保存した場所を忘れないようにしてください。 たとえば、保存場所として、templates フォルダーを作成することをお勧めします。

  4. 論理サーバーとデータベースを定義するには、次の内容と、これらのリソースに必要なパラメーターと変数を、ファイルに追加します。 Bicep ファイルを記述するときにツールがどのように役立つかを確認できるよう、コピーして貼り付けるのではなく、自分で内容を入力してください。

    @description('The Azure region into which the resources should be deployed.')
    param location string
    
    @secure()
    @description('The administrator login username for the SQL server.')
    param sqlServerAdministratorLogin string
    
    @secure()
    @description('The administrator login password for the SQL server.')
    param sqlServerAdministratorLoginPassword string
    
    @description('The name and tier of the SQL database SKU.')
    param sqlDatabaseSku object = {
      name: 'Standard'
      tier: 'Standard'
    }
    
    var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
    var sqlDatabaseName = 'TeddyBear'
    
    resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
      name: sqlServerName
      location: location
      properties: {
        administratorLogin: sqlServerAdministratorLogin
        administratorLoginPassword: sqlServerAdministratorLoginPassword
      }
    }
    
    resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
      parent: sqlServer
      name: sqlDatabaseName
      location: location
      sku: sqlDatabaseSku
    }
    

    すべてのパラメーターに @description デコレーターが含まれていることに注意してください。これらはパラメーターを使用するときに役に立ちます。 また、sqlServerAdministratorLogin パラメーターと sqlServerAdministratorLoginPassword パラメーターには @secure デコレーターが適用されていることに注意してください。 これは、これらのパラメーター値が機密であることを Bicep に伝えるものです。 Azure では、機密性の高い値はログに出力されません。

ストレージ アカウントの追加

論理サーバーの監査設定では、監査データを格納するストレージ アカウントを指定する必要があります。 後でこのストレージ アカウントを作成するように Bicep ファイルを更新しますが、監査を有効にするときにだけ作成します。

  1. パラメーター宣言の下に、次のパラメーターを追加します。

    @description('The name of the environment. This must be Development or Production.')
    @allowed([
      'Development'
      'Production'
    ])
    param environmentName string = 'Development'
    
    @description('The name of the audit storage account SKU.')
    param auditStorageAccountSkuName string = 'Standard_LRS'
    
  2. 変数宣言の下に、次の変数を追加します。

    var auditingEnabled = environmentName == 'Production'
    var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)
    

    auditingEnabled という名前の変数を作成していることに注意してください。これは、監査リソースをデプロイするための条件として使用します。 このような変数を作成すると、Bicep コードがより明確になり、読みやすくなります。 誰でも、リソースの条件を確認して、何が行われているかを理解できます。

    また、auditStorageAccountName 変数で take() という関数が使用されていることに注意してください。 ストレージ アカウント名の最大長は 24 文字であり、名前が有効になるようにこの関数によって文字列の末尾がトリミングされます。

  3. ファイルの末尾にあるリソースの下に、ストレージ アカウントの次のリソース定義を追加します。

    resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
      name: auditStorageAccountName
      location: location
      sku: {
        name: auditStorageAccountSkuName
      }
      kind: 'StorageV2'  
    }
    

    ストレージ アカウントの定義に、デプロイ条件を指定する if キーワードが含まれることに注意してください。

監査設定を追加する

  1. 追加したストレージ アカウント リソースの下に、以下を追加します。

    resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
      parent: sqlServer
      name: 'default'
      properties: {
        state: 'Enabled'
        storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
        storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
      }
    }
    

    定義にストレージ アカウントと同じ if 条件が含まれることに注意してください。 また、storageEndpoint プロパティと storageAccountAccessKey プロパティでは、疑問符 (?) 三項演算子を使用して、それらの値が常に有効であることが確認されています。 これを行わないと、Azure Resource Manager によってリソースのデプロイ条件を評価する前に式の値が評価され、ストレージ アカウントが見つからないため、エラーが返されます。

  2. 変更をファイルに保存します。

Bicep ファイルを確認する

上記のすべての変更を完了すると、Bicep ファイルは次の例のようになります。

@description('The Azure region into which the resources should be deployed.')
param location string

@secure()
@description('The administrator login username for the SQL server.')
param sqlServerAdministratorLogin string

@secure()
@description('The administrator login password for the SQL server.')
param sqlServerAdministratorLoginPassword string

@description('The name and tier of the SQL database SKU.')
param sqlDatabaseSku object = {
  name: 'Standard'
  tier: 'Standard'
}

@description('The name of the environment. This must be Development or Production.')
@allowed([
  'Development'
  'Production'
])
param environmentName string = 'Development'

@description('The name of the audit storage account SKU.')
param auditStorageAccountSkuName string = 'Standard_LRS'

var sqlServerName = 'teddy${location}${uniqueString(resourceGroup().id)}'
var sqlDatabaseName = 'TeddyBear'
var auditingEnabled = environmentName == 'Production'
var auditStorageAccountName = take('bearaudit${location}${uniqueString(resourceGroup().id)}', 24)

resource sqlServer 'Microsoft.Sql/servers@2023-08-01-preview' = {
  name: sqlServerName
  location: location
  properties: {
    administratorLogin: sqlServerAdministratorLogin
    administratorLoginPassword: sqlServerAdministratorLoginPassword
  }
}

resource sqlDatabase 'Microsoft.Sql/servers/databases@2023-08-01-preview' = {
  parent: sqlServer
  name: sqlDatabaseName
  location: location
  sku: sqlDatabaseSku
}

resource auditStorageAccount 'Microsoft.Storage/storageAccounts@2023-05-01' = if (auditingEnabled) {
  name: auditStorageAccountName
  location: location
  sku: {
    name: auditStorageAccountSkuName
  }
  kind: 'StorageV2'  
}

resource sqlServerAudit 'Microsoft.Sql/servers/auditingSettings@2023-08-01-preview' = if (auditingEnabled) {
  parent: sqlServer
  name: 'default'
  properties: {
    state: 'Enabled'
    storageEndpoint: environmentName == 'Production' ? auditStorageAccount.properties.primaryEndpoints.blob : ''
    storageAccountAccessKey: environmentName == 'Production' ? listKeys(auditStorageAccount.id, auditStorageAccount.apiVersion).keys[0].value : ''
  }
}

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

Bicep テンプレートを Azure にデプロイする

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインする必要があります。 Azure CLI がインストールされていることを確認し、サンドボックスのアクティブ化に使用したのと同じアカウントでサインインします。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが Bash の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    Bash オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Bash 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択した後、[Azure Cloud Shell (Bash)] を選択します。

    ターミナル シェルのドロップダウンが表示され、[Git Bash (既定値)] が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Bash を選択します。

    Bash ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    cd templates
    

Bicep をインストールする

次のコマンドを実行して、最新バージョンの Bicep がインストールされていることを確認します。

az bicep install && az bicep upgrade

Azure へのサインイン

  1. Visual Studio Code ターミナルで、次のコマンドを実行して Azure にサインインします。

    az login
    
  2. 開いたブラウザーで、Azure アカウントにサインインします。

    Visual Studio Code ターミナルには、このアカウントに関連付けられているサブスクリプションの一覧が表示されます。

  3. このセッションで実行するすべての Azure CLI コマンドに対して、既定のサブスクリプションを設定します。

    az account set --subscription "Concierge Subscription"
    

    注意

    最近、複数のサンドボックスを使用した場合、ターミナルに、"コンシェルジェ サブスクリプション" の複数のインスタンスが表示される場合があります。 その場合は、次の 2 つのステップを使用して、1 つを既定のサブスクリプションとして設定します。 上記のコマンドが正常に実行され、1 つの "コンシェルジェ サブスクリプション" のみがリストされたら、次の 2 つのステップをスキップします。

  4. コンシェルジェ サブスクリプションの ID を取得します。

     az account list \
       --refresh \
       --query "[?contains(name, 'Concierge Subscription')].id" \
       --output table
    
  5. サブスクリプション ID を使用して、既定のサブスクリプションを設定します。 {your subscription ID} を最新のコンシェルジェ サブスクリプション ID に置き換えます。

    az account set --subscription {your subscription ID}
    

既定のリソース グループを設定する

Azure CLI を使用する場合は、既定のリソース グループを設定し、この演習の残りの Azure CLI コマンドでパラメーターを省略できます。 サンドボックス環境で自分用に作成されたリソース グループに、既定値を設定します。

az configure --defaults group="<rgn>[sandbox resource group name]</rgn>"

Azure CLI を使用してテンプレートを Azure にデプロイする

Visual Studio Code ターミナルで、次のコードを実行して Bicep テンプレートを Azure にデプロイします。 location パラメーターを westus3 に明示的に設定していることに注意してください。

az deployment group create --template-file main.bicep --parameters location=westus3

このテンプレートを Azure にデプロイするには、Visual Studio Code ターミナルから Azure アカウントにサインインします。 Azure PowerShell をインストールしたことを確認し、サンドボックスをアクティブ化したのと同じアカウントにサインインします。

  1. [ターミナル] メニューで、[新しいターミナル] を選択します。 通常、ターミナル ウィンドウは画面の下半分に表示されます。

  2. ターミナル ウィンドウの右側に表示されるシェルが powershell または pwsh の場合、正しいシェルが開いているので、次のセクションに進むことができます。

    シェルのドロップダウン リストに pwsh オプションが表示されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  3. Powershell または pwsh 以外のシェルが表示された場合は、シェルのドロップダウン矢印を選択し、[PowerShell] を選びます。

    ターミナル シェルのドロップダウン リストが表示され、PowerShell が選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  4. ターミナル シェルの一覧で、Powershell または pwsh を選択します。

    PowerShell ターミナルが選択されている Visual Studio Code ターミナル ウィンドウのスクリーンショット。

  5. ターミナルで、テンプレートを保存したディレクトリに移動します。 たとえば、それをテンプレート フォルダーに保存した場合、次のコマンドを使用します。

    Set-Location -Path templates
    

Bicep CLI のインストール

Azure PowerShell で Bicep を使用するには、Bicep CLI をインストールします。

Azure PowerShell を使用して Azure にサインインする

  1. Visual Studio Code ターミナルで、次のコマンドを実行します。

    Connect-AzAccount
    

    ブラウザーが開き、Azure アカウントにサインインできるようになります。

  2. Azure にサインインすると、ターミナルに、このアカウントに関連付けられているサブスクリプションの一覧が表示されます。

    サンドボックスをアクティブにした場合は、"コンシェルジェ サブスクリプション" という名前のサブスクリプションが表示されます。 演習の残りの部分では、これを使用します。

  3. このセッションで実行するすべての Azure PowerShell コマンドについて既定のサブスクリプションを設定します。

    $context = Get-AzSubscription -SubscriptionName 'Concierge Subscription'
    Set-AzContext $context
    

    注意

    最近、複数のサンドボックスを使用した場合、ターミナルに、"コンシェルジェ サブスクリプション" の複数のインスタンスが表示される場合があります。 その場合は、次の 2 つのステップを使用して、1 つを既定のサブスクリプションとして設定します。 上記のコマンドが正常に実行され、1 つの "コンシェルジェ サブスクリプション" のみがリストされたら、次の 2 つのステップをスキップします。

  4. サブスクリプション ID を取得します。 次のコマンドを実行すると、ご使用のサブスクリプションとその ID が一覧表示されます。 Concierge Subscription を探して、2 番目の列から ID をコピーします。 これは、aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e のように表示されます。

    Get-AzSubscription
    
  5. アクティブなサブスクリプションを "コンシェルジェ サブスクリプション" に変更します。 必ず、"{ご使用のサブスクリプションの ID}" を、コピーした ID に置き換えてください。

    $context = Get-AzSubscription -SubscriptionId {Your subscription ID}
    Set-AzContext $context
    

既定のリソース グループを設定する

この演習では、既定のリソース グループを設定し、残りの Azure PowerShell コマンドからパラメーターを省略できます。 サンドボックス環境で自分用に作成されたリソース グループに、この既定値を設定します。

Set-AzDefault -ResourceGroupName <rgn>[sandbox resource group name]</rgn>

Azure PowerShell を使用してテンプレートを Azure にデプロイする

Visual Studio Code ターミナルで、次の Azure PowerShell コマンドを実行してテンプレートを Azure にデプロイします。 このプロセスが完了するには数分かかる場合があり、その後でデプロイが成功します。

New-AzResourceGroupDeployment -TemplateFile main.bicep -location westus3

デプロイを実行すると、sqlServerAdministratorLogin パラメーターと sqlServerAdministratorLoginPassword パラメーターの値の入力を求めるメッセージが表示されます。

ヒント

セキュリティ保護のパラメーターを入力するときは、特定の規則に従って値を選択する必要があります。

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

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

また、"入力したログインとパスワードを控えておいてください"。 後でもう一度使用します。

environmentName パラメーターの値を指定していないので、既定値の Development が使用されます。

展開が完了するまで待ちます。 場所では新しい Windows Azure SQL データベース サーバーの作成を受け付けていないというメッセージでデプロイが失敗した場合は、eastuseastus2 など、別のリージョンを選択します。

デプロイを検証する

Azure portal を使用して、デプロイするリソースを検査し、各デプロイの結果を調べます。

  1. Azure portal にアクセスし、次のようにしてサンドボックス サブスクリプション内にいることを確認します。

    a. 右上で自分のアバターを選択します。
    b. [ディレクトリの切り替え] を選択します。 一覧で、[Microsoft Learn サンドボックス] ディレクトリを選択します。

  2. 左側のペインで、[リソース グループ] を選択します。

  3. [サンドボックス リソース グループ名] を選択します。

  4. [概要] セクションで、1 つのデプロイが成功したことを確認できます。 論理サーバーと SQL データベースがデプロイされていることも確認できますが、監査用のストレージ アカウントはデプロイされていません。

    Note

    cloudshell で始まる名前のストレージ アカウントは、このデプロイとは無関係であり、Learn サンドボックスによって作成されたものです。

    Azure portal のリソース グループ概要ペインのスクリーンショット。成功したデプロイがセクションに表示されています。

  5. [デプロイ] の隣の [1 Succeeded] (1 件成功) を選んで、デプロイの詳細を表示します。

    Azure portal のリソース グループ概要ペインのスクリーンショット。成功したデプロイの追加の詳細が表示されています。

  6. main というデプロイを選択して、デプロイされたリソースを確認し、次に [デプロイの詳細] を選択して展開します。

    この場合、1 つの論理サーバーと 1 つの SQL データベースがデプロイされています。 ストレージ アカウントと監査設定がリソースの一覧にないことに注意してください。

    特定のデプロイに対する Azure portal のリソース グループ概要ペインのスクリーンショット。論理サーバーとデータベース リソースの一覧が表示されています。

  7. ブラウザーでページを開いたままにします。 デプロイは後でもう一度確認します。

運用環境に再デプロイする

前のデプロイで、environmentName パラメーターについては既定値を使用しました。これは、Development に設定されたことを意味します。

ここでは、パラメーターの値を Production に明示的に設定します。 この変更を行うと、監査用のストレージ アカウントがデプロイされ、論理サーバーで監査が有効になることが予想されます。

運用環境にテンプレートをデプロイする

Visual Studio Code ターミナルで、次のコードを実行して Bicep テンプレートを Azure にデプロイします。

az deployment group create --template-file main.bicep --parameters environmentName=Production location=westus3

Visual Studio Code ターミナルで、次の Azure PowerShell コマンドを実行してテンプレートを Azure にデプロイします。

New-AzResourceGroupDeployment -TemplateFile main.bicep -environmentName Production -location westus3

注意事項

前に使用したのと同じログインとパスワードを使用してください。そうしないと、デプロイが正常に完了しません。

1 から 2 分後に、デプロイが正常に完了します。

再デプロイを検証する

この演習を完了するため、再デプロイが正常に完了し、監査が有効になっていることを確認します。

  1. Azure portal に戻り、リソース グループに移動します。 リソース グループを既に開いている場合は、[最新の状態に更新] を選択します。

    監査のために追加のストレージ アカウントがデプロイされていることがわかります。

    Azure portal のリソース グループ概要ペインのスクリーンショット。監査用のストレージ アカウントがデプロイされたことが示されています。

  2. 論理サーバーを選択します (SQL サーバーという種類のリソースを探します)。

  3. 検索フィールドに「Auditing」と入力します。 [セキュリティ] の下で [監査] を選択します。

    論理サーバーの Azure portal インターフェイスのスクリーンショット。「Auditing」と入力された検索フィールドが示されています。

  4. この論理サーバーに対して監査が有効になっていることを確認します。

    論理サーバーの Azure portal インターフェイスのスクリーンショット。監査構成が有効になっていることが示されています。