Implementaciones de suscripción con plantillas de Resource ManagerSubscription deployments with ARM templates

Para simplificar la administración de recursos, puede usar una plantilla de Azure Resource Manager (plantilla de ARM) para implementar recursos en el nivel de la suscripción de Azure.To simplify the management of resources, you can use an Azure Resource Manager template (ARM template) to deploy resources at the level of your Azure subscription. Por ejemplo, puede implementar directivas y el control de acceso basado en rol (RBAC de Azure) en su suscripción, y se aplicarán a ella en su totalidad.For example, you can deploy policies and Azure role-based access control (Azure RBAC) to your subscription, which applies them across your subscription. También puede crear grupos de recursos dentro de la suscripción e implementar recursos en grupos de recursos de la suscripción.You can also create resource groups within the subscription and deploy resources to resource groups in the subscription.

Nota

Puede implementar en 800 grupos de recursos distintos en una implementación de nivel de suscripción.You can deploy to 800 different resource groups in a subscription level deployment.

Para implementar plantillas en el nivel de suscripción, use la CLI de Azure, PowerShell, la API de REST o el portal.To deploy templates at the subscription level, use Azure CLI, PowerShell, REST API, or the portal.

Recursos compatiblesSupported resources

No todos los tipos de recursos se pueden implementar en el nivel de suscripción.Not all resource types can be deployed to the subscription level. En esta sección se enumeran los tipos de recursos que se admiten.This section lists which resource types are supported.

Para Azure Blueprints, use:For Azure Blueprints, use:

Para las directivas de Azure, use:For Azure Policies, use:

Para el control de acceso basado en rol de Azure (Azure RBAC), use:For Azure role-based access control (Azure RBAC), use:

Para plantillas anidadas que se implementan en grupos de recursos, use:For nested templates that deploy to resource groups, use:

Para crear grupos de recursos, use:For creating new resource groups, use:

Para administrar su suscripción, use:For managing your subscription, use:

Otros tipos admitidos incluyen:Other supported types include:

SchemaSchema

El esquema que se usa para las implementaciones de nivel de suscripción es diferente del esquema de las implementaciones de grupo de recursos.The schema you use for subscription-level deployments is different than the schema for resource group deployments.

Para las plantillas, use:For templates, use:

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    ...
}

El esquema de un archivo de parámetros es el mismo para todos los ámbitos de implementación.The schema for a parameter file is the same for all deployment scopes. Para los archivos de parámetros, use:For parameter files, use:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
    ...
}

Comandos de implementaciónDeployment commands

Para implementar en una suscripción, use los comandos de implementación de nivel de suscripción.To deploy to a subscription, use the subscription-level deployment commands.

Para la CLI de Azure, use az deployment sub create.For Azure CLI, use az deployment sub create. El ejemplo siguiente implementa una plantilla para crear un grupo de recursos:The following example deploys a template to create a resource group:

az deployment sub create \
  --name demoSubDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json" \
  --parameters rgName=demoResourceGroup rgLocation=centralus

Para obtener información más detallada sobre los comandos y las opciones de implementación para la implementación de plantillas de Resource Manager, vea:For more detailed information about deployment commands and options for deploying ARM templates, see:

Ubicación y nombre de la implementaciónDeployment location and name

En el caso de las implementaciones de nivel de suscripción, debe proporcionar una ubicación para la implementación.For subscription level deployments, you must provide a location for the deployment. La ubicación de la implementación es independiente de la ubicación de los recursos que se implementan.The location of the deployment is separate from the location of the resources you deploy. La ubicación de implementación especifica dónde se almacenarán los datos de la implementación.The deployment location specifies where to store deployment data. Las implementaciones de grupo de administración e inquilino también requieren una ubicación.Management group and tenant deployments also require a location. En las implementaciones de grupo de recursos, la ubicación del grupo de recursos se usa para almacenar los datos de implementación.For resource group deployments, the location of the resource group is used to store the deployment data.

Puede proporcionar un nombre para la implementación o usar el nombre de implementación predeterminado.You can provide a name for the deployment, or use the default deployment name. El nombre predeterminado es el nombre del archivo de plantilla.The default name is the name of the template file. Por ejemplo, al implementar una plantilla llamada azuredeploy.json, se crea un nombre de predeterminado azuredeploy.For example, deploying a template named azuredeploy.json creates a default deployment name of azuredeploy.

Para cada nombre de implementación, la ubicación es inmutable.For each deployment name, the location is immutable. No se puede crear una implementación en una ubicación si ya existe una implementación con el mismo nombre en otra ubicación.You can't create a deployment in one location when there's an existing deployment with the same name in a different location. Por ejemplo, si crea una implementación de suscripción con el nombre deployment1 en centralus, no podrá crear otra implementación con el nombre deployment1, sino una ubicación de westus.For example, if you create a subscription deployment with the name deployment1 in centralus, you can't later create another deployment with the name deployment1 but a location of westus. Si recibe el código de error InvalidDeploymentLocation, use un nombre diferente o utilice la ubicación de la implementación anterior que tenía ese mismo nombre.If you get the error code InvalidDeploymentLocation, either use a different name or the same location as the previous deployment for that name.

Ámbitos de implementaciónDeployment scopes

Al implementar en una suscripción, puede implementar los recursos en:When deploying to a subscription, you can deploy resources to:

  • la suscripción de destino de la operaciónthe target subscription from the operation
  • cualquier suscripción en el inquilinoany subscription in the tenant
  • grupos de recursos en la suscripción o en otrasresource groups within the subscription or other subscriptions
  • inquilino para la suscripciónthe tenant for the subscription
  • se pueden aplicar recursos de extensión a los recursosextension resources can be applied to resources

El usuario que implementa la plantilla debe tener acceso al ámbito especificado.The user deploying the template must have access to the specified scope.

En esta sección se muestra cómo especificar distintos ámbitos.This section shows how to specify different scopes. Puede combinar estos distintos ámbitos en una sola plantilla.You can combine these different scopes in a single template.

Ámbito de la suscripción de destinoScope to target subscription

Para implementar recursos en la suscripción de destino, agregue esos recursos a la sección de recursos de la plantilla.To deploy resources to the target subscription, add those resources to the resources section of the template.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        subscription-level-resources
    ],
    "outputs": {}
}

Para obtener ejemplos de cómo implementar en la suscripción, vea Creación de grupos de recursos y Asignación de definición de directiva.For examples of deploying to the subscription, see Create resource groups and Assign policy definition.

Ámbito de otra suscripciónScope to other subscription

Para implementar recursos en una suscripción diferente de la suscripción de la operación, agregue una implementación anidada.To deploy resources to a subscription that is different than the subscription from the operation, add a nested deployment. Establezca la propiedad subscriptionId en el id. de la suscripción en la que quiere realizar la implementación.Set the subscriptionId property to the ID of the subscription you want to deploy to. Establezca la propiedad location para la implementación anidada.Set the location property for the nested deployment.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-06-01",
            "name": "nestedDeployment",
            "subscriptionId": "00000000-0000-0000-0000-000000000000",
            "location": "westus",
            "properties": {
                "mode": "Incremental",
                "template": {
                    subscription-resources
                }
            }
        }
    ],
    "outputs": {}
}

Ámbito del grupo de recursosScope to resource group

Para implementar recursos en un grupo de recursos dentro de la suscripción, agregue una implementación anidada e incluya la propiedad resourceGroup.To deploy resources to a resource group within the subscription, add a nested deployment and include the resourceGroup property. En el ejemplo siguiente, la implementación anidada tiene como destino un grupo de recursos denominado demoResourceGroup.In the following example, the nested deployment targets a resource group named demoResourceGroup.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-06-01",
            "name": "nestedDeployment",
            "resourceGroup": "demoResourceGroup",
            "properties": {
                "mode": "Incremental",
                "template": {
                    resource-group-resources
                }
            }
        }
    ],
    "outputs": {}
}

Para obtener un ejemplo de cómo implementar en un grupo de recursos, vea Creación de un grupo de recursos y recursos.For an example of deploying to a resource group, see Create resource group and resources.

Ámbito del inquilinoScope to tenant

Puede crear recursos en el inquilino al establecer scope en /.You can create resources at the tenant by setting the scope set to /. El usuario que implementa la plantilla debe tener el acceso necesario para realizar implementaciones en el inquilino.The user deploying the template must have the required access to deploy at the tenant.

Puede usar una implementación anidada con los valores de scope y location establecidos.You can use a nested deployment with scope and location set.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2020-06-01",
            "name": "nestedDeployment",
            "location": "centralus",
            "scope": "/",
            "properties": {
                "mode": "Incremental",
                "template": {
                    tenant-resources
                }
            }
        }
    ],
    "outputs": {}
}

O bien, puede establecer el ámbito en / para algunos tipos de recursos, como los grupos de administración.Or, you can set the scope to / for some resource types, like management groups.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "mgName": {
            "type": "string",
            "defaultValue": "[concat('mg-', uniqueString(newGuid()))]"
        }
    },
    "resources": [
        {
            "type": "Microsoft.Management/managementGroups",
            "apiVersion": "2020-05-01",
            "name": "[parameters('mgName')]",
            "scope": "/",
            "location": "eastus",
            "properties": {}
        }
    ],
    "outputs": {
        "output": {
            "type": "string",
            "value": "[parameters('mgName')]"
        }
    }
}

Grupos de recursosResource groups

Crear grupos de recursosCreate resource groups

Para crear un grupo de recursos en una plantilla de ARM, defina un recurso Microsoft.Resources/resourceGroups con un nombre y una ubicación para el grupo de recursos.To create a resource group in an ARM template, define a Microsoft.Resources/resourceGroups resource with a name and location for the resource group.

En la plantilla siguiente se crea un grupo de recursos vacío.The following template creates an empty resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    }
  ],
  "outputs": {}
}

Use el elemento copy con grupos de recursos para crear más de un grupo de recursos.Use the copy element with resource groups to create more than one resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgNamePrefix": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "instanceCount": {
      "type": "int"
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "location": "[parameters('rgLocation')]",
      "name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
      "copy": {
        "name": "rgCopy",
        "count": "[parameters('instanceCount')]"
      },
      "properties": {}
    }
  ],
  "outputs": {}
}

Para más información sobre la iteración de recursos, consulte este artículo sobre la implementación de varias instancias de un recurso en las plantillas de Azure Resource Manager y Tutorial: Creación de varias instancias de recursos con plantillas de Resource Manager.For information about resource iteration, see Deploy more than one instance of a resource in Azure Resource Manager Templates, and Tutorial: Create multiple resource instances with Resource Manager templates.

Creación del grupo de recursos y los recursosCreate resource group and resources

Para crear el grupo de recursos e implementar recursos en él, utilice una plantilla anidada.To create the resource group and deploy resources to it, use a nested template. La plantilla anidada define los recursos que se van a implementar en el grupo de recursos.The nested template defines the resources to deploy to the resource group. Establezca la plantilla anidada como dependiente del grupo de recursos para asegurarse de que el grupo de recursos existe antes de implementar los recursos.Set the nested template as dependent on the resource group to make sure the resource group exists before deploying the resources. Puede implementar en hasta 800 grupos de recursos.You can deploy to up to 800 resource groups.

En el ejemplo siguiente se crea un grupo de recursos y se implementa una cuenta de almacenamiento en el grupo de recursos.The following example creates a resource group, and deploys a storage account to the resource group.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string"
    },
    "rgLocation": {
      "type": "string"
    },
    "storagePrefix": {
      "type": "string",
      "maxLength": 11
    }
  },
  "variables": {
    "storageName": "[concat(parameters('storagePrefix'), uniqueString(subscription().id, parameters('rgName')))]"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2020-06-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "storageDeployment",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-06-01",
              "name": "[variables('storageName')]",
              "location": "[parameters('rgLocation')]",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ],
          "outputs": {}
        }
      }
    }
  ],
  "outputs": {}
}

Azure PolicyAzure Policy

Asignación de una definición de directivaAssign policy definition

En el ejemplo siguiente se asigna una definición de directiva existente a la suscripción.The following example assigns an existing policy definition to the subscription. Si la definición de directiva toma parámetros, proporciónelos como un objeto.If the policy definition takes parameters, provide them as an object. Si la definición de directiva no toma parámetros, use el objeto vacío predeterminado.If the policy definition doesn't take parameters, use the default empty object.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "policyDefinitionID": {
      "type": "string"
    },
    "policyName": {
      "type": "string"
    },
    "policyParameters": {
      "type": "object",
      "defaultValue": {}
    }
  },
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2018-03-01",
      "name": "[parameters('policyName')]",
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[parameters('policyDefinitionID')]",
        "parameters": "[parameters('policyParameters')]"
      }
    }
  ]
}

Para implementar esta plantilla con la CLI de Azure, use:To deploy this template with Azure CLI, use:

# Built-in policy definition that accepts parameters
definition=$(az policy definition list --query "[?displayName=='Allowed locations'].id" --output tsv)

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" \
  --parameters policyDefinitionID=$definition policyName=setLocation policyParameters="{'listOfAllowedLocations': {'value': ['westus']} }"

Para implementar esta plantilla con PowerShell, use:To deploy this template with PowerShell, use:

$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Allowed locations' }

$locations = @("westus", "westus2")
$policyParams =@{listOfAllowedLocations = @{ value = $locations}}

New-AzSubscriptionDeployment `
  -Name policyassign `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policyassign.json" `
  -policyDefinitionID $definition.PolicyDefinitionId `
  -policyName setLocation `
  -policyParameters $policyParams

Creación y asignación de definiciones de directivaCreate and assign policy definitions

Puede definir y asignar una definición de directiva en la misma plantilla.You can define and assign a policy definition in the same template.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Authorization/policyDefinitions",
      "apiVersion": "2018-05-01",
      "name": "locationpolicy",
      "properties": {
        "policyType": "Custom",
        "parameters": {},
        "policyRule": {
          "if": {
            "field": "location",
            "equals": "northeurope"
          },
          "then": {
            "effect": "deny"
          }
        }
      }
    },
    {
      "type": "Microsoft.Authorization/policyAssignments",
      "apiVersion": "2018-05-01",
      "name": "location-lock",
      "dependsOn": [
        "locationpolicy"
      ],
      "properties": {
        "scope": "[subscription().id]",
        "policyDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
      }
    }
  ]
}

Para crear la definición de directiva en su suscripción y asignarla a la suscripción, use el siguiente comando de la CLI:To create the policy definition in your subscription, and assign it to the subscription, use the following CLI command:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Para implementar esta plantilla con PowerShell, use:To deploy this template with PowerShell, use:

New-AzSubscriptionDeployment `
  -Name definePolicy `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/policydefineandassign.json"

Azure BlueprintAzure Blueprints

Creación de una definición de plano técnicoCreate blueprint definition

Puede crear una definición de plano técnico a partir de una plantilla.You can create a blueprint definition from a template.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "blueprintName": {
      "defaultValue": "sample-blueprint",
      "type": "String",
      "metadata": {
        "description": "The name of the blueprint definition."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Blueprint/blueprints",
      "apiVersion": "2018-11-01-preview",
      "name": "[parameters('blueprintName')]",
      "properties": {
        "targetScope": "subscription",
        "description": "Blueprint with a policy assignment artifact.",
        "resourceGroups": {
          "sampleRg": {
            "description": "Resource group to add the assignment to."
          }
        },
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "type": "array",
            "metadata": {
              "displayName": "Resource types to pass to the policy assignment artifact."
            },
            "defaultValue": [
              "Citrix.Cloud/accounts"
            ]
          }
        }
      }
    },
    {
      "type": "Microsoft.Blueprint/blueprints/artifacts",
      "apiVersion": "2018-11-01-preview",
      "name": "[concat(parameters('blueprintName'), '/policyArtifact')]",
      "kind": "policyAssignment",
      "dependsOn": [
        "[parameters('blueprintName')]"
      ],
      "properties": {
        "displayName": "Blocked Resource Types policy definition",
        "description": "Block certain resource types",
        "policyDefinitionId": "[tenantResourceId('Microsoft.Authorization/policyDefinitions', '6c112d4e-5bc7-47ae-a041-ea2d9dccd749')]",
        "resourceGroup": "sampleRg",
        "parameters": {
          "listOfResourceTypesNotAllowed": {
            "value": "[[parameters('listOfResourceTypesNotAllowed')]"
          }
        }
      }
    }
  ]
}

Para crear la definición de plano técnico en su suscripción, use el siguiente comando de la CLI:To create the blueprint definition in your subscription, use the following CLI command:

az deployment sub create \
  --name demoDeployment \
  --location centralus \
  --template-uri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

Para implementar esta plantilla con PowerShell, use:To deploy this template with PowerShell, use:

New-AzSubscriptionDeployment `
  -Name demoDeployment `
  -Location centralus `
  -TemplateUri "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/subscription-deployments/blueprints-new-blueprint/azuredeploy.json"

Control de accesoAccess control

Para más información sobre la asignación de roles, consulte Incorporación de asignaciones de roles mediante plantillas de Azure Resource Manager.To learn about assigning roles, see Add Azure role assignments using Azure Resource Manager templates.

En el ejemplo siguiente, se crea un grupo de recursos, se le aplica un bloqueo y se asigna un rol a una entidad de seguridad.The following example creates a resource group, applies a lock to it, and assigns a role to a principal.

{
  "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "rgName": {
      "type": "string",
      "metadata": {
        "description": "Name of the resourceGroup to create"
      }
    },
    "rgLocation": {
      "type": "string",
      "metadata": {
        "description": "Location for the resourceGroup"
      }
    },
    "principalId": {
      "type": "string",
      "metadata": {
        "description": "principalId of the user that will be given contributor access to the resourceGroup"
      }
    },
    "roleDefinitionId": {
      "type": "string",
      "defaultValue": "b24988ac-6180-42a0-ab88-20f7382dd24c",
      "metadata": {
        "description": "roleDefinition to apply to the resourceGroup - default is contributor"
      }
    },
    "roleAssignmentName": {
      "type": "string",
      "defaultValue": "[guid(parameters('principalId'), parameters('roleDefinitionId'), parameters('rgName'))]",
      "metadata": {
        "description": "Unique name for the roleAssignment in the format of a guid"
      }
    }
  },
  "variables": { },
  "resources": [
    {
      "type": "Microsoft.Resources/resourceGroups",
      "apiVersion": "2019-10-01",
      "name": "[parameters('rgName')]",
      "location": "[parameters('rgLocation')]",
      "tags": {
        "Note": "subscription level deployment"
      },
      "properties": {}
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-10-01",
      "name": "applyLock",
      "resourceGroup": "[parameters('rgName')]",
      "dependsOn": [
        "[parameters('rgName')]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "resources": [
            {
              "type": "Microsoft.Authorization/locks",
              "apiVersion": "2017-04-01",
              "name": "DontDelete",
              "properties": {
                "level": "CanNotDelete",
                "notes": "Prevent deletion of the resourceGroup"
              }
            },
            {
              "type": "Microsoft.Authorization/roleAssignments",
              "apiVersion": "2020-04-01-preview",
              "name": "[guid(parameters('roleAssignmentName'))]",
              "properties": {
                "roleDefinitionId": "[subscriptionResourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
                "principalId": "[parameters('principalId')]",
                "scope": "[subscriptionResourceId('Microsoft.Resources/resourceGroups', parameters('rgName'))]"
              }
            }
          ]
        }
      }
    }
  ]
}

Pasos siguientesNext steps