Steuern der Bereitstellungsreihenfolge durch Angeben von Abhängigkeiten

Abgeschlossen

Nehmen wir an, Sie möchten eine Reihe von Ressourcen in Azure bereitstellen, aber nur dann, wenn eine andere Ressource bereits bereitgestellt wurde. An diesem Punkt müssen Sie in der Vorlage kommunizieren, dass eine Ressource von einer anderen Ressource abhängig ist.

Hier sind einige Aspekte zu beachten:

  • Etwas muss vorhanden sein, bevor etwas anderes bereitgestellt werden kann.

    Angenommen, Sie benötigen einen Schlüsseltresor in Azure Key Vault, um Geheimnisse abzurufen, die Sie in einen virtuellen Computer (VM) laden müssen. Wenn Sie den Schlüsseltresor bereitstellen, können Sie gleichzeitig sein Geheimnis innerhalb derselben Vorlage bereitstellen. Allerdings muss der Schlüsseltresor vor seinem Geheimnis bereitgestellt werden. Daher ist das Geheimnis vom Vorhandensein des Schlüsseltresors abhängig. Der Schlüsseltresor und das Geheimnis werden aufgrund der Abhängigkeit beginnend mit dem Schlüsseltresor seriell nacheinander bereitgestellt.

  • Kann ich mich darauf verlassen, wie die Dinge in Azure Resource Manager funktionieren?

    Ihr erster Gedanke bei der Überprüfung, ob eine weitere Ressource vorhanden ist, kann sich auf die Verwendung von Azure PowerShell oder der Azure CLI beziehen, um das Vorhandensein einer Ressource zu überprüfen. Eine automatisiertere Lösung verwendet die integrierte Idempotenz von Resource Manager. Wenn Resource Manager eine Ressource erkennt, die in einer Vorlage definiert und in der Cloud bereits vorhanden ist, wird diese nicht erneut bereitgestellt. Damit dies ein gültiger Ansatz ist, müssen Sie verstehen, wie Resource Manager die Überprüfung durchführt.

    Hinweis

    Wenn vorhandene Ressourcenidentitäten mit Ressourcen übereinstimmen, die in einer Vorlage definiert sind, werden die Eigenschaften von Azure Resource Manager verglichen. Wenn die Eigenschaften genau übereinstimmen, wird die Ressource unverändert beibehalten. Wenn dies nicht der Fall ist, nimmt die Engine die Änderungen vor, und die Ressource wird möglicherweise erneut bereitgestellt.

  • Sie können Ressourcen in einer anderen Ressource schachteln.

    In ihren ARM-Vorlagen (Azure Resource Manager) können Sie Ressourcen in einer anderen Ressource schachteln. Durch die Schachtelung von Ressourcen definieren Sie eine Beziehung zwischen den geschachtelten Ressourcen und der übergeordneten Ressource.

Wie kann ich Abhängigkeiten zwischen Azure-Ressourcen definieren?

Angenommen, Sie möchten sicherstellen, dass eine Ressource (z. B. ein Speicherkonto) vor einer Ressource bereitgestellt wurde, die dieses benötigt. Wie können Sie überprüfen, ob das abhängige Speicherkonto vorhanden ist?

Sie können beginnen, indem Sie den aktuellen Status der Bereitstellung überprüfen, indem Sie Azure PowerShell oder Azure CLI-Befehle ausführen, um zu überprüfen, ob das Speicherkonto vorhanden ist. Sie können auch prüfen, ob ein Resource Manager-Konstrukt vorhanden ist, mit dem Sie die gleiche Überprüfung durchführen können.

Es gibt ein solches Konstrukt in Resource Manager-Vorlagen, das dependsOn heißt. Durch die Verwendung dieses Konstrukts warten Ressourcen so lange, bis die Bereitstellung der referenzierten Ressource abgeschlossen wurde.

Was ist das dependsOn-Konstrukt?

Es ist ein Schlüssel-Wert-Paar, das es Ihnen ermöglicht, die Bereitstellungsreihenfolge von Ressourcen zu definieren. Manchmal müssen Sie sicherstellen, dass eine Ressource vor einer anderen Ressource vorhanden ist. So kann es beispielsweise erforderlich sein, dass eine Datenbank vor einer Anwendung oder eine Geheimnisressource vor einem Schlüsseltresor vorhanden ist.

Legen Sie das dependsOn-Konstrukt für eine Ressource fest, die von anderen Ressourcen abhängt, die zuerst bereitgestellt werden müssen. Eine Ressource kann von mehreren Ressourcen abhängen, weshalb das Konstrukt eine Liste abhängiger Ressourcen als Wert erwartet.

Im Folgenden finden Sie ein Beispiel dafür, wie Sie eine derartige Abhängigkeit in JSON innerhalb ihrer ARM-Vorlage ausdrücken können:

"resources": [
  {
    "name": "<name of resource that needs to exist first>"
  },
  {
    "name": "someResource",
    "dependsOn": [
      "<name of resource that needs to exist first>"
    ]
  }
]

In diesem Beispiel verwenden Sie den Namen der Ressource, um anzugeben, von welcher Ressource Sie abhängig sind. Viele Ressourcen weisen jedoch möglicherweise denselben Namen auf. Um sicherzustellen, dass dieser Vergleich das leistet, was Sie möchten, können Sie stattdessen das resourceId()-Konstrukt verwenden, um den eindeutigen Ressourcenbezeichner abzurufen:

"dependsOn": [
  "resourceId('Microsoft.Network/loadBalancers', variables('nameOfLoadBalancer')))"
]

Mit dem oben gezeigten JSON-Code wird eine eindeutige ID generiert, indem der Namespace, der Typ und ein Variablenname kombiniert werden. Auf diese Weise stellen Sie sicher, dass die richtige abhängige Ressource angegeben wird.

Was sind untergeordnete Ressourcen?

Bei einer untergeordneten Ressource handelt es sich um eine Ressource, die nur im Kontext einer anderen Ressource vorhanden ist. Ein Beispiel dafür ist eine VM-Erweiterung, die nicht ohne einen virtuellen Computer vorhanden sein kann.

Typischer Code für eine Beziehung zwischen übergeordneten und untergeordneten Elementen in einer Vorlage sieht wie folgt aus:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "name": "child-resource"
    }]
  }
]

Diese Abhängigkeit aus übergeordneten und untergeordneten Elementen erzeugt nicht automatisch eine Abhängigkeit, in der das übergeordnete Element vor dem untergeordneten Element bereitgestellt wird. Sie müssen die Abhängigkeit explizit angeben.

Wenn Sie also eine solche Beziehung ausdrücken, stellen Sie sicher, dass Sie ein dependsOn-Konstrukt hinzufügen, wie im folgenden Beispiel gezeigt:

"resources": [
  {
    "name": "parent-resource",
    "resources": [{
      "dependsOn": ["parent-resource"],
      "name": "child resource"
    }]
  }
]