リンクされた、および入れ子になった ARM テンプレートをデプロイする
デプロイの複雑さが増すにつれて、モジュール形式のアプローチに移行し、Azure Resource Manager (ARM) のリンクされた、または入れ子になった ARM テンプレートを使用してリソースをデプロイすることが必要になる可能性があります。 リンクされた、および入れ子になったテンプレートにより、デプロイを多数の関連するテンプレートに分割し、メイン テンプレートを使用してそれらをまとめてデプロイすることができます。
リンク済みテンプレート
"リンクされたテンプレート" とは、個別のテンプレート ファイルを接続して、メイン テンプレートからリンクで参照する操作を指します。 リンクされたテンプレートを使用すると、多数の個別の ARM テンプレートで構成される、再利用可能でコンポーザブルなモジュール形式のデプロイを作成できます。
リンクされたテンプレートを参照する場合、HTTP または HTTPS を経由してアクセスできる URI 値を指定する必要があります。 ローカル ファイルを使用できた、前のユニットとは異なります。
リンクされたテンプレートを使用するには、最初に、GitHub や Azure Blob Storage などのパブリックにアクセス可能なエンドポイントでテンプレートをステージングする必要があります。 Shared Access Signature (SAS) トークンでセキュリティ保護された Azure ストレージ アカウントを使用して、テンプレートをパブリック アクセスから保護します。
リンクされたテンプレートを ARM テンプレートに追加するには、Microsoft.Resources/deployments
リソースと、テンプレートの場所で構成された templateLink
プロパティを追加します。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"name": {
"type": "string",
"defaultValue": "linkeddemo001"
}
},
"variables": {
"linked-template": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/storage.json",
"linked-template-two": "https://raw.githubusercontent.com/Azure/azure-docs-json-samples/master/mslearn-arm-Module-sample/identity.json"
},
"resources": [
{
"name": "storage",
"type": "Microsoft.Resources/deployments",
"apiVersion": "2019-10-01",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('linked-template')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"name": { "value": "[parameters('name')]" },
"location": { "value": "[resourceGroup().location]" }
}
}
},
{
"name": "identity",
"type": "Microsoft.Resources/deployments",
"apiVersion": "2019-10-01",
"dependsOn": [
"[resourceId('Microsoft.Resources/deployments','storage')]"
],
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('linked-template-two')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"name": { "value": "[parameters('name')]" },
"location": { "value": "[resourceGroup().location]" }
}
}
}
],
"outputs": {
"storageURI": {
"type": "string",
"value": "[reference('storage').outputs.storageEndpoint.value]"
}
}
}
必要に応じて、リンクされたテンプレートにパラメーター値を渡して、デプロイ時にリンクされたテンプレートから出力を取得することもできます。 パラメーターは、パラメーター ファイルまたはインライン パラメーターのいずれかを使用して渡すことができます。
{
"name": "storage",
"type": "Microsoft.Resources/deployments",
"apiVersion": "2019-10-01",
"properties": {
"mode": "Incremental",
"templateLink": {
"uri": "[variables('linked-template')]",
"contentVersion": "1.0.0.0"
},
"parameters": {
"name": { "value": "[parameters('name')]" },
"location": { "value": "[resourceGroup().location]" }
}
}
}
中小規模のソリューションの場合、テンプレートを 1 つにするとわかりやすく、保守も簡単になります。 すべてのリソースと値を 1 つのファイルで参照できます。 高度なシナリオの場合、リンクされたテンプレートを使用することで、対象となるコンポーネントにソリューションを分割することができます。 これらのテンプレートは、他のシナリオで簡単に再利用できます。
入れ子になったテンプレート
"入れ子になったテンプレート" とは、メイン テンプレート内にテンプレート構文を埋め込む操作を指します。 入れ子になったテンプレートを使用すると、単一のテンプレート ファイルから複数の Azure Resource Manager スコープまたは複数のリソース グループへのデプロイなどの高度なデプロイ シナリオを実現できます。 リンクされたテンプレートとは異なり、各テンプレートが独自のテンプレート ファイルに格納されている場合、入れ子になったテンプレートを使用すると、多数の個別のテンプレートを 1 つのファイルに格納することができます。 このテンプレート構造を使う理由はいくつかあります。たとえば、リソースを複数のリソース グループまたはデプロイ スコープにデプロイする場合などです。
{
"$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {
"storageAccountName": {
"type": "string"
}
},
"resources": [
{
"type": "Microsoft.Resources/deployments",
"apiVersion": "2019-10-01",
"name": "nestedTemplate1",
"properties": {
"mode": "Incremental",
"template": {
"$schema": "https://schema.management.azure.com/schemas/2019-04-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": {
}
}
入れ子になったテンプレートを使用する場合、親テンプレートまたは入れ子になったテンプレートのどちらのスコープでテンプレート式を評価するかを指定できます。 スコープによって、パラメーター、変数、関数 (resourceGroup
や subscription
など) がどのように解決されるかが決まります。