Kontrolowanie kolejności wdrażania przez określanie zależności

Ukończone

Załóżmy, że chcesz wdrożyć zestaw zasobów na platformie Azure, ale tylko wtedy, gdy inny zasób został już wdrożony. W tym momencie musisz podać w szablonie informację o tym, że jeden zasób zależy od innego zasobu.

Oto kilka aspektów, które warto wziąć pod uwagę:

  • Coś musi istnieć, zanim będzie można wdrożyć cos innego.

    Załóżmy na przykład, że potrzebujesz magazynu kluczy w usłudze Azure Key Vault do pobrania wpisów tajnych, które chcesz załadować na maszynie wirtualnej. Podczas wdrażania magazynu kluczy możesz w tym samym czasie wdrożyć wpis tajny w ramach tego samego szablonu. Musisz jednak wdrożyć magazyn kluczy przed jego wpisem tajnym. W związku z tym istnienie wpisu tajnego zależy od danego magazynu kluczy. Magazyn kluczy i wpis tajny są wdrażane szeregowo, jeden element po drugim, zaczynając od magazynu kluczy ze względu na tę zależność.

  • Czy mogę polegać na tym, jak działają elementy usługi Azure Resource Manager?

    Twoją pierwszą myślą podczas sprawdzania, czy inny zasób istnieje, może być użycie programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. Bardziej zautomatyzowane rozwiązanie używa wbudowanej idempotentności usługi Resource Manager. Jeśli usługa Resource Manager wykryje dodatkowy zasób zdefiniowany w szablonie, który już istnieje w chmurze, nie będzie go ponownie wdrażać. Aby to było prawidłowe podejście, musisz zrozumieć, jak usługa Resource Manager przeprowadza sprawdzanie.

    Uwaga

    Gdy istniejące tożsamości zasobów są zgodne z elementem zdefiniowanym w szablonie, usługa Azure Resource Manager porównuje właściwości. Jeśli właściwości są dokładnie zgodne, zasób jest pozostawiany bez zmian. W przeciwnym razie aparat wprowadza zmiany, prawdopodobnie ponownie wdrażając zasób.

  • Zasoby można zagnieżdżać w ramach innego zasobu.

    W szablonach usługi Azure Resource Manager można zagnieżdżać zasoby w ramach innego zasobu. Zagnieżdżanie zasobów umożliwia zdefiniowanie relacji między zagnieżdżonymi zasobami i zasobem nadrzędnym.

Jak mogę definiować zależności między zasobami platformy Azure?

Załóżmy, że chcesz upewnić się, że zasób (na przykład konto magazynu) został wdrożony przed zasobem, który go wymaga. Jak możesz sprawdzić, czy zależne konto magazynu istnieje?

Aby zweryfikować istnienie konta magazynu, możesz zacząć od sprawdzenia bieżącego stanu wdrożenia przez uruchomienie poleceń programu Azure PowerShell lub interfejsu wiersza polecenia platformy Azure. Możesz również sprawdzić, czy istnieje konstrukcja usługi Resource Manager, która umożliwia przeprowadzenie tego samego sprawdzenia.

Taka konstrukcja istnieje w szablonach usługi Resource Manager. Nosi ona nazwę dependsOn. Użycie tej konstrukcji powoduje, że zasoby czekają na zakończenie wdrażania wskazanego zasobu.

Co to jest konstrukcja dependsOn?

To para klucz-wartość, która umożliwia definiowanie kolejności wdrażania między zasobami. Czasami trzeba upewnić się, że pewien element będzie istnieć przed innym. Na przykład może być potrzebna baza danych, która istnieje przed aplikacją, lub zasób wpisu tajnego, który istnieje przed magazynem kluczy.

Dobrym pomysłem jest umieszczenie konstrukcji dependsOn w obrębie zasobu, który jest zależny od wcześniejszego wdrożenia innych zasobów. Zasób może zależeć od więcej niż jednego zasobu, dlatego konstrukcja oczekuje listy zasobów zależnych jako wartości.

Poniższy przykład przedstawia sposób wyrażenia takiej zależność w kodzie JSON w ramach szablonu usługi ARM:

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

W tym przykładzie używasz nazwy zasobu do określenia zasobu, od którego zależysz. Jednak wiele zasobów może mieć taką samą nazwę. Aby upewnić się, że porównanie będzie działać w wymagany sposób, można użyć konstrukcji resourceId() w celu uzyskania unikatowego identyfikatora zasobu:

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

Powyższy kod JSON tworzy unikatowy identyfikator, łącząc przestrzeń nazw, typ i nazwę zmiennej. W ten sposób zapewniasz, że został określony prawidłowy zasób zależny.

Co to są zasoby podrzędne?

Zasób podrzędny to zasób, który istnieje tylko w kontekście innego zasobu. Przykładem jest rozszerzenie maszyny wirtualnej, które nie może istnieć bez maszyny wirtualnej.

Typowy kod dla relacji elementu nadrzędnego i podrzędnego w szablonie wygląda następująco:

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

Ta zależność elementu nadrzędnego i podrzędnego nie tworzy automatycznie zależności, w której element nadrzędny jest wdrażany przed elementem podrzędnym. Należy jawnie utworzyć taką zależność.

Dlatego, gdy wyrażasz taką relację, pamiętaj, aby dodać konstrukcję podobną dependsOn do następującej:

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