サブスクリプション レベルでリソース グループとリソースを作成する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 portal は、サブスクリプション レベルでのデプロイをサポートしていません。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.

注意

この記事は、新しい Azure PowerShell Az モジュールを使用するために更新されました。This article has been updated to use the new Azure PowerShell Az module. AzureRM モジュールはまだ使用でき、少なくとも 2020 年 12 月までは引き続きバグ修正が行われます。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 (新しい Azure PowerShell Az モジュールの概要)」を参照してください。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-AzDeployment を使用します。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. これを使用して、サブスクリプション レベルのデプロイで使用されているリソースのリソース ID を取得します。Use it to get the resource ID for resources that are used at subscription level deployments. たとえば、resourceId('Microsoft.Authorization/roleDefinitions/', parameters('roleDefinition')) で、ポリシー定義のリソース ID を取得します。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