リンクされた ARM テンプレートと入れ子になった ARM テンプレートをデプロイする

完了

デプロイの複雑さが増すにつれて、Azure Resource Manager (ARM) の リンクされたテンプレートまたは入れ子になったテンプレートを使用して、リソースをデプロイするためのモジュール方式に移行することが必要になる場合があります。 リンクされたテンプレートと入れ子になったテンプレートは、デプロイを多くの関連するテンプレートに分割し、メイン テンプレートを使用してまとめてデプロイする方法です。

リンクされたテンプレート

リンクされたテンプレート とは、メイン テンプレートからのリンクによって参照される個別のテンプレート ファイルを接続する動作を指します。 リンクされたテンプレートを使用すると、多数の個別の ARM テンプレートで構成される、再利用可能でコンポーザブルなモジュール形式のデプロイを作成できます。

リンクされたテンプレートを参照する場合は、HTTP または HTTPS 経由でアクセスできる URI 値を指定する必要があります。 最後のユニットとは異なり、ローカル ファイルをテンプレートとして使用できます。

リンクされたテンプレートを使用するには、まず、GitHub や Azure Blob Storage などのパブリックにアクセス可能なエンドポイントでテンプレートをステージングする必要があります。 共有アクセス署名 (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 つのファイルで参照できます。 高度なシナリオの場合、リンクされたテンプレートを使用することで、対象となるコンポーネントにソリューションを分割することができます。 これらのテンプレートは、他のシナリオで簡単に再利用できます。

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

ネストされたテンプレート は、メインテンプレート内にテンプレート構文を埋め込む行為を指します。 入れ子になったテンプレートを使用すると、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": {
  }
}

入れ子になったテンプレートを使用している場合は、親テンプレートまたは入れ子になったテンプレートのスコープ内でテンプレート式を評価するかどうかを指定できます。 スコープによって、パラメーター、変数、および resourceGroupsubscription などの関数がどのように解決されるかが決まります。