演習 - モジュールを使用して複数のスコープにリソースをデプロイする
注意
この演習には、Azure サブスクリプションが必要です。 まだお持ちでない方は、無料サブスクリプションを取得できます。
研究開発チームから、プロジェクト Teddybear サブスクリプションで仮想ネットワークを作成するための支援が求められています。 あなたは、今後さらに多くのサブスクリプションについてチームを支援することになることがわかっているので、再利用可能な Bicep テンプレートを拡張して、チーム メンバーが使用できるように仮想ネットワークをデプロイすることにしました。
この演習では、前の演習で構築し始めたテンプレートを更新します。
このプロセスでは、次のことを行います。
- サブスクリプションスコープのテンプレートを更新して、新しいリソース グループを作成します。
- 仮想ネットワークを使用する別の Bicep モジュールを作成し、パラメーターを使用して仮想ネットワークの構成方法を制御します。
- テンプレートを更新して、モジュールをリソース グループにデプロイします。
- テンプレートをデプロイします。
この演習では、サブスクリプション スコープのリソースをデプロイするためのアクセス許可が必要です。 現在の Azure アカウントでこれらの要件を満たすことができない場合は、無料試用版を入手し、新しい Azure サブスクリプションとテナントを作成することができます。 または、この演習のデプロイ手順をスキップできます。
リソース グループを作成する
Visual Studio Code で、前の演習で作成した main.bicep ファイルを開きます。
現在の変数定義の下に、次の変数定義を追加します。
var resourceGroupName = 'ToyNetworking'
ファイルの末尾に次のリソース定義を追加します。
resource resourceGroup 'Microsoft.Resources/resourceGroups@2024-07-01' = { name: resourceGroupName location: deployment().location }
他のリソースを定義する場合と同様に、リソース グループを定義していることに注目してください。 リソース グループは、
targetScope
をsubscription
に設定した Bicep ファイルでデプロイおよび管理できる、サブスクリプションスコープのリソースです。変更をファイルに保存します。
仮想ネットワークを作成するモジュールを追加する
次に、研究開発チームの仮想ネットワーク用の Bicep モジュールを作成します。 この演習では、後ほどモジュール内のリソースをリソース グループにデプロイします。
Visual Studio Code で、 main.bicepファイルを作成したフォルダーにmodulesという名前の新しいフォルダーを作成します。
modules フォルダーに、virtualNetwork.bicep というファイルを作成して保存します。
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 ファイルがリソース グループをターゲットとしている場合は、ターゲット スコープを指定する必要はありません。変更をファイルに保存します。
サブスクリプションのデプロイでモジュールを使用する
これで、リソース グループにモジュールをデプロイするよう Bicep に伝える準備が整いました。
Visual Studio Code で main.bicep ファイルの
targetScope
行目に次のパラメーター定義を追加します。param virtualNetworkName string param virtualNetworkAddressPrefix string
これらのパラメーターを使用すると、テンプレートが再利用可能になります。 研究開発チームに新しいサブスクリプションが必要になったときはいつでも、一意の名前と IP アドレス範囲を持つ仮想ネットワークを作成できます。
ファイルの末尾に次のモジュール定義を追加します。
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
virtualNetworkName
と virtualNetworkAddressPrefix
のパラメーターに値を渡していることに注目してください。 別の研究開発チームからサブスクリプションの準備を依頼された場合、これらの値を変更することで、そのチームに独自の仮想ネットワークを用意できます。
デプロイの完了には 1、2 分かかる可能性があります。その後、デプロイが成功したことがわかります。
デプロイを検証する
次に、モジュールによって作成されたリソース グループとデプロイを確認します。
Azure ポータルにアクセスします。
左側のペインで、[リソース グループ] を選択します。 ToyNetworking リソース グループが作成されていることに注目してください。
ToyNetworking リソース グループを選択します。 リソース グループにモジュールが正常にデプロイされ、仮想ネットワークが作成されていることに注目してください。
リソースのクリーンアップ
リソース グループを含むサブスクリプションスコープ リソースを正常にデプロイし、モジュールを使用して、作成したリソース グループにリソースをデプロイしました。 作成したポリシー リソースとリソース グループを削除することができます。
注意事項
このコマンドを実行すると、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