複数のサブスクリプションまたはリソース グループに 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.

アプリケーションとその一連のリソースにとって、リソース グループはライフサイクルのコンテナーと言えます。The resource group is the lifecycle container for the application and its collection of resources. リソース グループはテンプレートの外で作成し、デプロイ時にその対象として、そのリソース グループを指定することになります。You create the resource group outside of the template, and specify the resource group to target during deployment. リソース グループの概要については、「Azure Resource Manager の概要」を参照してください。For an introduction to resource groups, see Azure Resource Manager overview.

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

異なるリソースをデプロイ対象とするには、入れ子になった (リンクされた) テンプレートをデプロイ時に使う必要があります。To target a different resource, you must use a nested or linked template during deployment. 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.

次の例では、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.

テンプレートのデプロイDeploy the template

テンプレートの例をデプロイするには、2017 年 5 月以降のリリースの Azure PowerShell または Azure CLI を使用します。To deploy the example template, use a release of Azure PowerShell or Azure CLI from May 2017 or later. この例では、GitHub のクロス サブスクリプション テンプレートを使用してください。For these examples, use the cross subscription template in GitHub.

同じサブスクリプションの 2 つのリソース グループTwo resource groups in the same subscription

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

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

デプロイが完了すると、2 つのリソース グループが確認できます。After deployment completes, you see two resource groups. それぞれのリソース グループにストレージ アカウントが存在します。Each resource group contains a storage account.

異なるサブスクリプションの 2 つのリソース グループTwo resource groups in different subscriptions

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

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

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
    }
}

resourceGroup() によるさまざまな解決方法をテストするには、親テンプレート、インライン テンプレート、およびリンクされたテンプレートのリソース グループ オブジェクトを返すサンプル テンプレートをデプロイします。To test the different ways resourceGroup() resolves, deploy an example template that returns the resource group object for the parent template, inline template, and linked template. 親テンプレートとインライン テンプレートの両方が、同じリソース グループに解決されます。The parent and inline template both resolve to the same resource group. リンクされたテンプレートは、リンクされたリソース グループに解決されます。The linked template resolves to the linked resource group.

PowerShell では、次を使用します。For PowerShell, 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 CLI では、次を使用します。For Azure CLI, 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