Definiowanie kolejności wdrażania zasobów w szablonach usługi ARM

Podczas wdrażania zasobów może być konieczne upewnienie się, że niektóre zasoby istnieją przed innymi zasobami. Na przykład przed wdrożeniem bazy danych SQL serwera logicznego. Tę relację można ustanowić, oznaczając jeden zasób jako zależny od drugiego zasobu. Użyj elementu dependsOn , aby zdefiniować jawną zależność. Użyj funkcji odwołania lub listy, aby zdefiniować niejawną zależność.

Azure Resource Manager ocenia zależności między zasobami i wdraża je w kolejności zależnej. Gdy zasoby nie zależą od siebie nawzajem, usługa Resource Manager wdraża je równolegle. Wystarczy zdefiniować zależności dla zasobów wdrożonych w tym samym szablonie.

dependsOn

W szablonie Azure Resource Manager arm element umożliwia zdefiniowanie jednego zasobu jako zasobu zależnego od dependsOn co najmniej jednego zasobu. Jego wartość to JavaScript Object Notation (JSON) ciągów, z których każdy jest nazwą zasobu lub identyfikatorem. Tablica może zawierać zasoby, które są wdrażane warunkowo. Jeśli zasób warunkowy nie zostanie wdrożony, Azure Resource Manager automatycznie usunie go z wymaganych zależności.

W poniższym przykładzie pokazano interfejs sieciowy, który zależy od sieci wirtualnej, sieciowej grupy zabezpieczeń i publicznego adresu IP. Aby uzyskać pełny szablon, zobacz szablon szybkiego startu dla maszyny wirtualnej z systemem Linux.

{
    "type": "Microsoft.Network/networkInterfaces",
    "apiVersion": "2020-06-01",
    "name": "[variables('networkInterfaceName')]",
    "location": "[parameters('location')]",
    "dependsOn": [
      "[resourceId('Microsoft.Network/networkSecurityGroups/', parameters('networkSecurityGroupName'))]",
      "[resourceId('Microsoft.Network/virtualNetworks/', parameters('virtualNetworkName'))]",
      "[resourceId('Microsoft.Network/publicIpAddresses/', variables('publicIpAddressName'))]"
    ],
    ...
}

Chociaż być może chcesz używać funkcji do mapowania relacji między zasobami, ważne jest, aby zrozumieć, dependsOn dlaczego to robisz. Na przykład dokument, w jaki sposób zasoby są ze sobą połączone, nie dependsOn jest odpowiednim podejściem. Nie można utworzyć zapytania o zasoby, które zostały zdefiniowane w dependsOn elemencie po wdrożeniu. Ustawienie niepotrzebnych zależności spowalnia wdrażanie, Resource Manager nie może wdrażać tych zasobów równolegle.

Zasoby podrzędne

Niejawna zależność wdrażania nie jest tworzona automatycznie między zasobem podrzędnym a zasobem nadrzędnym. Jeśli musisz wdrożyć zasób podrzędny po zasobie nadrzędnym, ustaw dependsOn właściwość .

W poniższym przykładzie pokazano serwer logiczny SQL bazę danych. Należy zauważyć, że między bazą danych a serwerem jest definiowana jawna zależność, mimo że baza danych jest elementem podrzędnym serwera.

"resources": [
  {
    "type": "Microsoft.Sql/servers",
    "apiVersion": "2020-02-02-preview",
    "name": "[parameters('serverName')]",
    "location": "[parameters('location')]",
    "properties": {
      "administratorLogin": "[parameters('administratorLogin')]",
      "administratorLoginPassword": "[parameters('administratorLoginPassword')]"
    },
    "resources": [
      {
        "type": "databases",
        "apiVersion": "2020-08-01-preview",
        "name": "[parameters('sqlDBName')]",
        "location": "[parameters('location')]",
        "sku": {
          "name": "Standard",
          "tier": "Standard"
          },
        "dependsOn": [
          "[resourceId('Microsoft.Sql/servers', concat(parameters('serverName')))]"
        ]
      }
    ]
  }
]

Aby uzyskać pełny szablon, zobacz szablon szybkiego startu dla Azure SQL Database.

funkcje odwołania i listy

Funkcja referencyjna umożliwia wyrażeniu wyprowadzenie jego wartości z innych par nazw i wartości JSON lub zasobów środowiska uruchomieniowego. Funkcje list* zwracają wartości zasobu z operacji listy.

Wyrażenia odwołania i listy niejawnie deklarują, że jeden zasób zależy od innego. Jeśli to możliwe, użyj niejawnego odwołania, aby uniknąć dodawania niepotrzebnej zależności.

Aby wymusić niejawną zależność, odwołaj się do zasobu według nazwy, a nie identyfikatora zasobu. Jeśli przekażemy identyfikator zasobu do funkcji odwołania lub listy, niejawne odwołanie nie zostanie utworzone.

Ogólny format funkcji reference jest:

reference('resourceName').propertyPath

Ogólny format funkcji listKeys jest:

listKeys('resourceName', 'yyyy-mm-dd')

W poniższym przykładzie punkt końcowy CDN zależy jawnie od profilu CDN i niejawnie zależy od aplikacji internetowej.

{
    "name": "[variables('endpointName')]",
    "apiVersion": "2016-04-02",
    "type": "endpoints",
    "location": "[resourceGroup().location]",
    "dependsOn": [
      "[variables('profileName')]"
    ],
    "properties": {
      "originHostHeader": "[reference(variables('webAppName')).hostNames[0]]",
      ...
    }

Aby dowiedzieć się więcej, zobacz funkcję referencyjną.

Poleganie na zasobach w pętli

Aby wdrożyć zasoby zależne od zasobów w pętli kopiowania,dostępne są dwie opcje. Możesz ustawić zależność od poszczególnych zasobów w pętli lub w całej pętli.

Uwaga

W większości scenariuszy należy ustawić zależność od poszczególnych zasobów w pętli kopiowania. Od całej pętli należy zależeć tylko wtedy, gdy wszystkie zasoby w pętli muszą istnieć przed utworzeniem następnego zasobu. Ustawienie zależności od całej pętli powoduje znaczne rozszerzenie grafu zależności, zwłaszcza jeśli te zasoby w pętli zależą od innych zasobów. Rozwinięte zależności utrudniają wydajne ukończenie wdrożenia.

W poniższym przykładzie pokazano, jak wdrożyć wiele maszyn wirtualnych. Szablon tworzy taką samą liczbę interfejsów sieciowych. Każda maszyna wirtualna jest zależna od jednego interfejsu sieciowego, a nie całej pętli.

{
  "type": "Microsoft.Network/networkInterfaces",
  "apiVersion": "2020-05-01",
  "name": "[concat(variables('nicPrefix'),'-',copyIndex())]",
  "location": "[parameters('location')]",
  "copy": {
    "name": "nicCopy",
    "count": "[parameters('vmCount')]"
  },
  ...
},
{
  "type": "Microsoft.Compute/virtualMachines",
  "apiVersion": "2020-06-01",
  "name": "[concat(variables('vmPrefix'),copyIndex())]",
  "location": "[parameters('location')]",
  "dependsOn": [
    "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]"
  ],
  "copy": {
    "name": "vmCopy",
    "count": "[parameters('vmCount')]"
  },
  "properties": {
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "[resourceId('Microsoft.Network/networkInterfaces',concat(variables('nicPrefix'),'-',copyIndex()))]",
          "properties": {
            "primary": "true"
          }
        }
      ]
    },
    ...
  }
}

W poniższym przykładzie pokazano, jak wdrożyć trzy konta magazynu przed wdrożeniem maszyny wirtualnej. Zauważ, że element został ustawiony na , a copy name element dla maszyny storagecopy dependsOn wirtualnej jest również ustawiony na storagecopy wartość .

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(copyIndex(),'storage', uniqueString(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "Storage",
      "copy": {
        "name": "storagecopy",
        "count": 3
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Compute/virtualMachines",
      "apiVersion": "2015-06-15",
      "name": "[concat('VM', uniqueString(resourceGroup().id))]",
      "dependsOn": ["storagecopy"],
      ...
    }
  ],
  "outputs": {}
}

Zależności cykliczne

Resource Manager identyfikuje zależności cykliczne podczas walidacji szablonu. Jeśli wystąpi błąd zależności cyklicznej, oceń szablon, aby sprawdzić, czy można usunąć jakiekolwiek zależności. Jeśli usuwanie zależności nie działa, można uniknąć zależności cyklicznych, przenosząc niektóre operacje wdrażania do zasobów podrzędnych. Wd wdrażaj zasoby podrzędne po zasobach, które mają zależność cykliczną. Załóżmy na przykład, że wdrażasz dwie maszyny wirtualne, ale musisz ustawić właściwości dla każdej z nich, które odwołują się do drugiej. Można je wdrożyć w następującej kolejności:

  1. vm1
  2. maszyna wirtualna vm2
  3. Rozszerzenie na maszynie vm1 zależy od maszyn wirtualnych vm1 i vm2. Rozszerzenie ustawia wartości na maszynie wirtualnej vm1, które pobiera z maszyny wirtualnej vm2.
  4. Rozszerzenie na maszynie wirtualnej vm2 zależy od maszyn wirtualnych vm1 i vm2. Rozszerzenie ustawia wartości na maszynie wirtualnej vm2, które pobiera z maszyny vm1.

Aby uzyskać informacje na temat oceny kolejności wdrażania i rozwiązywania błędów zależności, zobacz Troubleshoot common Azure deployment errors with Azure Resource Manager (Rozwiązywanie typowych błędów wdrażania platformy Azure za pomocą Azure Resource Manager).

Następne kroki