Bicep での Azure Resource Manager テンプレート スペック (プレビュー)

テンプレート スペックは、後でデプロイするために Azure Resource Manager テンプレート (ARM テンプレート) を格納するためのリソースの種類です。 このリソースの種類を使用すると、ARM テンプレートを組織内の他のユーザーと共有できます。 他の Azure リソースとまったく同様に、Azure ロールベースのアクセス制御 (Azure RBAC) を使用してテンプレート スペックを共有できます。Bicep ファイルを提供することで、Azure CLI または Azure PowerShell を使用してテンプレート スペックを作成できます。 Bicep ファイルは、格納される前に ARM JSON テンプレートに変換されます。 現在のところ、Azure portal から Bicep ファイルをインポートしてテンプレート スペック リソースを作成することはできません。

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

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

Note

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

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

ヒント

モジュール レジストリとテンプレート スペックの選択は、ほとんど好みの問題です。 2 つから選択するときに考慮すべき点がいくつかあります。

  • モジュール レジストリは、Bicep でのみサポートされています。 Bicep をまだ使用していない場合は、テンプレート スペックを使用します。
  • Bicep モジュール レジストリの内容は、別の Bicep ファイルからのみデプロイできます。 テンプレート スペックは、API、Azure PowerShell、Azure CLI、および Azure portal から直接デプロイできます。 UiFormDefinition を使用して、ポータルのデプロイ エクスペリエンスをカスタマイズすることさえできます。
  • Bicep には、loadTextContent および loadFileAsBase64 関数を使用して他のプロジェクト成果物 (非 Bicep ファイルや非 ARM テンプレート ファイルなど。たとえば、PowerShell スクリプト、CLI スクリプト、その他のバイナリ) を埋め込むための機能がいくつかあります。 テンプレート スペックでは、これらのアーティファクトをパッケージ化することはできません。

トレーニング リソース

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

必要なアクセス許可

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

さらに、Bicep ファイルをデプロイするためのアクセス許可も必要です。 CLI のデプロイに関するページまたは PowerShell のデプロイに関するページを参照してください。

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

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

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

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

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

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

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

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

@allowed([
  'Standard_LRS'
  'Standard_GRS'
  'Standard_ZRS'
  'Premium_LRS'
])
param storageAccountType string = 'Standard_LRS'

resource stg 'Microsoft.Storage/storageAccounts@2021-04-01' = {
  name:  'store${uniqueString(resourceGroup().id)}'
  location: resourceGroup().location
  sku: {
    name: storageAccountType
  }
  kind:'StorageV2'
}

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

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

また、Bicep ファイルを使用して、テンプレート スペックを作成することもできます。 ただし、mainTemplate の内容は JSON である必要があります。 次のテンプレートによって、ストレージ アカウントを配置するテンプレート スペックが作成されます。

param templateSpecName string = 'CreateStorageAccount'
param templateSpecVersionName string = '0.1'
param location string = resourceGroup().location

resource createTemplateSpec 'Microsoft.Resources/templateSpecs@2021-05-01' = {
  name: templateSpecName
  location: location
  properties: {
    description: 'A basic templateSpec - creates a storage account.'
    displayName: 'Storage account (Standard_LRS)'
  }
}

resource createTemplateSpecVersion 'Microsoft.Resources/templateSpecs/versions@2021-05-01' = {
  parent: createTemplateSpec
  name: templateSpecVersionName
  location: location
  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': 'store$uniquestring(resourceGroup().id)'
          'location': resourceGroup().location
          'kind': 'StorageV2'
          'sku': {
            'name': '[parameters(\'storageAccountType\')]'
          }
        }
      ]
    }
  }
}

Bicep ファイルに埋め込まれた JSON テンプレートでは、次の変更を行う必要があります。

  • 行の末尾にあるコンマを削除する。
  • 二重引用符を単一引用符に置き換える。
  • 式内の一重引用符をエスケープします。 たとえば、'name': '[parameters(\'storageAccountType\')]' です。
  • Bicep ファイルで定義されているパラメーターと変数にアクセスするには、パラメーター名と変数名を直接使用できます。 mainTemplate で定義されているパラメーターと変数にアクセスするには、ARM JSON テンプレートの構文を引き続き使用する必要があります。 たとえば、'name': '[parameters(\'storageAccountType\')]' です。
  • Bicep 関数を呼び出す場合は、Bicep 構文を使用します。 たとえば、'location': resourceGroup().location などです。

テンプレート スペックのサイズは、およそ 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 を通じて、または大規模なテンプレートのデプロイ内の Bicep モジュールとしてデプロイできます。 組織内のユーザーは、Azure 内の任意のスコープ (リソース グループ、サブスクリプション、管理グループ、またはテナント) にテンプレート スペックをデプロイできます。

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

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

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

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

$id = "/subscriptions/11111111-1111-1111-1111-111111111111/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}

パラメーター

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

インライン パラメーター

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

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

パラメーター ファイル

  • Bicep パラメーター ファイルを使う

    Bicep パラメーター ファイルを作成するには、using ステートメントを指定する必要があります。 次に例を示します。

    using 'using 'ts:<subscription-id>/<resource-group-name>/<template-spec-name>:<tag>'
    
    param StorageAccountType = 'Standard_GRS'
    

    詳細については、「Bicep パラメーター ファイル」を参照してください。

    パラメーター ファイルを渡すには、次を使います。

    現在、Azure PowerShell を使って .bicepparam ファイルでテンプレート スペックをデプロイすることはできません。

  • JSON パラメーター ファイルを使う

    次の JSON は、JSON パラメーター ファイルのサンプルです。

    {
      "$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.bicep `
  -Tag @{Dept="Finance";Environment="Production"}

次の例では、既存のテンプレート スペックを更新するときにタグを適用する方法を示します。

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

テンプレートとそのバージョンの両方にタグを付けることができます。 タグは、指定したパラメーターに応じて適用または継承されます。

テンプレート スペック Version バージョン パラメーター タグ パラメーター タグ値
Exists 該当なし 指定なし 指定済み テンプレート スペックに適用される
Exists 新規 指定済み 指定なし テンプレート スペックからバージョンに継承される
新規 新規 指定済み 指定済み テンプレート スペックとバージョンの両方に適用される
Exists 新規 指定済み 指定済み バージョンに適用される
Exists Exists 指定済み 指定済み バージョンに適用される

テンプレート スペックを作成した後、Bicep モジュール内のそのテンプレート スペックにリンクできます。 テンプレート スペックは、そのモジュールを含む Bicep ファイルをデプロイするときにデプロイされます。 詳細については、テンプレート スペック内のファイルに関するページをご覧ください。

モジュールのリンクを目的としたテンプレート スペックの別名を作成するには、「モジュールの別名」を参照してください。

次のステップ

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