次の方法で共有


Azure Resource Manager テンプレート スペック

テンプレート スペックは、後でデプロイするために Azure に Azure Resource Manager テンプレート (ARM テンプレート) を格納するためのリソースの種類です。 このリソースの種類を使用すると、ARM テンプレートを組織内の他のユーザーと共有できます。 他の Azure リソースと同じように、Azure ロールベースのアクセス制御 (Azure RBAC) を使用してテンプレート スペックを共有できます。

Microsoft.Resources/templateSpecs は、テンプレート スペックのリソースの種類です。 これは、メイン テンプレートと、リンクされた任意の数のテンプレートで構成されます。 Azure によって、テンプレート スペックはリソース グループに安全に格納されます。 Template Specs では、バージョン管理がサポートされています。

テンプレート スペックをデプロイするには、PowerShell、Azure CLI、Azure portal、REST、その他のサポートされている SDK とクライアントなど、標準の Azure ツールを使用します。 テンプレートの場合と同じコマンドを使用してください。

Note

Azure PowerShell でテンプレート スペックを使用するには、バージョン 5.0.0 以降をインストールする必要があります。 Azure CLI でこれを使用するには、バージョン 2.14.2 以降を使用します。

デプロイを計画するときは、リソースのライフサイクルを考慮します。 ライフサイクルが同じようなリソースを 1 つのテンプレート スペックにグループ化します。たとえば、デプロイに複数の Azure Cosmos DB インスタンスが含まれ、各インスタンスにそれ自体のデータベースとコンテナーが含まれています。 データベースとコンテナーにはほとんど変化がないため、Cosmos DB インスタンスと、その基礎となるデータベースおよびコンテナーを含めるテンプレート スペックを 1 つ作成します。 それらのリソースのインスタンスを複数作成するには、コピー ループと共に、テンプレートの中で条件付きステートメントを使用します。

トレーニング リソース

テンプレート スペックの詳細とハンズオン ガイダンスについては、「再利用可能なインフラストラクチャ コードのライブラリをテンプレート スペックを使用して発行する」を参照してください。

ヒント

ARM テンプレートと同じ機能を備え、構文も使いやすいため、Bicep をお勧めします。 詳細は、「Bicep での Azure Resource Manager テンプレートの関数」を参照してください。

テンプレート スペックを使用する理由は何ですか。

テンプレート スペックには、次のような利点があります。

  • テンプレート スペック用に標準 ARM テンプレートを使用する。
  • SAS トークンではなく、Azure RBAC を使用してアクセスを管理する。
  • ユーザーは、テンプレートへの書き込みアクセス権がなくてもテンプレート スペックをデプロイできる。
  • テンプレート スペックは、PowerShell スクリプトや DevOps パイプラインなどの既存のデプロイ プロセスに統合できる。

テンプレート スペックを使用すると、正規のテンプレートを作成し、それらを組織内のチームと共有できます。 テンプレート スペックは、デプロイのために Azure Resource Manager で使用できますが、正しいアクセス許可がないユーザーはアクセスできないため、安全です。 ユーザーがテンプレートをデプロイするのに必要なのは、そのテンプレート スペックへの読み取りアクセス権のみです。そのため、他のユーザーに変更を許可することなくテンプレートを共有できます。

現在、GitHub リポジトリまたはストレージ アカウントにテンプレートがある場合に、テンプレートを共有して使用しようとすると、問題がいくつか発生します。 テンプレートをデプロイするには、テンプレートへのパブリック アクセスを許可するか、SAS トークンを使用してアクセスを管理する必要があります。 この制限に対処するために、ローカル コピーを作成する場合があります。これは、最終的に元のテンプレートとは異なったものになります。 テンプレート スペックにより、テンプレートの共有が簡単になります。

組織の要件とガイダンスに従うには、テンプレート スペックに含まれるテンプレートを管理者が検証する必要があります。

必要なアクセス許可

テンプレート スペック用に次の 2 つの Azure 組み込みロールが定義されています。

さらに、Bicep ファイルをデプロイするためのアクセス許可が必要です。 詳細については、「デプロイ - CLI」または「デプロイ - PowerShell」を参照してください。

テンプレート スペックを作成する

次の例は、Azure でストレージ アカウントを作成するための簡単なテンプレートを示しています。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "storageAccountType": {
      "type": "string",
      "defaultValue": "Standard_LRS",
      "allowedValues": [
        "Standard_LRS",
        "Standard_GRS",
        "Standard_ZRS",
        "Premium_LRS"
      ]
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2019-06-01",
      "name": "[concat('store', uniquestring(resourceGroup().id))]",
      "location": "[resourceGroup().location]",
      "kind": "StorageV2",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      }
    }
  ]
}

テンプレート スペックを作成するときは、PowerShell コマンドまたは CLI コマンドにメイン テンプレート ファイルが渡されます。 リンクされたテンプレートをメイン テンプレートが参照している場合は、コマンドでそれを検索してパッケージ化します。 詳細については、「リンクされたテンプレートを使用してテンプレート スペックを作成する」を参照してください。

テンプレート スペックを作成するには、次のコマンドを使用します。

New-AzTemplateSpec -Name storageSpec -Version 1.0a -ResourceGroupName templateSpecsRg -Location westus2 -TemplateFile ./mainTemplate.json

また、ARM テンプレートを使用して、テンプレート スペックを作成することもできます。 次のテンプレートによって、ストレージ アカウントを配置するテンプレート スペックが作成されます。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "templateSpecName": {
      "type": "string",
      "defaultValue": "CreateStorageAccount"
    },
    "templateSpecVersionName": {
      "type": "string",
      "defaultValue": "0.1"
    },
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Resources/templateSpecs",
      "apiVersion": "2021-05-01",
      "name": "[parameters('templateSpecName')]",
      "location": "[parameters('location')]",
      "properties": {
        "description": "A basic templateSpec - creates a storage account.",
        "displayName": "Storage account (Standard_LRS)"
      }
    },
    {
      "type": "Microsoft.Resources/templateSpecs/versions",
      "apiVersion": "2021-05-01",
      "name": "[format('{0}/{1}', parameters('templateSpecName'), parameters('templateSpecVersionName'))]",
      "location": "[parameters('location')]",
      "dependsOn": [
        "[resourceId('Microsoft.Resources/templateSpecs', parameters('templateSpecName'))]"
      ],
      "properties": {
        "mainTemplate": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "storageAccountType": {
              "type": "string",
              "defaultValue": "Standard_LRS",
              "allowedValues": [
                "Standard_LRS",
                "Standard_GRS",
                "Standard_ZRS",
                "Premium_LRS"
              ]
            }
          },
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts",
              "apiVersion": "2019-06-01",
              "name": "[concat('store', uniquestring(resourceGroup().id))]",
              "location": "[resourceGroup().location]",
              "kind": "StorageV2",
              "sku": {
                "name": "[parameters('storageAccountType')]"
              }
            }
          ]
        }
      }
    }
  ]
}

テンプレート スペックのサイズは、およそ 2 MB に制限されています。 テンプレート スペックのサイズが制限を超えると、TemplateSpecTooLarge エラー コードを受け取ります。 次のような内容のエラー メッセージです。

The size of the template spec content exceeds the maximum limit. For large template specs with many artifacts, the recommended course of action is to split it into multiple template specs and reference them modularly via TemplateLinks.

サブスクリプション内のすべてのテンプレート スペックを表示するには、次のコマンドを使用します。

Get-AzTemplateSpec

テンプレート スペックの詳細 (そのバージョンを含む) を表示するには、次のコマンドを使用します。

Get-AzTemplateSpec -ResourceGroupName templateSpecsRG -Name storageSpec

テンプレート スペックをデプロイする

テンプレート スペックを作成した後、テンプレート スペック閲覧者ロールを持つユーザーがそれをデプロイできます。 さらに、ARM テンプレートをデプロイするためのアクセス許可も必要です。 詳細については、「デプロイ - CLI」または「デプロイ - PowerShell」を参照してください。

テンプレート スペックは、ポータル、PowerShell、Azure CLI を通じて、または大規模なテンプレートのデプロイでリンクされたテンプレートとしてデプロイできます。 組織内のユーザーは、Azure 内の任意のスコープ (リソース グループ、サブスクリプション、管理グループ、またはテナント) にテンプレート スペックをデプロイできます。

テンプレートのパスまたは URI を渡す代わりに、リソース ID を指定してテンプレート スペックをデプロイします。 リソース ID の形式は次のとおりです。

/subscriptions/{subscription-id}/resourceGroups/{resource-group}/providers/Microsoft.Resources/templateSpecs/{template-spec-name}/versions/{template-spec-version}

リソース ID にテンプレート スペックのバージョン名が含まれていることに注目してください。

たとえば、次のコマンドを使用してテンプレート スペックをデプロイします。

$id = "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/templateSpecsRG/providers/Microsoft.Resources/templateSpecs/storageSpec/versions/1.0a"

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG

実際には、通常は Get-AzTemplateSpec または az ts show を実行して、デプロイするテンプレート スペックの ID を取得します。

$id = (Get-AzTemplateSpec -Name storageSpec -ResourceGroupName templateSpecsRg -Version 1.0a).Versions.Id

New-AzResourceGroupDeployment `
  -ResourceGroupName demoRG `
  -TemplateSpecId $id

また、次の形式で URL を開いて、テンプレート仕様をデプロイすることもできます。

https://portal.azure.com/#create/Microsoft.Template/templateSpecVersionId/%2fsubscriptions%2f{subscription-id}%2fresourceGroups%2f{resource-group-name}%2fproviders%2fMicrosoft.Resources%2ftemplateSpecs%2f{template-spec-name}%2fversions%2f{template-spec-version}

パラメーター

テンプレート スペックにパラメーターを渡すことは、ARM テンプレートにパラメーターを渡すことと同じです。 パラメーターの値は、インラインで、またはパラメーター ファイルに追加します。

パラメーターをインラインで渡すには、以下を使用します。

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG `
  -StorageAccountType Standard_GRS

ローカル パラメーター ファイルを作成するには、以下を使用します。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "StorageAccountType": {
      "value": "Standard_GRS"
    }
  }
}

また、そのパラメーター ファイルを以下を使用して渡します。

New-AzResourceGroupDeployment `
  -TemplateSpecId $id `
  -ResourceGroupName demoRG `
  -TemplateParameterFile ./mainTemplate.parameters.json

バージョン管理

テンプレート スペックを作成するときは、そのバージョン名を指定します。 テンプレート コードを反復処理するときは、既存のバージョンを更新する (修正プログラムの場合) か、または新しいバージョンを発行することができます。 バージョンはテキスト文字列です。 セマンティック バージョン管理など、任意のバージョン管理システムに従うことを選択できます。 テンプレート スペックのユーザーは、デプロイ時に使用するバージョン名を指定できます。 持つことができるバージョンの数に制限はありません。

タグを使用する

タグは、リソースを論理的に整理するために役立ちます。 Azure PowerShell と Azure CLI を使用して、テンプレート スペックにタグを追加できます。

New-AzTemplateSpec `
  -Name storageSpec `
  -Version 1.0a `
  -ResourceGroupName templateSpecsRg `
  -Location westus2 `
  -TemplateFile ./mainTemplate.json `
  -Tag @{Dept="Finance";Environment="Production"}
Set-AzTemplateSpec `
  -Name storageSpec `
  -Version 1.0a `
  -ResourceGroupName templateSpecsRg `
  -Location westus2 `
  -TemplateFile ./mainTemplate.json `
  -Tag @{Dept="Finance";Environment="Production"}

テンプレート スペックを作成または変更するときに、version パラメーターを指定して、tag パラメーターを指定しない場合:

  • テンプレート スペックが存在し、タグはあるがバージョンが存在しない場合、新しいバージョンでは既存のテンプレート スペックと同じタグが継承されます。

テンプレート スペックを作成または変更するときに、tag パラメーターと version パラメーターの両方を指定する場合:

  • テンプレート スペックとバージョンの両方が存在しない場合、新しいテンプレート スペックと新しいバージョンの両方にタグが追加されます。
  • テンプレート スペックは存在するが、バージョンが存在しない場合、タグは新しいバージョンにのみ追加されます。
  • テンプレート スペックとバージョンの両方が存在する場合、タグはバージョンにのみ適用されます。

tag パラメーターを指定し、version パラメーターを指定せずにテンプレートを変更する場合、タグはテンプレート スペックにのみ追加されます。

リンクされたテンプレートを使用してテンプレート スペックを作成する

テンプレート スペックのメイン テンプレートがリンクされたテンプレートを参照している場合は、PowerShell コマンドと CLI コマンドで、リンクされたテンプレートをローカル ドライブから自動的に検索してパッケージ化することができます。 テンプレート スペックをホストするために、ストレージ アカウントまたはリポジトリを手動で構成する必要はありません。テンプレート スペック リソースにすべて含まれています。

次の例は、メイン テンプレートと、リンクされた 2 つのテンプレートで構成されています。 この例は、テンプレートの抜粋にすぎません。 relativePath という名前のプロパティを使用して、他のテンプレートにリンクしていることに注目してください。 デプロイ リソースには、2020-06-01 以降の apiVersion を使用する必要があります。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  ...
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "artifacts/webapp.json"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "relativePath": "artifacts/database.json"
        }
      }
    }
  ],
  "outputs": {}
}

前の例で、テンプレート スペックを作成する PowerShell コマンドまたは CLI コマンドを実行すると、メイン テンプレート、Web アプリ テンプレート (webapp.json)、データベース テンプレート (database.json) の 3 つのファイルが検索され、テンプレート スペックにパッケージ化されます。

詳細については、リンクされたテンプレートを使用してテンプレート スペックを作成する」を参照してください。

テンプレート スペックをリンクされたテンプレートとしてデプロイする

テンプレート スペックを作成したら、それは ARM テンプレートや別のテンプレート スペックから簡単に再利用できます。テンプレート スペックにリンクするには、そのリソース ID をテンプレートに追加します。 メイン テンプレートをデプロイするとき、リンクされたテンプレート スペックが自動的にデプロイされます。この動作により、モジュール テンプレート スペックを開発し、必要に応じて再利用することができます。

たとえば、ネットワーク リソースをデプロイするテンプレート スペックと、ストレージ リソースをデプロイする別のテンプレート スペックを作成することができます。 ARM テンプレートでは、ネットワーク リソースまたはストレージ リソースを構成する必要があるときはいつでも、これらの 2 つのテンプレート スペックにリンクします。

次の例は、前の例と似ていますが、ローカル テンプレートにリンクする relativePath プロパティではなく、テンプレート スペックにリンクする id プロパティを使用します。 デプロイ リソースの API バージョンには 2020-06-01 を使用します。 この例では、テンプレート スペックは templateSpecsRG という名前のリソース グループにあります。

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  ...
  "resources": [
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "networkingDeployment",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "id": "[resourceId('templateSpecsRG', 'Microsoft.Resources/templateSpecs/versions', 'networkingSpec', '1.0a')]"
        }
      }
    },
    {
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-06-01",
      "name": "storageDeployment",
      ...
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "id": "[resourceId('templateSpecsRG', 'Microsoft.Resources/templateSpecs/versions', 'storageSpec', '1.0a')]"
        }
      }
    }
  ],
  "outputs": {}
}

テンプレート スペックのリンクの詳細については、「チュートリアル: テンプレート スペックをリンクされたテンプレートとしてデプロイする」を参照してください。

次のステップ