Azureアームテンプレート仕様


前の投稿では、テンプレートリンクのテクニックを使用してテンプレートをモジュール化する方法を示しました.目標は、これらの子テンプレートの展開を調整するいくつかの小さなARMテンプレートと中央のテンプレートを作成することです.
このテクニックには多くの制限があります.まず、GATHUBリポジトリやazasストレージアカウントのようなグローバルに利用可能な場所にあなたの子テンプレートをホストする必要があります.次に、リンクされたテンプレートを使用してAzureリソースマネージャーのロールベースコントロールを使用できません.
バージョン管理は、第3の制限です.外部ストレージにARMテンプレートを使用すると、バージョンコントロールはContentVersionプロパティによって管理されます.これは手動プロセスであり、呼び出しと子テンプレートの両方が同じバージョンを使用することを確認する必要があります.
テンプレート仕様はこれらの制限に対処します.テンプレート仕様はAzureリソースであり、外部ストレージではなく、他のリソースと同様に、ロールと認証を追加できます.
テンプレートspecは、アームJSONテンプレートとその異なるバージョンを格納できるオブジェクトです.このテンプレートのバージョンを展開する場合は、展開したいオブジェクトとバージョンへの参照を使用して、ARMテンプレートでそれを呼び出すことができます.
テンプレート仕様を作成するには、JSONテンプレートファイルとリソースグループが必要です.あなたがアップロードするテンプレートのバージョンに名前を付ける必要があります.
AZ PowerShellモジュールまたはAZ CLIの最新バージョンを使用する必要があります.
たとえば、このテンプレートを使用する場合は、vnetという名前を付けます.vsonリソースを作成する
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "vnetName": {
            "type": "string"
        },
        "vnetPrefix": {
            "type": "string"
        },
        "subnetName": {
            "type": "string"
        },
        "subnetPrefix": {
            "type": "string"
        }
    },
    "variables": {},
    "resources": [
        {
            "name": "[parameters('vnetName')]",
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2019-11-01",
            "location": "[resourceGroup().location]",
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[parameters('vnetPrefix')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[parameters('subnetName')]",
                        "properties": {
                            "addressPrefix": "[parameters('subnetPrefix')]"
                        }
                    }
                ]
            }
        }
    ],
    "outputs": {}
}
このテンプレートのために、私はバージョン名として「vnet - 1 - subnet . 0.1」を選びます.テンプレートspecを作成するには、テンプレートのスペックのためのリソースグループ、場所、および名前が必要になります.
また、テンプレートspecリソースにタグを追加することもできます.また、説明、バージョンの説明、およびdisplaynameを追加することができます.
vnetのtemplatespecを作成するには.JSONファイル.
New-AzTemplateSpec -Name VNET -ResourceGroupName 01-TPLSPECS  -Version "vnet-1-subnet.0.1"  -location westeurope -TemplateFile ./storage.json -tags @{"project"="vnet design"} -Description "store VNET ARM Template" -VersionDescription "Vnet with one subnet"  -DisplayName "Vnet deployment" 
つのサブネットを1つの代わりに別のバージョンを格納したいと思います.テンプレートファイルの変更後に、バージョンとversiondescription修飾で同じコマンドを実行できます
New-AzTemplateSpec -Name VNET -ResourceGroupName 01-TPLSPECS  -Version "vnet-2-subnet.0.1"  -location westeurope -TemplateFile ./storage.json -tags @{"project"="vnet design"} -Description "store VNET ARM Template" -VersionDescription "Vnet with two subnet"  -DisplayName "Vnet deployment" 
Azureリソースとして、ARMテンプレートを使用してテンプレート仕様を作成することもできます.マイクロソフトの2つのARMテンプレートリソースがあります.リソース/templatespecsとその子リソースマイクロソフト.リソース/templatespecs/バージョン.
このテンプレートを見てください.
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "templateSpecsName": {
            "type": "String"
        }
    },
    "variables": {},
    "resources": [
        {
            "type": "Microsoft.Resources/templateSpecs",
            "apiVersion": "2019-06-01-preview",
            "name": "[parameters('templateSpecsName')]",
            "location": "westeurope",
            "tags": {},
            "properties": {
            }
        },
        {
            "type": "Microsoft.Resources/templateSpecs/versions",
            "apiVersion": "2019-06-01-preview",
            "name": "[concat(parameters('templateSpecsName'), '/1.0.0.b')]",
            "location": "westeurope",
            "dependsOn": [
                "[resourceId('Microsoft.Resources/templateSpecs', parameters('templateSpecsName'))]"
            ],
            "properties": {
                "artifacts": [],
                "template": {

                        "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
                        "contentVersion": "1.0.0.0",
                        "parameters": {},
                        "functions": [],
                        "variables": {},
                        "resources": [
                            {
                                "name": "udsiuisdudisudsi",
                                "type": "Microsoft.Storage/storageAccounts",
                                "apiVersion": "2019-06-01",
                                "location": "[resourceGroup().location]",
                                "kind": "StorageV2",
                                "sku": {
                                    "name": "Premium_LRS",
                                    "tier": "Premium"
                                }
                            }
                        ],
                        "outputs": {}
                    }
                }
            }

    ]
}
マイクロソフトの中でテンプレートバージョンを作成できます.リソース/templatespecs/バージョン
Azureリソースとして、テンプレート仕様オブジェクトにロールを割り当てることができます.テンプレートを開発するチームと同じテンプレートを展開するために使用されるサービスプリンシパルを持っている状況をイメージします.貢献者役割をdevチームとリーダーロールにサービスプリンシパルに追加できます.
New-AzRoleAssignment -ObjectId (Get-AzADGroup -DisplayName 'arm-team').id  -RoleDefinitionName "Contributor" -Scope "/subscriptions/XXXXX-6200-4226-bac3-XXXXXXXX/resourceGroups/01-TPLSPECS/providers/Microsoft.Resources/templateSpecs/testarm01"

New-AzRoleAssignment -ObjectId (Get-AzADServicePrincipal -DisplayName 'spArmTemplate').id -RoleDefinitionName "Reader" -Scope "/subscriptions/XXXXX-6200-4226-bac3-XXXXXXXX/resourceGroups/01-TPLSPECS/providers/Microsoft.Resources/templateSpecs/testarm01"
これらの2つのPowerShellコマンドは、ARTER TeamのメンバーにTestarm 01 Template Specオブジェクトの作成、更新、削除のバージョンを許可し、サービスオブジェクトSparmTemplateが同じオブジェクトからデータを取得できるようにします.
TemplateSpecオブジェクトに関する情報を得るには、get aztemplatespec cmdletを使用します.
Get-AzTemplateSpec -Name VNET -ResourceGroupName 01-TPLSPECS
pstemplatespecオブジェクトを返す
Id                    : /subscriptions/XXXXXXXX/resourceGroups/01-TPLSPECS/providers/Microsoft.Resources/templateSpecs/VNET
Name                  : VNET
DisplayName           : Vnet deployment
ResourceGroupName     : 01-TPLSPECS
SubscriptionId        : XXXXXXXXXXX
Location              : westeurope
Tags                  : {[project, vnet design]}
Description           : store VNET ARM Template
Versions              : {vnet-1-subnet.0.1, vnet-2-subnet.0.1}
CreationTime(UTC)     : 01/29/2021 21:49:33
LastModifiedTime(UTC) : 01/29/2021 22:16:51
また、エクスポートAtemtemplatespec Cmdletを使用して、テンプレートの仕様からテンプレートをエクスポートすることが可能です.テンプレートspecとバージョンの名前をローカルフォルダとともに提供する必要があります.cmdletは存在しない場合はフォルダを作成し、名前の下にJSONテンプレートをエクスポートします.JSON
Export-AzTemplateSpec -Name VNET -ResourceGroupName 01-TPLSPECS  -Version "vnet-1-subnet.0.1" -OutputFolder v1
テンプレート版が展開され、テンプレートspecオブジェクトにアップロードされると、展開時に使用できます.テンプレートを呼び出すと、伝統的なテンプレートのリンクテクニックで使用すると同じリソースタイプを使用しますマイクロソフト.リソース/展開.しかし、最新のAPIバージョンを使用してください.TemplateLinkプロパティのURIを使用する代わりに、使用するテンプレート仕様のバージョンオブジェクトの参照を持つIDを使用する必要があります.
私の例では、vnet template specの"vnet - 1 - subnet . 0.1 "バージョンを01 - tplspecsリソースグループで使用したい場合.参考文献は次のとおりです.
"ResourceID (' 01 - tplspecs '、'マイクロソフト. resources/templatespecs/version '、' vnet ', ' vnet - 1 - subnet . 0.1 ')"
すべてのパラメータを持つテンプレート
{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {},
    "variables": {},
    "resources": [
        {
            "apiVersion": "2020-06-01",
            "name": "demo-tpl-spec01",
            "type": "Microsoft.Resources/deployments",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "id": "[resourceId('01-TPLSPECS', 'Microsoft.Resources/templateSpecs/versions', 'VNET', 'vnet-1-subnet.0.1')]"
                },
                "parameters": {
                    "vnetName": {
                        "value": "vnet01"
                    },
                    "vnetPrefix": {
                        "value": "10.0.0.0/21"
                    },
                    "subnetName": {
                        "value": "subnet01"
                    },
                    "subnetPrefix": {
                        "value": "10.0.0.0/24"
                    }
                }
            }
        }
    ],
    "outputs": {}
}
テンプレート仕様は、リンクされたテンプレートを管理する新しい方法を提供します.GitTubや他のインターネットに直面してストレージソリューションやazureストレージアカウントのような外部サービスに頼る代わりに、それはazureリソースを統合します.膨大な利点としてリンクされたテンプレートを管理するためにAzureリソースを使用して、統一アクセス管理システム、Azureロールベースのアクセス制御.
テンプレートSpecの中に複数のテンプレートの複数のバージョンを格納し、テンプレートテンプレートごとにテンプレート仕様を作成できます.また、プロジェクトごとに1つのテンプレート仕様を使用することができますし、必要に応じて任意の種類のテンプレートをホストします.
ARMテンプレート仕様の詳細については、Microsoft Doc Pageを参照してください