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

複雑なソリューションをデプロイするには、テンプレートを複数の関連するテンプレートに分割し、メイン テンプレートを使用してそれらをまとめてデプロイできます。To deploy complex solutions, you can break your template into many related templates, and then deploy them together through a main template. 関連するテンプレートは、独立したファイルでも、メイン テンプレート内に埋め込まれるテンプレート構文でもかまいません。The related templates can be separate files or template syntax that is embedded within the main template. この記事では、メイン テンプレートからリンクされる独立したテンプレート ファイルに対して、リンクされたテンプレートという用語を使用します。This article uses the term linked template to refer to a separate template file that is linked to from the main template. メイン テンプレートに埋め込まれたテンプレート構文に対して、入れ子になったテンプレートという用語を使用します。It uses the term nested template to refer to embedded template syntax 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. これらのテンプレートは、他のシナリオで簡単に再利用できます。You can easily reuse these templates for other scenarios.

チュートリアルについては、「チュートリアル: リンクされた Azure Resource Manager テンプレートの作成」を参照してください。For a tutorial, see Tutorial: create linked Azure Resource Manager templates.

注意

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

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

テンプレートを入れ子にするには、メイン テンプレートにデプロイ リソースを追加します。To nest a template, add a deployments resource to your main template. template プロパティに、テンプレートの構文を指定します。In the template property, specify the template syntax.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "name": "nestedTemplate1",
      "apiVersion": "2017-05-10",
      "type": "Microsoft.Resources/deployments",
      "properties": {
        "mode": "Incremental",
        "template": {
          <nested-template-syntax>
        }
      }
    }
  ],
  "outputs": {
  }
}

次の例では、入れ子になったテンプレートを使用して、ストレージ アカウントがデプロイされます。The following example deploys a storage account through a nested template.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountName": {
      "type": "string"
    }
  },
  "resources": [
    {
      "name": "nestedTemplate1",
      "apiVersion": "2017-05-10",
      "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",
              "apiVersion": "2019-04-01",
              "name": "[parameters('storageAccountName')]",
              "location": "West US",
              "sku": {
                "name": "Standard_LRS"
              },
              "kind": "StorageV2"
            }
          ]
        }
      }
    }
  ],
  "outputs": {
  }
}

入れ子になったテンプレート内の式のスコープScope for expressions in nested templates

入れ子になったテンプレートを使用する場合、テンプレート式の評価のスコープを親テンプレートにするか入れ子にするかを指定できます。When using a nested template, you can specify whether template expressions are evaluated within the scope of the parent template or the nested template. スコープによって、resourceGroupsubscription などのパラメーター、変数、および関数がどのように解決されるかが決まります。The scope determines how parameters, variables, and functions like resourceGroup and subscription are resolved.

スコープは、expressionEvaluationOptions プロパティを使用して設定します。You set the scope through the expressionEvaluationOptions property. 既定では、expressionEvaluationOptions プロパティは outer に設定されます。これは、親テンプレート スコープを使用することを意味します。By default, the expressionEvaluationOptions property is set to outer, which means it uses the parent template scope. 式のスコープをネストされたテンプレートにするには、値を inner に設定します。Set the value to inner to scope expressions to the nested template.

{
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2017-05-10",
  "name": "nestedTemplate1",
  "properties": {
  "expressionEvaluationOptions": {
    "scope": "inner"
  },
  ...

次のテンプレートは、テンプレート式がスコープに従ってどのように解決されるかを示しています。The following template demonstrates how template expressions are resolved according to the scope. これには、親テンプレートと入れ子になったテンプレートの両方に定義されている exampleVar という名前の変数が含まれています。It contains a variable named exampleVar that is defined in both the parent template and the nested template. それは、変数の値を返します。It returns the value of the variable.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
  },
  "variables": {
    "exampleVar": "from parent template"
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2017-05-10",
      "name": "nestedTemplate1",
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "variables": {
            "exampleVar": "from nested template"
          },
          "resources": [
          ],
          "outputs": {
            "testVar": {
              "type": "string",
              "value": "[variables('exampleVar')]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
    "messageFromLinkedTemplate": {
      "type": "string",
      "value": "[reference('nestedTemplate1').outputs.testVar.value]"
    }
  }
}

変数の値は、スコープに基づいて変化します。The value of the variable changes based on the scope. 次の表に、両方のスコープの結果を示します。The following table shows the results for both scopes.

ScopeScope 出力Output
innerinner 入れ子になったテンプレートからfrom nested template
outer (既定値)outer (or default) 親テンプレートからfrom parent template

次の例では、SQL サーバーをデプロイし、パスワードに使用するキー コンテナー シークレットを取得します。The following example deploys a SQL server and retrieves a key vault secret to use for the password. キー コンテナー ID は動的に作成され、パラメーターとして入れ子になったテンプレートに渡されるため、スコープは inner に設定されます。The scope is set to inner because it dynamically creates the key vault ID and passes it as a parameter to the nested template.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]",
      "metadata": {
        "description": "The location where the resources will be deployed."
      }
    },
    "vaultName": {
      "type": "string",
      "metadata": {
        "description": "The name of the keyvault that contains the secret."
      }
    },
    "secretName": {
      "type": "string",
      "metadata": {
        "description": "The name of the secret."
      }
    },
    "vaultResourceGroupName": {
      "type": "string",
      "metadata": {
        "description": "The name of the resource group that contains the keyvault."
      }
    },
    "vaultSubscription": {
      "type": "string",
      "defaultValue": "[subscription().subscriptionId]",
      "metadata": {
        "description": "The name of the subscription that contains the keyvault."
      }
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "dynamicSecret",
      "properties": {
        "mode": "Incremental",
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "adminLogin": {
              "type": "string"
            },
            "adminPassword": {
              "type": "securestring"
            },
            "location": {
              "type": "string"
            }
          },
          "variables": {
            "sqlServerName": "[concat('sql-', uniqueString(resourceGroup().id, 'sql'))]"
          },
          "resources": [
            {
              "type": "Microsoft.Sql/servers",
              "apiVersion": "2018-06-01-preview",
              "name": "[variables('sqlServerName')]",
              "location": "[parameters('location')]",
              "properties": {
                "administratorLogin": "[parameters('adminLogin')]",
                "administratorLoginPassword": "[parameters('adminPassword')]"
              }
            }
          ],
          "outputs": {
            "sqlFQDN": {
              "type": "string",
              "value": "[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
            }
          }
        },
        "parameters": {
          "location": {
            "value": "[parameters('location')]"
          },
          "adminLogin": {
            "value": "ghuser"
          },
          "adminPassword": {
            "reference": {
              "keyVault": {
                "id": "[resourceId(parameters('vaultSubscription'), parameters('vaultResourceGroupName'), 'Microsoft.KeyVault/vaults', parameters('vaultName'))]"
              },
              "secretName": "[parameters('secretName')]"
            }
          }
        }
      }
    }
  ],
  "outputs": {
  }
}

注意

スコープを outer に設定した場合は、入れ子になったテンプレートの outputs セクションで、入れ子になったテンプレートでデプロイしているリソースに対する reference 関数を使用することはできません。When scope is set to outer, you can't use the reference function in the outputs section of a nested template for a resource you have deployed in the nested template. 入れ子になったテンプレートでデプロイされたリソースの値を返すには、inner スコープを使用するか、入れ子になったテンプレートをリンクされたテンプレートに変換します。To return the values for a deployed resource in a nested template, either use inner scope or convert your nested template to a linked template.

リンク済みテンプレートLinked template

テンプレートをリンクするには、メイン テンプレートにデプロイ リソースを追加します。To link a template, add a deployments resource to your main template. templateLink プロパティに、含めるテンプレートの URI を指定します。In the templateLink property, specify the URI of the template to include. 次の例では、新しいストレージ アカウントをデプロイするテンプレートにリンクしています。The following example links to a template that deploys a new storage account.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {},
  "variables": {},
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2017-05-10",
      "name": "linkedTemplate",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri":"https://mystorageaccount.blob.core.windows.net/AzureTemplates/newStorageAccount.json",
          "contentVersion":"1.0.0.0"
        }
      }
    }
  ],
  "outputs": {
  }
}

ローカル ファイルや、ローカル ネットワークだけで使用可能なファイルは指定できません。You can't 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. Resource Manager は、テンプレートにアクセスできる必要があります。Resource Manager must be able to access the template. 1 つと選択肢として、ストレージ アカウントにリンク済みテンプレートを配置し、その項目の URI を使用できます。One option is to place your linked template in a storage account, and use the URI for that item.

テンプレートまたはパラメーターには、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.

リンクされたテンプレートのパラメーターParameters for linked template

リンクされたテンプレートのパラメーターには、外部ファイルまたはインラインを指定できます。You can provide the parameters for your linked template either in an external file or inline. 外部パラメーター ファイルを指定する場合は、parametersLink プロパティを使用します。When providing an external parameter file, use the parametersLink property:

"resources": [
  {
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2018-05-01",
  "name": "linkedTemplate",
  "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"
    }
  }
  }
]

パラメーター値をインラインで渡すには、parameters プロパティを使用します。To pass parameter values inline, use the parameters property.

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

インライン パラメーターとパラメーター ファイルへのリンクの両方を使用することはできません。You can't use both inline parameters and a link to a parameter file. parametersLinkparameters の両方が指定された場合、デプロイは失敗します。The deployment fails with an error when both parametersLink and parameters are specified.

copy の使用Using copy

入れ子になったテンプレートを使用してリソースの複数のインスタンスを作成するには、Microsoft.Resources/deployments リソースのレベルで copy 要素を追加します。To create multiple instances of a resource with a nested template, add the copy element at the level of the Microsoft.Resources/deployments resource. または、スコープが inner の場合は、入れ子になったテンプレート内にコピーを追加できます。Or, if the scope is inner, you can add the copy within the nested template.

次のテンプレート例では、copy を入れ子になったテンプレートと共に使用する方法を示します。The following example template shows how to use copy with a nested template.

"resources": [
  {
  "type": "Microsoft.Resources/deployments",
  "apiVersion": "2018-05-01",
  "name": "[concat('nestedTemplate', copyIndex())]",
  // yes, copy works here
  "copy":{
    "name": "storagecopy",
    "count": 2
  },
  "properties": {
    "mode": "Incremental",
    "expressionEvaluationOptions": {
    "scope": "inner"
    },
    "template": {
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "resources": [
      {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-04-01",
      "name": "[concat(variables('storageName'), copyIndex())]",
      "location": "West US",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2"
      // Copy works here when scope is inner
      // But, when scope is default or outer, you get an error
      //"copy":{
      //  "name": "storagecopy",
      //  "count": 2
      //}
      }
    ]
    }
  }
  }
]

前の例では、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('deploymentName').outputs.propertyName.value]" のような構文でプロパティ値を取得します。To get an output value from a linked template, retrieve the property value with syntax like: "[reference('deploymentName').outputs.propertyName.value]".

リンクされたテンプレートから出力プロパティを取得する場合、プロパティ名にダッシュを含めることはできません。When getting an output property from a linked template, the property name can't include a dash.

次の例では、リンクされたテンプレートを参照して、出力値を取得する方法を示します。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": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "linkedTemplate",
      "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. 他のリソースにリンク済みテンプレートからの出力値が必要な場合は、そのリソースの前にリンク済みテンプレートが確実にデプロイされるようにしてください。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",
      "apiVersion": "2018-11-01",
      "name": "[parameters('publicIPAddresses_name')]",
      "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",
      "apiVersion": "2018-11-01",
      "name": "[parameters('loadBalancers_name')]",
      "location": "eastus",
      "properties": {
        "frontendIPConfigurations": [
          {
            "name": "LoadBalancerFrontEnd",
            "properties": {
              "privateIPAllocationMethod": "Dynamic",
              "publicIPAddress": {
                "id": "[reference('linkedTemplate').outputs.resourceID.value]"
              }
            }
          }
        ],
        "backendAddressPools": [],
        "loadBalancingRules": [],
        "probes": [],
        "inboundNatRules": [],
        "outboundNatRules": [],
        "inboundNatPools": []
      },
      "dependsOn": [
        "linkedTemplate"
      ]
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "linkedTemplate",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[uri(deployment().properties.templateLink.uri, 'publicip.json')]",
          "contentVersion": "1.0.0.0"
        },
        "parameters":{
          "publicIPAddresses_name":{"value": "[parameters('publicIPAddresses_name')]"}
        }
      }
    }
  ]
}

デプロイ履歴Deployment history

Resource Manager では、各テンプレートはデプロイ履歴内で個別のデプロイとして処理されます。Resource Manager processes each template as a separate deployment in the deployment history. 3 つのリンクされたテンプレートまたは入れ子になったテンプレートがあるメイン テンプレートは、デプロイ履歴に次のように表示されます。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",
      "apiVersion": "2018-11-01",
      "name": "[parameters('publicIPAddresses_name')]",
      "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": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2018-05-01",
      "name": "[concat('linkedTemplate', copyIndex())]",
      "copy": {
        "count": 3,
        "name": "ip-loop"
      },
      "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())]"}
        }
      }
    }
  ]
}

展開後、次の 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-AzResourceGroupDeployment -ResourceGroupName examplegroup -Name $name
  Write-Output "deployment $($deployment.DeploymentName) returned $($deployment.Outputs.returnedIPAddress.value)"
}

Bash シェルの Azure CLI スクリプトでは次のようになります。Or, Azure CLI script in a Bash shell:

#!/bin/bash

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.

現時点では、 Azure Storage ファイアウォールの内側にあるストレージ アカウントのテンプレートにリンクすることはできません。Currently, you can't link to a template in a storage account that is behind an Azure Storage firewall.

次の例は、テンプレートにリンクするときに、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": "securestring" }
  },
  "resources": [
  {
    "type": "Microsoft.Resources/deployments",
    "apiVersion": "2018-05-01",
    "name": "linkedTemplate",
    "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-AzResourceGroupDeployment コマンド内のパラメーターではありません。It isn't a parameter in the New-AzResourceGroupDeployment command.

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

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

#!/bin/bash

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