Definición del orden de implementación de recursos en las plantillas de ARMDefine the order for deploying resources in ARM templates

Al implementar recursos, es posible que tenga que asegurarse de que existen algunos recursos antes de crear otros.When deploying resources, you may need to make sure some resources exist before other resources. Por ejemplo, necesitará un servidor SQL lógico para poder implementar una base de datos.For example, you need a logical SQL server before deploying a database. Establezca esta relación marcando un recurso como dependiente de otro recurso.You establish this relationship by marking one resource as dependent on the other resource. Use el elemento dependsOn para definir una dependencia explícita.Use the dependsOn element to define an explicit dependency. Utilice las funciones reference o list para definir una dependencia implícita.Use the reference or list functions to define an implicit dependency.

Azure Resource Manager evalúa las dependencias entre recursos y los implementa en su orden dependiente.Azure Resource Manager evaluates the dependencies between resources, and deploys them in their dependent order. Cuando no hay recursos dependientes entre sí, Resource Manager los implementa en paralelo.When resources aren't dependent on each other, Resource Manager deploys them in parallel. Solo tiene que definir las dependencias de recursos que se implementan en la misma plantilla.You only need to define dependencies for resources that are deployed in the same template.

dependsOndependsOn

Dentro de la plantilla de Azure Resource Manager, el elemento dependsOn permite definir un recurso como dependiente de uno o más recursos.Within your Azure Resource Manager template (ARM template), the dependsOn element enables you to define one resource as a dependent on one or more resources. Su valor es una matriz de cadenas de notación de objetos JavaScript (JSON), cada una de las cuales es un nombre o identificador de recurso.Its value is a JavaScript Object Notation (JSON) array of strings, each of which is a resource name or ID. La lista puede incluir recursos que se implementan condicionalmente.The array can include resources that are conditionally deployed. Cuando un recurso condicional no está implementado, Azure Resource Manager lo quita automáticamente de las dependencias necesarias.When a conditional resource isn't deployed, Azure Resource Manager automatically removes it from the required dependencies.

En el ejemplo siguiente se muestra una interfaz de red que depende de una red virtual, un grupo de seguridad de red y una dirección IP pública.The following example shows a network interface that depends on a virtual network, network security group, and public IP address. Para ver la plantilla completa, consulte la plantilla de inicio rápido de una máquina virtual Linux.For the full template, see the quickstart template for a Linux VM.

{
    "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'))]"
    ],
    ...
}

Si bien puede que se sienta tentado a usar dependsOn para asignar relaciones entre los recursos, es importante comprender por qué lo hace.While you may be inclined to use dependsOn to map relationships between your resources, it's important to understand why you're doing it. Por ejemplo, para documentar cómo están interconectados los recursos, dependsOn no es el enfoque correcto.For example, to document how resources are interconnected, dependsOn isn't the right approach. Después de realizar la implementación, no se pueden consultar los recursos que se definieron en el elemento dependsOn.You can't query which resources were defined in the dependsOn element after deployment. La configuración de dependencias innecesarias reduce el tiempo de implementación porque Resource Manager no puede implementar esos recursos en paralelo.Setting unnecessary dependencies slows deployment time because Resource Manager can't deploy those resources in parallel.

Recursos secundariosChild resources

Una dependencia de implementación implícita no se crea automáticamente entre un recurso secundario y el primario.An implicit deployment dependency isn't automatically created between a child resource and the parent resource. Si necesita implementar el recurso secundario después del primario, establezca la propiedad dependsOn.If you need to deploy the child resource after the parent resource, set the dependsOn property.

En el siguiente ejemplo se muestran un servidor SQL lógico y una base de datos.The following example shows a logical SQL server and database. Observe que se ha definido una dependencia explícita entre la base de datos y el servidor, a pesar de que la base de datos es un elemento secundario del servidor.Notice that an explicit dependency is defined between the database and the server, even though the database is a child of the server.

"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')))]"
        ]
      }
    ]
  }
]

Para ver la plantilla completa, consulte la plantilla de inicio rápido para Azure SQL Database.For the full template, see quickstart template for Azure SQL Database.

Funciones de referencia y listareference and list functions

La función reference permite que una expresión derive su valor de otros pares de valor y nombre JSON o de recursos en tiempo de ejecución.The reference function enables an expression to derive its value from other JSON name and value pairs or runtime resources. Las funciones list* devuelven valores para un recurso de una operación de lista.The list* functions return values for a resource from a list operation.

Las expresiones de referencia y lista declaran implícitamente que un recurso depende de otro.Reference and list expressions implicitly declare that one resource depends on another. Siempre que sea posible, use una referencia implícita para evitar agregar una dependencia innecesaria.Whenever possible, use an implicit reference to avoid adding an unnecessary dependency.

Para aplicar una dependencia implícita, haga referencia al recurso por su nombre, y no por el identificador de recurso.To enforce an implicit dependency, refer to the resource by name, not resource ID. Si se pasa el identificador de recurso a las funciones de referencia o lista, no se crea una referencia implícita.If you pass the resource ID into the reference or list functions, an implicit reference isn't created.

El formato general de la función reference es:The general format of the reference function is:

reference('resourceName').propertyPath

El formato general de la función listKeys es:The general format of the listKeys function is:

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

En el ejemplo siguiente, un punto de conexión de CDN depende explícitamente del perfil de CDN e implícitamente de una aplicación web.In the following example, a CDN endpoint explicitly depends on the CDN profile, and implicitly depends on a web app.

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

Para más información, consulte función reference.To learn more, see reference function.

Dependencia de los recursos de un bucleDepend on resources in a loop

Para implementar recursos que dependen de recursos en un bucle de copia, tiene dos opciones.To deploy resources that depend on resources in a copy loop, you have two options. Puede establecer una dependencia de recursos individuales dentro del bucle o de todo el bucle.You can either set a dependency on individual resources in the loop or on the whole loop.

Nota

En la mayoría de los escenarios, debe establecer la dependencia de recursos específicos dentro del bucle de copia.For most scenarios, you should set the dependency on individual resources within the copy loop. Dependa solo del bucle entero cuando necesite que todos los recursos del bucle existan antes de crear el recurso siguiente.Only depend on the whole loop when you need all of the resources in the loop to exist before creating the next resource. Al establecer la dependencia de todo el bucle, el grafo de dependencias se expande de forma significativa, especialmente si esos recursos del bucle dependen de otros recursos.Setting the dependency on the whole loop causes the dependencies graph to expand significantly, especially if those looped resources depend on other resources. Las dependencias expandidas dificultan que la implementación se complete de forma eficaz.The expanded dependencies make it difficult for the deployment to complete efficiently.

En el ejemplo siguiente se muestra cómo implementar varias máquinas virtuales.The following example shows how to deploy multiple virtual machines. La plantilla crea el mismo número de interfaces de red.The template creates the same number of network interfaces. Cada máquina virtual depende de una interfaz de red, en lugar de todo el bucle.Each virtual machine is dependent on one network interface, rather than the whole loop.

{
  "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"
          }
        }
      ]
    },
    ...
  }
}

En el ejemplo siguiente, se muestra cómo se implementan tres cuentas de almacenamiento antes de implementar la máquina virtual.The following example shows how to deploy three storage accounts before deploying the virtual machine. Observe que el elemento copy tiene name establecido en storagecopy y el elemento dependsOn de la máquina virtual también está establecido en storagecopy.Notice that the copy element has name set to storagecopy and the dependsOn element for the virtual machine is also set to storagecopy.

{
  "$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": {}
}

Dependencias circularesCircular dependencies

Resource Manager identifica dependencias circulares durante la validación de plantillas.Resource Manager identifies circular dependencies during template validation. Si recibe un error en una dependencia circular, evalúe la plantilla para ver si se puede quitar alguna dependencia.If you receive an error for a circular dependency, evaluate your template to see if any dependencies can be removed. Si no es suficiente con quitar dependencias, puede evitar dependencias circulares moviendo algunas operaciones de implementación a recursos secundarios.If removing dependencies doesn't work, you can avoid circular dependencies by moving some deployment operations into child resources. Implemente los recursos secundarios después de los recursos que tienen la dependencia circular.Deploy the child resources after the resources that have the circular dependency. Por ejemplo, suponga que va a implementar dos máquinas virtuales pero debe establecer propiedades en cada una que hagan referencia a la otra.For example, suppose you're deploying two virtual machines but you must set properties on each one that refer to the other. Puede implementarlas en el orden siguiente:You can deploy them in the following order:

  1. vm1vm1
  2. vm2vm2
  3. La extensión en vm1 depende de vm1 y vm2.Extension on vm1 depends on vm1 and vm2. La extensión establece valores en vm1 que obtiene de vm2.The extension sets values on vm1 that it gets from vm2.
  4. La extensión en vm2 depende de vm1 y vm2.Extension on vm2 depends on vm1 and vm2. La extensión establece valores en vm2 que obtiene de vm1.The extension sets values on vm2 that it gets from vm1.

Para información sobre cómo evaluar el orden de implementación y resolver errores de dependencia, consulte Solución de errores comunes de implementación de Azure con Azure Resource Manager.For information about assessing the deployment order and resolving dependency errors, see Troubleshoot common Azure deployment errors with Azure Resource Manager.

Pasos siguientesNext steps