Bereitstellen von Ressourcen in mehreren Bereichen

Abgeschlossen

Manchmal müssen Sie Ressourcen auf mehreren Ebenen Ihrer Hierarchie aus einer Bereitstellung bereitstellen. Dies sind einige Situationen, in denen Sie vielleicht so vorgehen möchten:

  • Sie müssen Ressourcen in zwei verschiedenen Ressourcengruppen bereitstellen. Beispielsweise möchten Sie vielleicht eine Netzwerksicherheitsgruppe in einer freigegebenen Ressourcengruppe erstellen und außerdem eine Netzwerkschnittstelle für einen virtuellen Computer in einer Ressourcengruppe für Ihre Anwendung bereitstellen.
  • Sie verwenden eine Vorlage, um eine Ressourcengruppe zu erstellen, bei der es sich um eine Ressource im Abonnementbereich handelt. Anschließend möchten Sie ein Speicherkonto und andere Azure-Ressourcen mithilfe einer Bereitstellung im Ressourcengruppenbereich für diese Ressourcengruppe bereitstellen.
  • Sie stellen eine Verwaltungsgruppenhierarchie bereit und möchten auch einige Abonnements bereitstellen, bei denen es sich um Ressourcen im Mandantenbereich handelt.

Mit Bicep können Sie mithilfe des Schlüsselworts scope eine Bereitstellung erstellen, die für verschiedene Bereiche funktioniert.

Hinweis

Die Befehle in dieser Lerneinheit dienen der Veranschaulichung der Konzepte. Führen Sie die Befehle jetzt noch nicht aus. Sie können das Erlernte in Kürze üben.

Angeben des Bereichs für ein Modul

Sie können Bicep-Module verwenden, um einen Satz von Ressourcen in einem Bereich bereitzustellen, der sich von dem in der Datei targetScope angegebenen Bereich unterscheidet. Hier sehen Sie eine Bicep-Beispieldatei, die mit einem targetScope von subscription bereitgestellt wird, aber ein Modul verwendet, um einige Ressourcen in einer Ressourcengruppe bereitzustellen:

targetScope = 'subscription'

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

Beachten Sie, dass die scope-Eigenschaft eine Bicep-Funktion verwendet, um den Zielbereich zu identifizieren. Im vorherigen Beispiel wird die resourceGroup()-Funktion verwendet und der Name der Zielressourcengruppe angegeben. Sie können auch die Funktionen subscription(), managementGroup() und tenant() verwenden. Durch die Verwendung des Schlüsselworts targetScope für Bicep-Dateien und des Schlüsselworts scope für Module ist es möglich, viele verschiedene Kombinationen von Bereichen für Ihre Bereitstellungen zu erstellen.

Hinweis

Eine Ausnahme besteht darin, dass Bicep-Dateien mit einem targetScope von resourceGroup oder subscription kein Modul mit einem scope von managementGroup enthalten können.

Tipp

Wenn Sie eine Bicep-Datei im Abonnementbereich verwenden, um eine Ressourcengruppe zu erstellen, können Sie den symbolischen Namen der Ressourcengruppe als scope für ein Modul verwenden. Die entsprechende Vorgehensweise wird in der nächsten Übung gezeigt.

Bereitstellen in mehreren Ressourcengruppen

Bereiche werden häufig verwendet, um Ressourcen über mehrere Ressourcengruppen hinweg bereitzustellen. Obwohl Sie die scope-Eigenschaft für die meisten Azure-Ressourcen nicht festlegen können, können Sie Bicep mithilfe von Modulen mitteilen, dass eine Gruppe von Ressourcen in einer anderen Ressourcengruppe bereitgestellt werden soll.

Beispielsweise können Sie eine einzelne Gruppe von Bicep-Dateien erstellen, die ein virtuelles Netzwerk und die zugehörigen Ressourcen in einer freigegebenen Ressourcengruppe namens ToyNetworking bereitstellen und dann eine Netzwerkschnittstelle in einer anderen Ressourcengruppe bereitstellen. Die Bicep-Datei sieht wie folgt aus:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('ToyNetworking')
  name: 'networkModule'
}

resource networkInterface 'Microsoft.Network/networkInterfaces@2024-01-01' = {
  name: 'production-nic'
  location: resourceGroup().location
  properties: {
    ipConfigurations: [
      {
        name: 'toy-subnet-ip-configuration'
        properties: {
          subnet: {
            id: networkModule.outputs.subnetResourceId
          }
        }
      }
    ]
  }
}

Beachten Sie, dass die Ressourcen, die in der Ressourcengruppe ToyNetworking bereitgestellt werden sollen, in einem Modul definiert sind. Außerdem wird die subnetResourceId-Ausgabe in der Ressourcendefinition der Netzwerkschnittstelle verwendet.

Nachdem Sie diese Datei bereitgestellt haben, können Sie eine andere Ressourcengruppe mit dem Namen ProjectTeddybear wie folgt als Ziel verwenden:

az deployment group create --resource-group ProjectTeddybear ...
New-AzResourceGroupDeployment -ResourceGroupName ProjectTeddybear ...

Obwohl die Bereitstellung auf die Ressourcengruppe ProjectTeddybear abzielt, werden die Ressourcen des virtuellen Netzwerks in der Ressourcengruppe ToyNetworking bereitgestellt. Die Netzwerkschnittstelle wird in der Ressourcengruppe ProjectTeddybear bereitgestellt.

Sie können sogar eine Ressourcengruppe in einem anderen Abonnement bereitstellen, indem Sie die Abonnement-ID in den resourceGroup-Bereich einbinden:

module networkModule 'modules/network.bicep' = {
  scope: resourceGroup('f0750bbe-ea75-4ae5-b24d-a92ca601da2c', 'ToyNetworking')
  name: 'networkModule'
}

Auf ähnliche Weise können Sie die subscription()-Bereichsfunktion verwenden, um Ressourcen für mehrere Abonnements im Abonnementbereich bereitzustellen, und Sie können die managementGroup()-Bereichsfunktion verwenden, um die Ressourcen über mehrere Verwaltungsgruppen hinweg bereitzustellen. Sie können sie jedoch nicht mandantenübergreifend bereitstellen.

Angeben des Bereichs für eine einzelne Ressource

Sie können das Schlüsselwort scope für einige andere spezifische Ressourcentypen verwenden, nicht nur für Module. Erweiterungsressourcen verwenden das Schlüsselwort scope, um anzugeben, für welche Ressource sie gelten. Darüber hinaus können Ressourcen im Mandantenbereich das Schlüsselwort scope verwenden, sodass Sie sie aus einer beliebigen Vorlage bereitstellen können.

Beispielsweise können Sie eine Bicep-Datei verwenden, um eine Verwaltungsgruppenhierarchie zu erstellen, wie im folgenden Beispiel gezeigt:

targetScope = 'managementGroup'

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

Beachten Sie, dass in diesem Beispiel targetScope = 'managementGroup' in der Vorlagendatei verwendet wird, dann aber die Verwaltungsgruppen innerhalb des tenant()-Bereichs bereitgestellt werden.

Hinweis

Im vorherigen Beispiel wird veranschaulicht, wie Sie Bicep verwenden können, um eine Verwaltungsgruppenhierarchie zu erstellen. Die Verwaltungsgruppe NonProduction ist ein untergeordnetes Element der Stammverwaltungsgruppe, und die Verwaltungsgruppe SecretRND ist ein untergeordnetes Element der Verwaltungsgruppe NonProduction.

Erstellen einer Verwaltungsgruppe und einer Abonnementhierarchie

Nun wissen Sie, wie Sie viele verschiedene Ressourcen in einer Vielzahl von Bereichen bereitstellen, und Sie wissen, wie Sie Bicep-Module und das Schlüsselwort scope verwenden, um Kombinationen von Ressourcen bereitzustellen. Wenden wir dieses neue Wissen an, um die Verwaltungsgruppenhierarchie im vorherigen Beispiel zu erweitern. Nun enthält die Hierarchie auch einen Abonnementalias, bei dem es sich um eine Ressource im Mandantenbereich handelt, die ein neues Azure-Abonnement erstellt:

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

Hinweis

Wenn Sie einen Abonnementalias erstellen, geben Sie auch einige andere Eigenschaften an, z. B. einen Abrechnungsbereich. Wir haben diese aus Gründen der Übersichtlichkeit weggelassen.

Anschließend können Sie das Abonnement einer Verwaltungsgruppe zuordnen. Dazu müssen Sie einen Ressourcentyp namens Microsoft.Management/managementGroups/subscriptions bereitstellen. Aufgrund der Funktionsweise dieser Ressource würden Sie sie in einem Modul deklarieren. Hier ist beispielsweise eine Datei mit dem Namen modules/mg-subscription-association.bicep:

targetScope = 'tenant'

@description('The name of the management group that should contain the subscription.')
param managementGroupName string

@description('The subscription ID to place into the management group.')
param subscriptionId string

resource managementGroup 'Microsoft.Management/managementGroups@2023-04-01' existing = {
  name: managementGroupName
}

resource subscriptionAssociation 'Microsoft.Management/managementGroups/subscriptions@2023-04-01' = {
  parent: managementGroup
  name: subscriptionId
}

Beachten Sie, dass über das Schlüsselwort existing auf die Verwaltungsgruppe verwiesen wird.

Die Bicep-Hauptdatei kann dann die Zuordnung erstellen, indem sie das Modul einbindet. Dies ist die gesamte Bicep-Datei:

targetScope = 'managementGroup'

@description('The name of the subscription alias to deploy.')
param subscriptionAliasName string

resource parentManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'NonProduction'
  properties: {
    displayName: 'Non-production'
  }
}

resource childManagementGroup 'Microsoft.Management/managementGroups@2023-04-01' = {
  scope: tenant()
  name: 'SecretRND'
  properties: {
    displayName: 'Secret R&D Projects'
    details: {
      parent: {
        id: parentManagementGroup.id
      }
    }
  }
}

resource subscription 'Microsoft.Subscription/aliases@2024-08-01-preview'
  scope: tenant()
  name: subscriptionAliasName
  properties: {
    // ...
  }
}

module subscriptionAssociation 'modules/mg-subscription-association.bicep' = {
  name: 'subscriptionAssociation'
  scope: tenant()
  params: {
    managementGroupName: childManagementGroup.name
    subscriptionId: subscription.properties.subscriptionId
  }
}

Wie Sie gesehen haben, können Sie alle Bereiche und Bicep-Sprachfeatures zusammen verwenden, um anspruchsvolle Bereitstellungen Ihrer gesamten Azure-Infrastruktur zu erstellen.