演習 - モジュールを使用して複数のスコープにリソースをデプロイする

完了

注意

この演習には、Azure サブスクリプションが必要です。 まだお持ちでない方は、無料サブスクリプションを取得できます。

研究開発チームから、プロジェクト Teddybear サブスクリプションで仮想ネットワークを作成するための支援が求められています。 あなたは、今後さらに多くのサブスクリプションについてチームを支援することになることがわかっているので、再利用可能な Bicep テンプレートを拡張して、チーム メンバーが使用できるように仮想ネットワークをデプロイすることにしました。

この演習では、前の演習で構築し始めたテンプレートを更新します。

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

  • サブスクリプションスコープのテンプレートを更新して、新しいリソース グループを作成します。
  • 仮想ネットワークを使用する別の Bicep モジュールを作成し、パラメーターを使用して仮想ネットワークの構成方法を制御します。
  • テンプレートを更新して、モジュールをリソース グループにデプロイします。
  • テンプレートをデプロイします。

この演習では、サブスクリプション スコープのリソースをデプロイするためのアクセス許可が必要です。 現在の Azure アカウントでこれらの要件を満たすことができない場合は、無料試用版を入手し、新しい Azure サブスクリプションとテナントを作成することができます。 または、この演習のデプロイ手順をスキップできます。

リソース グループを作成する

  1. Visual Studio Code で、前の演習で作成した main.bicep ファイルを開きます。

  2. 現在の変数定義の下に、次の変数定義を追加します。

    var resourceGroupName = 'ToyNetworking'
    
  3. ファイルの末尾に次のリソース定義を追加します。

    resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
      name: resourceGroupName
      location: deployment().location
    }
    

    他のリソースを定義する場合と同様に、リソース グループを定義していることに注目してください。 リソース グループは、targetScopesubscription に設定した Bicep ファイルでデプロイおよび管理できる、サブスクリプションスコープのリソースです。

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

仮想ネットワークを作成するモジュールを追加する

次に、研究開発チームの仮想ネットワーク用の Bicep モジュールを作成します。 この演習では、後ほどモジュール内のリソースをリソース グループにデプロイします。

  1. Visual Studio Code で、 main.bicepファイルを作成したフォルダーにmodulesという名前の新しいフォルダーを作成します。

  2. modules フォルダーに、virtualNetwork.bicep というファイルを作成して保存します。

  3. virtualNetwork.bicep ファイルに、次の内容を追加します。

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    
    resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
      name: virtualNetworkName
      location: resourceGroup().location
      properties: {
        addressSpace: {
          addressPrefixes: [
            virtualNetworkAddressPrefix
          ]
        }
      }
    }
    

    このモジュールには targetScope を指定していないことに注目してください。 Bicep ファイルがリソース グループをターゲットとしている場合は、ターゲット スコープを指定する必要はありません。

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

サブスクリプションのデプロイでモジュールを使用する

これで、リソース グループにモジュールをデプロイするよう Bicep に伝える準備が整いました。

  1. Visual Studio Code で main.bicep ファイルの targetScope 行目に次のパラメーター定義を追加します。

    param virtualNetworkName string
    param virtualNetworkAddressPrefix string
    

    これらのパラメーターを使用すると、テンプレートが再利用可能になります。 研究開発チームに新しいサブスクリプションが必要になったときはいつでも、一意の名前と IP アドレス範囲を持つ仮想ネットワークを作成できます。

  2. ファイルの末尾に次のモジュール定義を追加します。

    module virtualNetwork 'modules/virtualNetwork.bicep' = {
      scope: resourceGroup
      name: 'virtualNetwork'
      params: {
        virtualNetworkName: virtualNetworkName
        virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
      }
    }
    

    モジュールに scope を明示的に指定していることに注目してください。 モジュール内のリソースを、ファイル内で以前に作成したリソース グループにデプロイする必要があることが Bicep に認識されます。

テンプレートを確認する

main.bicep ファイルは次のようになります。

targetScope = 'subscription'

param virtualNetworkName string
param virtualNetworkAddressPrefix string

var policyDefinitionName = 'DenyFandGSeriesVMs'
var policyAssignmentName = 'DenyFandGSeriesVMs'
var resourceGroupName = 'ToyNetworking'

resource policyDefinition 'Microsoft.Authorization/policyDefinitions@2024-05-01' = {
  name: policyDefinitionName
  properties: {
    policyType: 'Custom'
    mode: 'All'
    parameters: {}
    policyRule: {
      if: {
        allOf: [
          {
            field: 'type'
            equals: 'Microsoft.Compute/virtualMachines'
          }
          {
            anyOf: [
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_F*'
              }
              {
                field: 'Microsoft.Compute/virtualMachines/sku.name'
                like: 'Standard_G*'
              }
            ]
          }
        ]
      }
      then: {
        effect: 'deny'
      }
    }
  }
}

resource policyAssignment 'Microsoft.Authorization/policyAssignments@2024-05-01' = {
  name: policyAssignmentName
  properties: {
    policyDefinitionId: policyDefinition.id
  }
}

resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = {
  name: resourceGroupName
  location: deployment().location
}

module virtualNetwork 'modules/virtualNetwork.bicep' = {
  scope: resourceGroup
  name: 'virtualNetwork'
  params: {
    virtualNetworkName: virtualNetworkName
    virtualNetworkAddressPrefix: virtualNetworkAddressPrefix
  }
}

modules/virtualNetwork.bicep ファイルは次のようになります。

param virtualNetworkName string
param virtualNetworkAddressPrefix string

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2024-01-01' = {
  name: virtualNetworkName
  location: resourceGroup().location
  properties: {
    addressSpace: {
      addressPrefixes: [
        virtualNetworkAddressPrefix
      ]
    }
  }
}

いずれかのファイルが例と一致しない場合は、例をコピーするか、テンプレートを調整してください。

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

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

templateFile="main.bicep"
today=$(date +"%d-%b-%Y")
deploymentName="sub-scope-"$today
virtualNetworkName="rnd-vnet-001"
virtualNetworkAddressPrefix="10.0.0.0/24"

az deployment sub create \
    --name $deploymentName \
    --location westus \
    --template-file $templateFile \
    --parameters virtualNetworkName=$virtualNetworkName \
                 virtualNetworkAddressPrefix=$virtualNetworkAddressPrefix

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

$templateFile = 'main.bicep'
$today = Get-Date -Format 'MM-dd-yyyy'
$deploymentName = "sub-scope-$today"
$virtualNetworkName = 'rnd-vnet-001'
$virtualNetworkAddressPrefix = '10.0.0.0/24'

New-AzSubscriptionDeployment `
  -Name $deploymentName `
  -Location westus `
  -TemplateFile $templateFile `
  -virtualNetworkName $virtualNetworkName `
  -virtualNetworkAddressPrefix $virtualNetworkAddressPrefix

virtualNetworkNamevirtualNetworkAddressPrefix のパラメーターに値を渡していることに注目してください。 別の研究開発チームからサブスクリプションの準備を依頼された場合、これらの値を変更することで、そのチームに独自の仮想ネットワークを用意できます。

デプロイの完了には 1、2 分かかる可能性があります。その後、デプロイが成功したことがわかります。

デプロイを検証する

次に、モジュールによって作成されたリソース グループとデプロイを確認します。

  1. Azure ポータルにアクセスします。

  2. 左側のペインで、[リソース グループ] を選択します。 ToyNetworking リソース グループが作成されていることに注目してください。

  3. ToyNetworking リソース グループを選択します。 リソース グループにモジュールが正常にデプロイされ、仮想ネットワークが作成されていることに注目してください。

    Screenshot of the Azure portal, showing the ToyNetworking resource group.

リソースのクリーンアップ

リソース グループを含むサブスクリプションスコープ リソースを正常にデプロイし、モジュールを使用して、作成したリソース グループにリソースをデプロイしました。 作成したポリシー リソースとリソース グループを削除することができます。

注意事項

このコマンドを実行すると、ToyNetworking という名前のリソース グループとそのすべてのリソースが完全に削除されます。 このリソース グループに他の何かをデプロイしている場合は、この手順をスキップしてください。

subscriptionId=$(az account show --query 'id' --output tsv)

az policy assignment delete --name 'DenyFandGSeriesVMs' --scope "/subscriptions/$subscriptionId"
az policy definition delete --name 'DenyFandGSeriesVMs' --subscription $subscriptionId
az group delete --name ToyNetworking
$subscriptionId = (Get-AzContext).Subscription.Id

Remove-AzPolicyAssignment -Name 'DenyFandGSeriesVMs' -Scope "/subscriptions/$subscriptionId"
Remove-AzPolicyDefinition -Name 'DenyFandGSeriesVMs' -SubscriptionId $subscriptionId
Remove-AzResourceGroup -Name ToyNetworking