複数のサブスクリプションまたはリソース グループに Azure リソースをデプロイするDeploy Azure resources to more than one subscription or resource group

テンプレートに含まれているリソースはすべて 1 つのリソース グループにデプロイするのが一般的です。Typically, you deploy all the resources in your template to a single resource group. 一方、さまざまなリソースを 1 つにまとめたうえで、複数のリソース グループまたはサブスクリプションにデプロイしたい状況もあります。However, there are scenarios where you want to deploy a set of resources together but place them in different resource groups or subscriptions. たとえば Azure Site Recovery に使うバックアップ仮想マシンは、別のリソース グループと場所にデプロイした方がよい場合があります。For example, you may want to deploy the backup virtual machine for Azure Site Recovery to a separate resource group and location. Resource Manager では、入れ子になったテンプレートを使用することで、親テンプレートに使われているサブスクリプションおよびリソース グループとは異なる、サブスクリプションとリソース グループを対象にすることができます。Resource Manager enables you to use nested templates to target different subscriptions and resource groups than the subscription and resource group used for the parent template.

サブスクリプションとリソース グループの指定Specify a subscription and resource group

異なるリソースを対象とするには、入れ子になった、またはリンクされたテンプレートを使用します。To target a different resource, use a nested or linked template. Microsoft.Resources/deployments リソース タイプは、subscriptionId および resourceGroup にパラメーターを提供します。The Microsoft.Resources/deployments resource type provides parameters for subscriptionId and resourceGroup. こうしたプロパティを使用すると、入れ子になったデプロイ用に異なるサブスクリプションとリソース グループを指定することができます。These properties enable you to specify a different subscription and resource group for the nested deployment. すべてのリソース グループは、デプロイの実行前に存在している必要があります。All the resource groups must exist before running the deployment. サブスクリプション ID またはリソース グループを指定しない場合は、親テンプレートのサブスクリプションおよびリソース グループが使用されます。If you do not specify either the subscription ID or resource group, the subscription and resource group from the parent template is used.

別のリソース グループとサブスクリプションを指定するには、以下を使用します。To specify a different resource group and subscription, use:

"resources": [
    {
        "apiVersion": "2017-05-10",
        "name": "nestedTemplate",
        "type": "Microsoft.Resources/deployments",
        "resourceGroup": "[parameters('secondResourceGroup')]",
        "subscriptionId": "[parameters('secondSubscriptionID')]",
        ...
    }
]

リソース グループが同じサブスクリプションにある場合は、subscriptionId 値を削除できます。If your resource groups are in the same subscription, you can remove the subscriptionId value.

次の例では、2 つのストレージ アカウントをデプロイしています。1 つは、デプロイ時に指定されるリソース グループのストレージ アカウントで、もう 1 つは、secondResourceGroup パラメーターで指定されるリソース グループのストレージ アカウントです。The following example deploys two storage accounts - one in the resource group specified during deployment, and one in a resource group specified in the secondResourceGroup parameter:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "storagePrefix": {
            "type": "string",
            "maxLength": 11
        },
        "secondResourceGroup": {
            "type": "string"
        },
        "secondSubscriptionID": {
            "type": "string",
            "defaultValue": ""
        },
        "secondStorageLocation": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]"
        }
    },
    "variables": {
        "firstStorageName": "[concat(parameters('storagePrefix'), uniqueString(resourceGroup().id))]",
        "secondStorageName": "[concat(parameters('storagePrefix'), uniqueString(parameters('secondSubscriptionID'), parameters('secondResourceGroup')))]"
    },
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "nestedTemplate",
            "type": "Microsoft.Resources/deployments",
            "resourceGroup": "[parameters('secondResourceGroup')]",
            "subscriptionId": "[parameters('secondSubscriptionID')]",
            "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",
                            "name": "[variables('secondStorageName')]",
                            "apiVersion": "2017-06-01",
                            "location": "[parameters('secondStorageLocation')]",
                            "sku":{
                                "name": "Standard_LRS"
                            },
                            "kind": "Storage",
                            "properties": {
                            }
                        }
                    ]
                },
                "parameters": {}
            }
        },
        {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('firstStorageName')]",
            "apiVersion": "2017-06-01",
            "location": "[resourceGroup().location]",
            "sku":{
                "name": "Standard_LRS"
            },
            "kind": "Storage",
            "properties": {
            }
        }
    ]
}

存在しないリソース グループの名前を resourceGroup に設定した場合、デプロイは失敗します。If you set resourceGroup to the name of a resource group that does not exist, the deployment fails.

テンプレート例をデプロイするには、Azure PowerShell 4.0.0 以降、または Azure CLI 2.0.0 以降を使用します。To deploy the example template, use Azure PowerShell 4.0.0 or later, or Azure CLI 2.0.0 or later.

resourceGroup() 関数の使用Use the resourceGroup() function

リソース グループ間のデプロイの場合、resourceGroup() 関数は、入れ子になったテンプレートの指定方法に基づいてさまざまに解決されます。For cross resource group deployments, the resourceGroup() function resolves differently based on how you specify the nested template.

あるテンプレートを別のテンプレートに埋め込む場合、入れ子になったテンプレート内の resourceGroup() は親リソース グループに解決されます。If you embed one template within another template, resourceGroup() in the nested template resolves to the parent resource group. 埋め込みテンプレートでは次の形式が使用されます。An embedded template uses the following format:

"apiVersion": "2017-05-10",
"name": "embeddedTemplate",
"type": "Microsoft.Resources/deployments",
"resourceGroup": "crossResourceGroupDeployment",
"properties": {
    "mode": "Incremental",
    "template": {
        ...
        resourceGroup() refers to parent resource group
    }
}

別のテンプレートにリンクする場合、リンクされたテンプレート内の resourceGroup() は入れ子になったリソース グループに解決されます。If you link to a separate template, resourceGroup() in the linked template resolves to the nested resource group. リンクされたテンプレートでは次の形式が使用されます。A linked template uses the following format:

"apiVersion": "2017-05-10",
"name": "linkedTemplate",
"type": "Microsoft.Resources/deployments",
"resourceGroup": "crossResourceGroupDeployment",
"properties": {
    "mode": "Incremental",
    "templateLink": {
        ...
        resourceGroup() in linked template refers to linked resource group
    }
}

サンプル テンプレートExample templates

以下のテンプレートは、複数のリソース グループのデプロイを示しています。The following templates demonstrate multiple resource group deployments. テンプレートをデプロイするスクリプトは、表の後に示されています。Scripts to deploy the templates are shown after the table.

テンプレートTemplate [説明]Description
クロス サブスクリプション テンプレートCross subscription template 1 つのストレージ アカウントを 1 つのリソース グループに、また 1 つのストレージ アカウントを 2 番目のリソース グループにデプロイします。Deploys one storage account to one resource group and one storage account to a second resource group. 2 番目のリソース グループが別のサブスクリプションにある場合は、サブスクリプション ID の値が含まれます。Include a value for the subscription ID when the second resource group is in a different subscription.
クロス リソース グループ プロパティ テンプレートCross resource group properties template resourceGroup() 関数の解決方法を示します。Demonstrates how the resourceGroup() function resolves. このテンプレートではリソースはデプロイされません。It does not deploy any resources.

PowerShellPowerShell

PowerShell の場合、2 つのストレージ アカウントを、同じサブスクリプション内の 2 つのリソース グループにデプロイするには、次を使用します。For PowerShell, to deploy two storage accounts to two resource groups in the same subscription, use:

$firstRG = "primarygroup"
$secondRG = "secondarygroup"

New-AzureRmResourceGroup -Name $firstRG -Location southcentralus
New-AzureRmResourceGroup -Name $secondRG -Location eastus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName $firstRG `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json `
  -storagePrefix storage `
  -secondResourceGroup $secondRG `
  -secondStorageLocation eastus

PowerShell の場合、2 つのストレージ アカウントを 2 つのサブスクリプションにデプロイするには、次を使用します。For PowerShell, to deploy two storage accounts to two subscriptions, use:

$firstRG = "primarygroup"
$secondRG = "secondarygroup"

$firstSub = "<first-subscription-id>"
$secondSub = "<second-subscription-id>"

Select-AzureRmSubscription -Subscription $secondSub
New-AzureRmResourceGroup -Name $secondRG -Location eastus

Select-AzureRmSubscription -Subscription $firstSub
New-AzureRmResourceGroup -Name $firstRG -Location southcentralus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName $firstRG `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json `
  -storagePrefix storage `
  -secondResourceGroup $secondRG `
  -secondStorageLocation eastus `
  -secondSubscriptionID $secondSub

PowerShell の場合、リソース グループ オブジェクトが親テンプレート、インライン テンプレート、およびリンクされたテンプレートに対してどのように解決されるかをテストするには、次を使用します。For PowerShell, to test how the resource group object resolves for the parent template, inline template, and linked template, use:

New-AzureRmResourceGroup -Name parentGroup -Location southcentralus
New-AzureRmResourceGroup -Name inlineGroup -Location southcentralus
New-AzureRmResourceGroup -Name linkedGroup -Location southcentralus

New-AzureRmResourceGroupDeployment `
  -ResourceGroupName parentGroup `
  -TemplateUri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json

Azure CLIAzure CLI

Azure CLI の場合、2 つのストレージ アカウントを、同じサブスクリプションの 2 つのリソース グループにデプロイするには、次を使用します。For Azure CLI, to deploy two storage accounts to two resource groups in the same subscription, use:

firstRG="primarygroup"
secondRG="secondarygroup"

az group create --name $firstRG --location southcentralus
az group create --name $secondRG --location eastus
az group deployment create \
  --name ExampleDeployment \
  --resource-group $firstRG \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json \
  --parameters storagePrefix=tfstorage secondResourceGroup=$secondRG secondStorageLocation=eastus

Azure CLI の場合、2 つのストレージ アカウントを、2 つのサブスクリプションにデプロイするには、次を使用します。For Azure CLI, to deploy two storage accounts to two subscriptions, use:

firstRG="primarygroup"
secondRG="secondarygroup"

firstSub="<first-subscription-id>"
secondSub="<second-subscription-id>"

az account set --subscription $secondSub
az group create --name $secondRG --location eastus

az account set --subscription $firstSub
az group create --name $firstRG --location southcentralus

az group deployment create \
  --name ExampleDeployment \
  --resource-group $firstRG \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crosssubscription.json \
  --parameters storagePrefix=storage secondResourceGroup=$secondRG secondStorageLocation=eastus secondSubscriptionID=$secondSub

Azure CLI の場合、リソース グループ オブジェクトが親テンプレート、インライン テンプレート、およびリンクされたテンプレートに対してどのように解決されるかをテストするには、次を使用します。For Azure CLI, to test how the resource group object resolves for the parent template, inline template, and linked template, use:

az group create --name parentGroup --location southcentralus
az group create --name inlineGroup --location southcentralus
az group create --name linkedGroup --location southcentralus

az group deployment create \
  --name ExampleDeployment \
  --resource-group parentGroup \
  --template-uri https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/azure-resource-manager/crossresourcegroupproperties.json 

次の手順Next steps