Styra distributionsordningen genom att ange beroenden

Slutförd

Anta att du vill distribuera en uppsättning resurser till Azure, men bara om en annan resurs redan har distribuerats. Då måste du ange att en resurs är beroende av en annan resurs i mallen.

Här är några saker att tänka på:

  • Något måste finnas innan någonting annat kan distribueras.

    Anta till exempel att du behöver ett nyckelvalv i Azure Key Vault för att kunna hämta hemligheter som du behöver läsa in på en virtuell dator (VM). När du distribuerar Key Vault kan du distribuera hemligheten samtidigt i samma mall. Key Vault måste dock vara distribuerat innan hemligheten. Det innebär att hemligheten är beroende av att nyckelvalvet finns. Nyckelvalvet och hemligheten distribueras i serie efter varandra, och du börjar med nyckelvalvet på grund av beroendet.

  • Kan jag använda mig av hur saker fungerar i Azure Resource Manager?

    Din första tanke kring att kontrollera om en annan resurs finns kanske är att söka efter den med Azure PowerShell eller Azure CLI. En mer automatiserad lösning kan vara att använda idempotensen i Resource Manager. Om Resource Manager inte distribuerar om resurser som identifieras i en mall om resursen redan finns i molnet. För att det här ska fungera måste du förstå hur Resource Manager utför kontrollen.

    Kommentar

    När befintliga resursidentiteter matchar något som definierats i en mall jämför Azure Resource Manager egenskaperna. Om egenskaperna matchar exakt distribueras inte resursen på nytt. Om de inte gör det utför motorn ändringarna och distribuerar eventuellt om resursen.

  • Du kan kapsla resurser inuti andra resurser.

    Du kan kapsla resurser inuti andra resurser i dina Azure Resource Manager-mallar. Genom att kapsla resurser definierar du en relation mellan de kapslade resurserna och den överordnade resursen.

Hur kan jag definiera beroenden mellan Azure-resurser?

Tänk dig att du vill se till att en resurs (till exempel ett lagringskonto) har distribuerats innan en annan resurs som behöver använda kontot. Hur kan du kontrollera om lagringskontot finns?

Du kan börja med att kontrollera distributionens aktuella tillstånd genom att köra Azure PowerShell- eller Azure CLI-kommandon som kontrollerar om lagringskontot finns. Du kan också undersöka om det finns en Resource Manager-konstruktion som kan utföra samma kontroll.

Det finns en sådan konstruktion i Resource Manager-mallar som kallas dependsOn. När du använder den konstruktionen väntar resursen tills distributionen av den utpekade resursen är färdig.

Vad är konstruktionen dependsOn?

Det är ett nyckel/värde-par som du kan använda till att definiera distributionsordningen mellan resurser. Ibland behöver du se till att någonting finns innan något annat. Du kan till exempel behöva att en databas ska finnas före en app, eller att en hemlig resurs ska finnas före ett nyckelvalv.

Använd konstruktionen dependsOn för en resurs som är beroende av att andra resurser har distribuerats först. En resurs kan vara beroende av fler än en resurs, och därför förväntar sig konstruktionen en lista med överordnade resurser som värde.

Följande exempel visar hur du kan uttrycka ett sådant beroende i JSON i ARM-mallen:

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

I det här exemplet använder du namnet på resursen till att ange vilken resurs du är beroende av. Många resurser kan dock ha samma namn. För att se till att jämförelsen fungerar som det är tänkt kan du använda konstruktionen resourceId() till att hämta det unika resurs-ID:t:

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

Ovanstående JSON-kod konstruerar ett unikt ID genom att kombinera namnrymden, typen och ett variabelnamn. På så sätt ser du till att ange rätt överordnad resurs.

Vad är underordnade resurser?

En underordnad resurs är en resurs som bara existerar inom kontexten för en annan resurs. Ett exempel är tillägg för virtuella datorer, som inte kan finnas utan en virtuell dator.

En kod för en överordnad/underordnad-relation i en mall kan se ut så här:

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

Det här överordnad/underordnad-beroende skapar inte automatiskt ett beroende där det överordnade objektet distribueras innan det underordnade. Du måste uttrycka beroendet explicit.

Så när du uttrycker en sådan relation måste du lägga till en dependsOn konstruktion, som följande:

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