Resource Manager - テンプレートの階層化(テンプレートのリンク)


概要

チュートリアルを参考にARMテンプレートの階層化を行う

Childテンプレートからテンプレート スペックを生成し、
Parentテンプレートでテンプレート スペックのリソース IDを使用してリンクする

ファイル構成

  ├─ storage/
  │   └─ template.json  # Childテンプレート
  │
  ├─ template.json      # Parentテンプレート
  └─ parameters.json    # パラメータ定義

前提

  • デプロイ先のリソースグループの作成
  • VSCode拡張機能Azure Resource Manager (ARM) Toolsのインストール

Azure Resource Manager (ARM) ToolsでARM テンプレートのひな型作成、値の検証、入力候補表示等が可能(参考

テンプレート スペックの生成

Childテンプレートからテンプレート スペックを生成する

Childテンプレート(storage/template.json

storage/template.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {  // Parentテンプレートから値を渡す
      "type": "string"
    },
    "location": {  // Parentテンプレートから値を渡す
      "type": "string"
    },
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS"
    }
  },
  "functions": [],
  "variables": {
    "storageAccountName": "[concat(parameters('prefix'), 'storageaccount')]"
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-04-01",
      "kind": "Storage",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      }
    }
  ],
  "outputs": {}
}

形式はARMテンプレートと同じで、ストレージアカウントを定義し、
parametersprefix, locationは、Parentテンプレートから値を渡すためdefaultValueは設定しない

デプロイ

az ts create --name storageSpec --version "1.0" --resource-group arm-test-resource-group --template-file "storage\template.json" --yes

--nameで指定した名前と、--versionで指定したバージョンは、Parentテンプレートデプロイ時に使用する
--yesオプションで既にリソースが存在する場合に上書きの確認ダイアログを表示しないようにしている

ARMテンプレートからリソースの生成

Parentテンプレート(template.json

template.json
{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "prefix": {
      "type": "string",
      "defaultValue": "prefix"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "tsVersion": {  // テンプレートスペックデプロイ時に指定した値  ※デプロイ時にparameters.jsonの値で上書きする
      "type": "string",
      "defaultValue": "1.0"
    },
    "tsName": {  // テンプレートスペックデプロイ時に指定した値  ※デプロイ時にparameters.jsonの値で上書きする
      "type": "string",
      "defaultValue": "storageSpec"
    }
  },
  "functions": [],
  "variables": {},
  "resources": [
    {
      "name": "StorageDeployment",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2021-04-01",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "id": "[resourceId('Microsoft.Resources/templateSpecs/versions', parameters('tsName'), parameters('tsVersion'))]"  // テンプレート スペックのリソースID
        },
        "parameters": {  // Childテンプレートに渡すパラメータ
          "prefix": {"value": "[parameters('prefix')]"},
          "location": {"value": "[parameters('location')]"}
        }
      }
    }
  ],
  "outputs": {}
}

Childテンプレートから生成したテンプレート スペックのリソースIDを指定して、テンプレートをリンクする
resourceId()関数にリソースタイプ(Microsoft.Resources/templateSpecs/versions)、リソース名、リソースバージョンをしてリソースIDを取得する

パラメータ定義(parameters.json

parameters.json
{
  "prefix": {"value": "armtest2"},
  "tsVersion": {"value": "1.0"}
}

デプロイ

az deployment group create --name test-deploy --resource-group arm-test-resource-group --template-file template.json --parameters parameters.json

デプロイ結果