Создание групп ресурсов и ресурсов на уровне подпискиCreate resource groups and resources at the subscription level

Как правило, вы развертываете ресурсы Azure в группу ресурсов в подписке Azure.Typically, you deploy Azure resources to a resource group in your Azure subscription. Но можете также создавать группы ресурсов Azure и создавать ресурсы Azure на уровне подписки.However, you can also create Azure resource groups, and create Azure resources at the subscription level. Чтобы развернуть шаблоны на уровне подписки, используйте Azure CLI и Azure PowerShell.To deploy templates at the subscription level, you use Azure CLI and Azure PowerShell. Портал Azure не поддерживает развертывания на уровне подписки.The Azure portal doesn't support deployment in the subscription level.

Чтобы создать группу ресурсов в шаблоне Azure Resource Manager, определите имя и расположение ресурса Microsoft.Resources/resourceGroups для группы ресурсов.To create a resource group in an Azure Resource Manager template, define a Microsoft.Resources/resourceGroups resource with a name and location for the resource group. Вы можете создать группу ресурсов и развернуть ресурсы в нее в одном шаблоне.You can create a resource group and deploy resources to that resource group in the same template. Ресурсы, которые можно развернуть на уровне подписки: Политики и Управление доступом на основе ролей.The resources that you can deploy at the subscription level include: Policies, and Role-based access control.

Примечание

Эта статья была изменена и теперь содержит сведения о новом модуле Az для Azure PowerShell.This article has been updated to use the new Azure PowerShell Az module. Вы по-прежнему можете использовать модуль AzureRM, исправления ошибок для которого будут продолжать выпускаться как минимум до декабря 2020 г.You can still use the AzureRM module, which will continue to receive bug fixes until at least December 2020. Дополнительные сведения о совместимости модуля Az с AzureRM см. в статье Introducing the new Azure PowerShell Az module (Знакомство с новым модулем Az для Azure PowerShell).To learn more about the new Az module and AzureRM compatibility, see Introducing the new Azure PowerShell Az module. Инструкции по установке модуля Az см. в статье об установке Azure PowerShell.For Az module installation instructions, see Install Azure PowerShell.

Рекомендации по развертываниюDeployment considerations

Развертывание уровня подписки отличается от развертывания группы ресурсов следующими аспектами.Subscription level deployment is different from resource group deployment in the following aspects:

Схема и командыSchema and commands

Схема и команды, используемые для развертываний на уровне подписки, отличаются от развертываний в группу ресурсов.The schema and commands you use for subscription-level deployments are different than resource group deployments.

Для схемы используйте https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#.For the schema, use https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#.

В качестве команды развертывания Azure CLI используйте az deployment create.For the Azure CLI deployment command, use az deployment create. Например, следующая команда CLI развертывает шаблон для создания группы ресурсов.For example, the following CLI command deploys a template to create a resource group:

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

В качестве команды развертывания PowerShell используйте New-AzureRmDeployment.For the PowerShell deployment command, use New-AzDeployment. Например, следующая команда PowerShell развертывает шаблон для создания группы ресурсов.For example, the following PowerShell command deploys a template to create a resource group:

New-AzDeployment `
  -Name demoDeployment `
  -Location centralus `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/emptyRG.json `
  -rgName demoResourceGroup `
  -rgLocation centralus

Имя и расположение для развертыванияDeployment name and location

При развертывании в подписке, необходимо указать расположение для развертывания.When deploying to your subscription, you must provide a location for the deployment. Можно также указать имя для развертывания.You can also provide a name for the deployment. Если не указать имя для развертывания, имя шаблона будет использоваться как имя развертывания.If you don't specify a name for the deployment, the name of the template is used as the deployment name. Например, развернув шаблон с именем azuredeploy.json создается имя развертывания по умолчанию azuredeploy.For example, deploying a template named azuredeploy.json creates a default deployment name of azuredeploy.

Расположение развертывания уровня подписки является неизменяемым.The location of subscription level deployments is immutable. Не возможно создать развертывание в одном расположении, если в другом расположении уже существует развертывание с таким же именем.You can't create a deployment in one location when there's an existing deployment with the same name but different location. Если появится код ошибки InvalidDeploymentLocation, используйте другое имя или то же расположение, что и для предыдущего развертывания с этим именем.If you get the error code InvalidDeploymentLocation, either use a different name or the same location as the previous deployment for that name.

Использование функций шаблоновUse template functions

Важные рекомендации при использовании функций шаблонов для развертываний на уровне подписки:For subscription-level deployments, there are some important considerations when using template functions:

  • Функция resourceGroup() не поддерживается.The resourceGroup() function is not supported.
  • Функция resourceId() поддерживается.The resourceId() function is supported. Используйте ее для получения идентификатора ресурса для ресурсов, которые используются в развертываниях уровня подписки.Use it to get the resource ID for resources that are used at subscription level deployments. Например получите идентификатор ресурса для определения политики с помощью resourceId('Microsoft.Authorization/roleDefinitions/', parameters('roleDefinition'))For example, get the resource ID for a policy definition with resourceId('Microsoft.Authorization/roleDefinitions/', parameters('roleDefinition'))
  • Функции reference() и list() поддерживаются.The reference() and list() functions are supported.

Создание группы ресурсовCreate resource groups

В следующем примере создается пустая группа ресурсов.The following template creates an empty resource group.

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

Схему шаблона можно найти здесь.The template schema can be found at here. Аналогичные шаблоны можно найти в GitHub.Similar templates can be found at GitHub.

Создание нескольких групп ресурсовCreate multiple resource groups

Используйте элемент copy с группами ресурсов, чтобы создать несколько групп ресурсов.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.1",
    "parameters": {
        "rgNamePrefix": {
            "type": "string"
        },
        "rgLocation": {
            "type": "string"
        },
        "instanceCount": {
            "type": "int"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Resources/resourceGroups",
            "apiVersion": "2018-05-01",
            "location": "[parameters('rgLocation')]",
            "name": "[concat(parameters('rgNamePrefix'), copyIndex())]",
            "copy": {
                "name": "rgCopy",
                "count": "[parameters('instanceCount')]"
            },
            "properties": {}
        }
    ],
    "outputs": {}
}

Дополнительные сведения см. в статьях Развертывание нескольких экземпляров ресурса или свойства в шаблонах Azure Resource Manager и Руководство. Создание нескольких экземпляров ресурса с помощью шаблонов Resource Manager.For information about resource iteration, see Deploy more than one instance of a resource or property in Azure Resource Manager Templates, and Tutorial: Create multiple resource instances with Resource Manager templates.

Создание группы ресурсов и развертывание ресурсовCreate resource group and deploy resources

Чтобы создать группу ресурсов и развернуть в нее ресурсы, используйте вложенный шаблон.To create the resource group and deploy resources to it, use a nested template. Вложенный шаблон определяет ресурсы для развертывания в группе ресурсов.The nested template defines the resources to deploy to the resource group. Установите вложенный шаблон как зависимый от группы ресурсов, чтобы группа существовала до развертывания ресурсов.Set the nested template as dependent on the resource group to make sure the resource group exists before deploying the resources.

В следующем примере создается группа ресурсов и в нее развертывается учетная запись хранения.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.1",
    "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": "2018-05-01",
            "location": "[parameters('rgLocation')]",
            "name": "[parameters('rgName')]",
            "properties": {}
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2018-05-01",
            "name": "storageDeployment",
            "resourceGroup": "[parameters('rgName')]",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/resourceGroups/', parameters('rgName'))]"
            ],
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "type": "Microsoft.Storage/storageAccounts",
                            "apiVersion": "2017-10-01",
                            "name": "[variables('storageName')]",
                            "location": "[parameters('rgLocation')]",
                            "kind": "StorageV2",
                            "sku": {
                                "name": "Standard_LRS"
                            }
                        }
                    ],
                    "outputs": {}
                }
            }
        }
    ],
    "outputs": {}
}

Создайте политики.Create policies

Назначение политикиAssign policy

В следующем примере подписке присваивается имеющееся определение политики.The following example assigns an existing policy definition to the subscription. Предоставьте параметры в качестве объекта, если политика принимает их.If the policy takes parameters, provide them as an object. Используйте пустой объект по умолчанию, если политика не принимает параметры.If the policy 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",
            "name": "[parameters('policyName')]",
            "apiVersion": "2018-03-01",
            "properties": {
                "scope": "[subscription().id]",
                "policyDefinitionId": "[parameters('policyDefinitionID')]",
                "parameters": "[parameters('policyParameters')]"
            }
        }
    ]
}

Чтобы применить встроенную политику к подписке Azure, используйте следующие команды Azure CLI.To apply a built-in policy to your Azure subscription, use the following Azure CLI commands:

# Built-in policy that does not accept parameters
definition=$(az policy definition list --query "[?displayName=='Audit resource location matches resource group location'].id" --output tsv)

az deployment 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=auditRGLocation

Развернуть этот шаблон с помощью PowerShell можно так:To deploy this template with PowerShell, use:

$definition = Get-AzPolicyDefinition | Where-Object { $_.Properties.DisplayName -eq 'Audit resource location matches resource group location' }

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

Чтобы применить встроенную политику к подписке Azure, используйте следующие команды Azure CLI.To apply a built-in policy to your Azure subscription, use the following Azure CLI commands:

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

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

Развернуть этот шаблон с помощью PowerShell можно так: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-AzDeployment `
  -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

Определение и назначение политикиDefine and assign policy

Вы можете определить и назначить политику в том же шаблоне.You can define and assign a policy 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",
            "name": "locationpolicy",
            "apiVersion": "2018-05-01",
            "properties": {
                "policyType": "Custom",
                "parameters": {},
                "policyRule": {
                    "if": {
                        "field": "location",
                        "equals": "northeurope"
                    },
                    "then": {
                        "effect": "deny"
                    }
                }
            }
        },
        {
            "type": "Microsoft.Authorization/policyAssignments",
            "name": "location-lock",
            "apiVersion": "2018-05-01",
            "dependsOn": [
                "locationpolicy"
            ],
            "properties": {
                "scope": "[subscription().id]",
                "policyDefinitionId": "[resourceId('Microsoft.Authorization/policyDefinitions', 'locationpolicy')]"
            }
        }
    ]
}

Чтобы создать определение политики в подписке и применить его к ней, используйте следующую команду CLI.To create the policy definition in your subscription, and apply it to the subscription, use the following CLI command:

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

Развернуть этот шаблон с помощью PowerShell можно так:To deploy this template with PowerShell, use:

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

Создание ролейCreate roles

Назначение роли для подпискиAssign role at subscription

В следующем примере присваивается роль пользователю или группе для подписки.The following example assigns a role to a user or group for the subscription. В этом примере вы не указываете область для назначения, так как область автоматически устанавливается к подписке.In this example, you don't specify a scope for the assignment because the scope is automatically set to the subscription.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "principalId": {
            "type": "string"
        },
        "roleDefinitionId": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Authorization/roleAssignments",
            "name": "[guid(parameters('principalId'), deployment().name)]",
            "apiVersion": "2017-09-01",
            "properties": {
                "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
                "principalId": "[parameters('principalId')]"
            }
        }
    ]
}

Чтобы присвоить группу Active Directory роли для подписки, используйте следующие команды Azure CLI.To assign an Active Directory group to a role for your subscription, use the following Azure CLI commands:

# Get ID of the role you want to assign
role=$(az role definition list --name Contributor --query [].name --output tsv)

# Get ID of the AD group to assign the role to
principalid=$(az ad group show --group demogroup --query objectId --output tsv)

az deployment create \
  --name demoDeployment \
  --location centralus \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/roleassign.json \
  --parameters principalId=$principalid roleDefinitionId=$role

Развернуть этот шаблон с помощью PowerShell можно так:To deploy this template with PowerShell, use:

$role = Get-AzRoleDefinition -Name Contributor

$adgroup = Get-AzADGroup -DisplayName demogroup

New-AzDeployment `
  -Name demoRole `
  -Location centralus `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/roleassign.json `
  -roleDefinitionId $role.Id `
  -principalId $adgroup.Id

Назначение роли в областиAssign role at scope

Следующий шаблон уровня подписки назначает роль пользователю или группе, которая находится в группе ресурсов в пределах подписки.The following subscription-level template assigns a role to a user or group that is scoped to a resource group within the subscription. Область должна быть на уровне или ниже уровня развертывания.The scope must be at or below the level of deployment. Вы можете выполнить развертывание в подписке и указать область назначения ролей в группе ресурсов в пределах этой подписки.You can deploy to a subscription and specify a role assignment scoped to a resource group within that subscription. Тем не менее нельзя выполнить развертывание в группе ресурсов и указать область назначения ролей для подписки.However, you can't deploy to a resource group and specify a role assignment scope to the subscription.

Чтобы назначить роль в области, используйте вложенное развертывание.To assign the role at a scope, use a nested deployment. Обратите внимание на то, что имя группы ресурсов указывается как в свойствах для ресурса развертывания, так и в свойстве области назначения ролей.Notice that the resource group name is specified both in the properties for the deployment resource and in the scope property of the role assignment.

{
    "$schema": "https://schema.management.azure.com/schemas/2018-05-01/subscriptionDeploymentTemplate.json#",
    "contentVersion": "1.0.0.1",
    "parameters": {
        "principalId": {
            "type": "string"
        },
        "roleDefinitionId": {
            "type": "string"
        },
        "rgName": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2018-05-01",
            "name": "assignRole",
            "resourceGroup": "[parameters('rgName')]",
            "properties": {
                "mode": "Incremental",
                "template": {
                    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
                    "contentVersion": "1.0.0.0",
                    "parameters": {},
                    "variables": {},
                    "resources": [
                        {
                            "type": "Microsoft.Authorization/roleAssignments",
                            "name": "[guid(parameters('principalId'), deployment().name)]",
                            "apiVersion": "2017-09-01",
                            "properties": {
                                "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', parameters('roleDefinitionId'))]",
                                "principalId": "[parameters('principalId')]",
                                "scope": "[concat(subscription().id, '/resourceGroups/', parameters('rgName'))]"
                            }
                        }
                    ],
                    "outputs": {}
                }
            }
        }
    ],
    "outputs": {}
}

Чтобы присвоить группу Active Directory роли для подписки, используйте следующие команды Azure CLI.To assign an Active Directory group to a role for your subscription, use the following Azure CLI commands:

# Get ID of the role you want to assign
role=$(az role definition list --name Contributor --query [].name --output tsv)

# Get ID of the AD group to assign the role to
principalid=$(az ad group show --group demogroup --query objectId --output tsv)

az deployment create \
  --name demoDeployment \
  --location centralus \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/scopedRoleAssign.json \
  --parameters principalId=$principalid roleDefinitionId=$role rgName demoRg

Развернуть этот шаблон с помощью PowerShell можно так:To deploy this template with PowerShell, use:

$role = Get-AzRoleDefinition -Name Contributor

$adgroup = Get-AzADGroup -DisplayName demogroup

New-AzDeployment `
  -Name demoRole `
  -Location centralus `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/scopedRoleAssign.json `
  -roleDefinitionId $role.Id `
  -principalId $adgroup.Id `
  -rgName demoRg

Дальнейшие действияNext steps