Azure リソース デプロイ時のリンクされたテンプレートおよび入れ子になったテンプレートの使用Using linked and nested templates when deploying Azure resources

ソリューションをデプロイするには、1 つのテンプレートを使用するか、多数の関連するテンプレートがあるメイン テンプレートのいずれかを使用できます。To deploy your solution, you can use either a single template or a main template with many related templates. 関連するテンプレートは、メイン テンプレートからリンクされる個別のファイルの場合も、メイン テンプレート内で入れ子になっているテンプレートの場合もあります。The related template can be either a separate file that is linked to from the main template, or a template that is nested within the main template.

中小規模のソリューションの場合、テンプレートを 1 つにするとわかりやすく、保守も簡単になります。For small to medium solutions, a single template is easier to understand and maintain. すべてのリソースと値を 1 つのファイルで参照できます。You can see all the resources and values in a single file. 高度なシナリオの場合、リンクされたテンプレートを使用することで、対象となるコンポーネントにソリューションを分割し、テンプレートを再利用できます。For advanced scenarios, linked templates enable you to break down the solution into targeted components, and reuse templates.

リンクされたテンプレートを使用する場合は、配置時にパラメーター値を受け取るメインのテンプレートを作成します。When using linked template, you create a main template that receives the parameter values during deployment. メインのテンプレートには、すべてのリンクされたテンプレートが含まれていて、必要に応じて、これらのテンプレートに値を渡します。The main template contains all the linked templates and passes values to those templates as needed.

別のテンプレートにリンクするには、メイン テンプレートに展開リソースを追加します。To link to another template, add a deployments resource to your main template.

"resources": [
  {
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
          "mode": "Incremental",
          <nested-template-or-external-template>
      }
  }
]

展開リソースに指定するプロパティは、外部テンプレートにリンクするか、インライン テンプレートをメイン テンプレートに入れ子にするかによって異なります。The properties you provide for the deployment resource vary based on whether you are linking to an external template or nesting an inline template in the main template.

リンクされたテンプレートと入れ子になったテンプレートのいずれにも、増分デプロイ モードのみを使用できます。For both linked and nested templates, you can only use Incremental deployment mode.

入れ子になったテンプレートNested template

テンプレートをメイン テンプレート内に入れ子にするには、template プロパティを使用してテンプレートの構文を指定します。To nest the template within the main template, use the template property and specify the template syntax.

"resources": [
  {
    "apiVersion": "2017-05-10",
    "name": "nestedTemplate",
    "type": "Microsoft.Resources/deployments",
    "properties": {
      "mode": "Incremental",
      "template": {
        "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
        "contentVersion": "1.0.0.0",
        "resources": [
          {
            "type": "Microsoft.Storage/storageAccounts",
            "name": "[variables('storageName')]",
            "apiVersion": "2015-06-15",
            "location": "West US",
            "properties": {
              "accountType": "Standard_LRS"
            }
          }
        ]
      }
    }
  }
]

注意

入れ子になったテンプレートの場合、入れ子になったテンプレート内に定義されている変数またはパラメーターは使用できません。For nested templates, you cannot use parameters or variables that are defined within the nested template. パラメーターと変数は、メイン テンプレートから使用できます。You can use parameters and variables from the main template. 上の例では、[variables('storageName')] は、入れ子になったテンプレートではなく、メイン テンプレートから値を取得します。In the preceding example, [variables('storageName')] retrieves a value from the main template, not the nested template. この制限は、外部テンプレートには適用されません。This restriction does not apply to external templates.

入れ子になったテンプレートの出力セクションでは reference 関数を使用できません。You cannot use the reference function in the outputs section of a nested template. 入れ子になったテンプレート内のデプロイされたリソースの値を返すには、入れ子になったテンプレートをリンク済みテンプレートに変換します。To return the values for a deployed resource in a nested template, convert your nested template to a linked template.

入れ子になったテンプレートでは、標準のテンプレートと同じプロパティが必要です。The nested template requires the same properties as a standard template.

外部テンプレートと外部パラメーターExternal template and external parameters

外部のテンプレートおよびパラメーター ファイルにリンクするには、templateLinkparametersLink を使用します。To link to an external template and parameter file, use templateLink and parametersLink. テンプレートにリンクするには、Resource Manager サービスからそのテンプレートにアクセスできる必要があります。When linking to a template, the Resource Manager service must be able to access it. ローカル ファイルや、ローカル ネットワークだけで使用可能なファイルは指定できません。You cannot specify a local file or a file that is only available on your local network. http または https のいずれかを含む URI 値のみを指定できます。You can only provide a URI value that includes either http or https. 1 つと選択肢として、ストレージ アカウントにリンク済みテンプレートを配置し、その項目の URI を使用できます。One option is to place your linked template in a storage account, and use the URI for that item.

"resources": [
  {
     "apiVersion": "2017-05-10",
     "name": "linkedTemplate",
     "type": "Microsoft.Resources/deployments",
     "properties": {
       "mode": "incremental",
       "templateLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
          "contentVersion":"1.0.0.0"
       },
       "parametersLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.parameters.json",
          "contentVersion":"1.0.0.0"
       }
     }
  }
]

テンプレートまたはパラメーターには、contentVersion プロパティを指定する必要はありません。You don't have to provide the contentVersion property for the template or parameters. コンテンツのバージョン値を指定しない場合、テンプレートの現在のバージョンがデプロイされます。If you don't provide a content version value, the current version of the template is deployed. コンテンツのバージョン値を指定する場合、リンクされているテンプレートのバージョンと一致している必要があります。それ以外の場合、デプロイはエラーで失敗します。If you provide a value for content version, it must match the version in the linked template; otherwise, the deployment fails with an error.

外部テンプレートとインライン パラメーターExternal template and inline parameters

または、パラメーターをインラインで指定できます。Or, you can provide the parameter inline. メイン テンプレートから、リンクされたテンプレートに値を渡すには、パラメーターを使用します。To pass a value from the main template to the linked template, use parameters.

"resources": [
  {
     "apiVersion": "2017-05-10",
     "name": "linkedTemplate",
     "type": "Microsoft.Resources/deployments",
     "properties": {
       "mode": "incremental",
       "templateLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
          "contentVersion":"1.0.0.0"
       },
       "parameters": {
          "StorageAccountName":{"value": "[parameters('StorageAccountName')]"}
        }
     }
  }
]

前の例では、URL の値をハード コーディングしてテンプレートをリンクする方法について説明しました。The previous examples showed hard-coded URL values for the template links. この方法は簡単なテンプレートには適していますが、モジュール構造の大規模な一連のテンプレートを使用する場合にはあまり適していません。This approach might work for a simple template but it doesn't work well when working with a large set of modular templates. その場合は、メイン テンプレートのベース URL を格納する静的変数を作成し、リンクされたテンプレートの URL をそのベース URL から動的に作成することができます。Instead, you can create a static variable that stores a base URL for the main template and then dynamically create URLs for the linked templates from that base URL. この方法の利点としては、テンプレートを簡単に移動したり、フォークしたりできることが挙げられます。The benefit of this approach is you can easily move or fork the template because you only need to change the static variable in the main template. メイン テンプレート内の静的変数を変更するだけで、正しい URI が、メイン テンプレートから、分解されたテンプレート全体に渡されます。The main template passes the correct URIs throughout the decomposed template.

次の例では、ベース URL を使用して、リンクされたテンプレート (sharedTemplateUrlvmTemplate) の 2 つの URL を作成する方法を示しています。The following example shows how to use a base URL to create two URLs for linked templates (sharedTemplateUrl and vmTemplate).

"variables": {
    "templateBaseUrl": "https://raw.githubusercontent.com/Azure/azure-quickstart-templates/master/postgresql-on-ubuntu/",
    "sharedTemplateUrl": "[concat(variables('templateBaseUrl'), 'shared-resources.json')]",
    "vmTemplateUrl": "[concat(variables('templateBaseUrl'), 'database-2disk-resources.json')]"
}

deployment() を使用して、現在のテンプレートのベース URL を取得したり、同じ場所にある他のテンプレートの URL を取得したりすることもできます。You can also use deployment() to get the base URL for the current template, and use that to get the URL for other templates in the same location. この方法は、テンプレートの場所が変更された場合や、テンプレート ファイルのハード コーディング URL を回避する必要がある場合に便利です。This approach is useful if your template location changes or you want to avoid hard coding URLs in the template file. templateLink プロパティは、URL を含むリモート テンプレートにリンクした場合にのみ返されます。The templateLink property is only returned when linking to a remote template with a URL. ローカル テンプレートを使用している場合、そのプロパティは使用できません。If you're using a local template, that property isn't available.

"variables": {
    "sharedTemplateUrl": "[uri(deployment().properties.templateLink.uri, 'shared-resources.json')]"
}

リンク済みテンプレートから値を取得するGet values from linked template

リンクされたテンプレートから出力値を取得するには、"[reference('<name-of-deployment>').outputs.<property-name>.value]" のような構文でプロパティ値を取得します。To get an output value from a linked template, retrieve the property value with syntax like: "[reference('<name-of-deployment>').outputs.<property-name>.value]".

次の例では、リンクされたテンプレートを参照して、出力値を取得する方法を示します。The following examples demonstrate how to reference a linked template and retrieve an output value. リンクされたテンプレートは、単純なメッセージを返します。The linked template returns a simple message.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [],
    "outputs": {
        "greetingMessage": {
            "value": "Hello World",
            "type" : "string"
        }
    }
}

メイン テンプレートは、リンクされたテンプレートを展開し、返される値を取得します。The main template deploys the linked template and gets the returned value. 展開リソースを名前で参照し、リンクされたテンプレートによって返されるプロパティの名前を使用していることに注意してください。Notice that it references the deployment resource by name, and it uses the name of the property returned by the linked template.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "linkedTemplate",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "incremental",
                "templateLink": {
                    "uri": "[uri(deployment().properties.templateLink.uri, 'helloworld.json')]",
                    "contentVersion": "1.0.0.0"
                }
            }
        }
    ],
    "outputs": {
        "messageFromLinkedTemplate": {
            "type": "string",
            "value": "[reference('linkedTemplate').outputs.greetingMessage.value]"
        }
    }
}

他の種類のリソース同様、リンクされたテンプレートとその他のリソース間の依存関係を設定できます。Like other resource types, you can set dependencies between the linked template and other resources. そのため、他のリソースにリンク済みテンプレートからの出力値が必要な場合は、そのリソースの前にリンク済みテンプレートが確実にデプロイされるようにしてください。Therefore, when other resources require an output value from the linked template, make sure the linked template is deployed before them. または、リンク済みテンプレートが他のリソースに依存する場合は、そのリンク済みテンプレートの前に他のリソースが確実にデプロイされるようにしてください。Or, when the linked template relies on other resources, make sure other resources are deployed before the linked template.

次の例では、パブリック IP アドレスをデプロイし、リソース ID を返すテンプレートを示します。The following example shows a template that deploys a public IP address and returns the resource ID:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "publicIPAddresses_name": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('publicIPAddresses_name')]",
            "apiVersion": "2017-06-01",
            "location": "eastus",
            "properties": {
                "publicIPAddressVersion": "IPv4",
                "publicIPAllocationMethod": "Dynamic",
                "idleTimeoutInMinutes": 4
            },
            "dependsOn": []
        }
    ],
    "outputs": {
        "resourceID": {
            "type": "string",
            "value": "[resourceId('Microsoft.Network/publicIPAddresses', parameters('publicIPAddresses_name'))]"
        }
    }
}

ロード バランサーの展開時に、前のテンプレートからのパブリック IP アドレスを使用するには、テンプレートにリンクし、展開リソースに依存関係を追加します。To use the public IP address from the preceding template when deploying a load balancer, link to the template and add a dependency on the deployment resource. ロード バランサーのパブリック IP アドレスは、リンクされているテンプレートからの出力値に設定されます。The public IP address on the load balancer is set to the output value from the linked template.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "loadBalancers_name": {
            "defaultValue": "mylb",
            "type": "string"
        },
        "publicIPAddresses_name": {
            "defaultValue": "myip",
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Network/loadBalancers",
            "name": "[parameters('loadBalancers_name')]",
            "apiVersion": "2017-06-01",
            "location": "eastus",
            "properties": {
                "frontendIPConfigurations": [
                    {
                        "name": "LoadBalancerFrontEnd",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[reference('linkedTemplate').outputs.resourceID.value]"
                            }
                        }
                    }
                ],
                "backendAddressPools": [],
                "loadBalancingRules": [],
                "probes": [],
                "inboundNatRules": [],
                "outboundNatRules": [],
                "inboundNatPools": []
            },
            "dependsOn": [
                "linkedTemplate"
            ]
        },
        {
            "apiVersion": "2017-05-10",
            "name": "linkedTemplate",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[uri(deployment().properties.templateLink.uri, 'publicip.json')]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters":{
                    "publicIPAddresses_name":{"value": "[parameters('publicIPAddresses_name')]"}
                }
            }
        }
    ]
}

デプロイ履歴内のリンクされたテンプレートと入れ子になったテンプレートLinked and nested templates in deployment history

Resource Manager では、各テンプレートはデプロイ履歴内で個別のデプロイとして処理されます。Resource Manager processes each template as a separate deployment in the deployment history. したがって、3 つのリンクされたテンプレートまたは入れ子になったテンプレートがあるメイン テンプレートは、デプロイ履歴に次のように表示されます。Therefore, a main template with three linked or nested templates appears in the deployment history as:

デプロイ履歴

履歴内のこれらの個別のエントリを使用して、展開後に出力値を取得できます。You can use these separate entries in the history to retrieve output values after the deployment. 次のテンプレートは、パブリック IP アドレスを作成し、IP アドレスを出力します。The following template creates a public IP address and outputs the IP address:

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "publicIPAddresses_name": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('publicIPAddresses_name')]",
            "apiVersion": "2017-06-01",
            "location": "southcentralus",
            "properties": {
                "publicIPAddressVersion": "IPv4",
                "publicIPAllocationMethod": "Static",
                "idleTimeoutInMinutes": 4,
                "dnsSettings": {
                    "domainNameLabel": "[concat(parameters('publicIPAddresses_name'), uniqueString(resourceGroup().id))]"
                }
            },
            "dependsOn": []
        }
    ],
    "outputs": {
        "returnedIPAddress": {
            "type": "string",
            "value": "[reference(parameters('publicIPAddresses_name')).ipAddress]"
        }
    }
}

次のテンプレートは、前のテンプレートにリンクします。The following template links to the preceding template. 3 つのパブリック IP アドレスが作成されます。It creates three public IP addresses.

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
    },
    "variables": {},
    "resources": [
        {
            "apiVersion": "2017-05-10",
            "name": "[concat('linkedTemplate', copyIndex())]",
            "type": "Microsoft.Resources/deployments",
            "properties": {
              "mode": "Incremental",
              "templateLink": {
                "uri": "[uri(deployment().properties.templateLink.uri, 'static-public-ip.json')]",
                "contentVersion": "1.0.0.0"
              },
              "parameters":{
                  "publicIPAddresses_name":{"value": "[concat('myip-', copyIndex())]"}
              }
            },
            "copy": {
                "count": 3,
                "name": "ip-loop"
            }
        }
    ]
}

展開後、次の PowerShell スクリプトを使用して、出力値を取得できます。After the deployment, you can retrieve the output values with the following PowerShell script:

$loopCount = 3
for ($i = 0; $i -lt $loopCount; $i++)
{
    $name = 'linkedTemplate' + $i;
    $deployment = Get-AzureRmResourceGroupDeployment -ResourceGroupName examplegroup -Name $name
    Write-Output "deployment $($deployment.DeploymentName) returned $($deployment.Outputs.returnedIPAddress.value)"
}

または、次の Azure CLI スクリプトを使用します。Or, Azure CLI script:

for i in 0 1 2;
do
    name="linkedTemplate$i";
    deployment=$(az group deployment show -g examplegroup -n $name);
    ip=$(echo $deployment | jq .properties.outputs.returnedIPAddress.value);
    echo "deployment $name returned $ip";
done

外部テンプレートのセキュリティ保護Securing an external template

リンクされたテンプレートは外部から利用可能でなければなりませんが、一般公開する必要はありません。Although the linked template must be externally available, it doesn't need to be generally available to the public. ストレージ アカウント所有者のみがアクセス可能なプライベート ストレージ アカウントに、テンプレートを追加できます。You can add your template to a private storage account that is accessible to only the storage account owner. 次に、デプロイ時にアクセスできるように、Shared Access Signature (SAS) トークンを作成します。Then, you create a shared access signature (SAS) token to enable access during deployment. リンクされたテンプレートの URI に SAS トークンを追加します。You add that SAS token to the URI for the linked template. トークンがセキュリティで保護された文字列として渡された場合でも、SAS トークンを含むリンクされたテンプレートの URI が、デプロイ操作中にログに記録されます。Even though the token is passed in as a secure string, the URI of the linked template, including the SAS token, is logged in the deployment operations. 公開を制限するには、トークンの有効期限を設定します。To limit exposure, set an expiration for the token.

パラメーター ファイルは SAS トークンを使ったアクセスに制限することができます。The parameter file can also be limited to access through a SAS token.

次の例は、テンプレートにリンクするときに、SAS トークンを渡す方法を示します。The following example shows how to pass a SAS token when linking to a template:

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "containerSasToken": { "type": "string" }
  },
  "resources": [
    {
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "incremental",
        "templateLink": {
          "uri": "[concat(uri(deployment().properties.templateLink.uri, 'helloworld.json'), parameters('containerSasToken'))]",
          "contentVersion": "1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
  }
}

PowerShell では、コンテナーのトークンを取得し、次のコマンドを使ってテンプレートを展開します。In PowerShell, you get a token for the container and deploy the templates with the following commands. containerSasToken パラメーターはテンプレートで定義されていることに注意してください。Notice that the containerSasToken parameter is defined in the template. New-AzureRmResourceGroupDeployment コマンド内のパラメーターではありません。It isn't a parameter in the New-AzureRmResourceGroupDeployment command.

Set-AzureRmCurrentStorageAccount -ResourceGroupName ManageGroup -Name storagecontosotemplates
$token = New-AzureStorageContainerSASToken -Name templates -Permission r -ExpiryTime (Get-Date).AddMinutes(30.0)
$url = (Get-AzureStorageBlob -Container templates -Blob parent.json).ICloudBlob.uri.AbsoluteUri
New-AzureRmResourceGroupDeployment -ResourceGroupName ExampleGroup -TemplateUri ($url + $token) -containerSasToken $token

Azure CLI では、コンテナーのトークンを取得し、次のコードを使用してテンプレートをデプロイします。In Azure CLI, you get a token for the container and deploy the templates with the following code:

expiretime=$(date -u -d '30 minutes' +%Y-%m-%dT%H:%MZ)
connection=$(az storage account show-connection-string \
    --resource-group ManageGroup \
    --name storagecontosotemplates \
    --query connectionString)
token=$(az storage container generate-sas \
    --name templates \
    --expiry $expiretime \
    --permissions r \
    --output tsv \
    --connection-string $connection)
url=$(az storage blob url \
    --container-name templates \
    --name parent.json \
    --output tsv \
    --connection-string $connection)
parameter='{"containerSasToken":{"value":"?'$token'"}}'
az group deployment create --resource-group ExampleGroup --template-uri $url?$token --parameters $parameter

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

次の例は、リンク済みテンプレートの一般的な使い方を示します。The following examples show common uses of linked templates.

Main templateMain template リンク済みテンプレートLinked template 説明Description
Hello WorldHello World リンク済みテンプレートlinked template リンク済みテンプレートから文字列を返します。Returns string from linked template.
パブリック IP アドレスを使用する Azure Load BalancerLoad Balancer with public IP address リンク済みテンプレートlinked template リンク済みテンプレートからパブリック IP アドレスを返し、ロード バランサーでその値を設定します。Returns public IP address from linked template and sets that value in load balancer.
複数の IP アドレスMultiple IP addresses リンク済みテンプレートlinked template リンク済みテンプレートにいくつかのパブリック IP アドレスを作成します。Creates several public IP addresses in linked template.

次の手順Next steps