Linked ARM templates avec _artifactsLocation et _artifactsLocationSasToken

Tanguy SCHOUBERT
Publié par Tanguy SCHOUBERT
Catégorie : Azure / Logic Apps / Template ARM
03/11/2020

Pourquoi _artifactsLocation & _artifactsLocationSasToken ?

 

Comme indiqué dans la documentation Microsoft, il est possible d’utiliser ces paramètres pour référencer des linked templates ARM. Il y a deux raisons de faire cela : ne pas se soucier de provisionner un storage account, ni d’y uploader nos templates ARM « à la main » avant chaque déploiement.

Dans cet exemple nous voulons déployer une Logic App ainsi qu’une API Connection ServiceBus. C’est pourquoi nous allons créer un template master référençant ces deux templates.

 

Visual Studio

 

Dans Visual Studio, on crée un projet de type Azure Resource Group sans template spécifique. Cela nous permet de récupérer un script PowerShell auto-généré : Deploy-AzureResourceGroup.ps1. C’est ce script que nous allons utiliser pour déployer ensuite nos ressources, avec ou sans Visual Studio.

 

ARM templates

 

Voici le contenu de notre template ARM master :

 

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "_artifactsLocation": {
            "type": "string"
        },
        "_artifactsLocationSasToken": {
            "type": "securestring"
        },
        "logicapp_name": {
            "type": "string"
        },
        "connections_servicebus_name": {
            "type": "string"
        },
        "connections_servicebus_connectionstring": {
            "type": "securestring"
        }
    },
    "variables": {
    },
    "resources": [
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2017-05-10",
            "name": "linkedTemplate_logicapp",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('_artifactsLocation'), '/my_logicapp_template.json', parameters('_artifactsLocationSasToken'))]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "logicapp_name": {
                        "value": "[parameters('logicapp_name')]"
                    }
                }
            },
            "dependsOn": [
                "linkedTemplate_apiconnection"
            ]
        },
        {
            "type": "Microsoft.Resources/deployments",
            "apiVersion": "2017-05-10",
            "name": "linkedTemplate_apiconnection",
            "properties": {
                "mode": "Incremental",
                "templateLink": {
                    "uri": "[concat(parameters('_artifactsLocation'), '/my_apiconnection_template.json', parameters('_artifactsLocationSasToken'))]",
                    "contentVersion": "1.0.0.0"
                },
                "parameters": {
                    "connections_servicebus_name": {
                        "value": "[parameters('connections_servicebus_name')]"
                    },
                    "connections_servicebus_connectionstring": {
                        "value": "[parameters('connections_servicebus_connectionstring')]"
                    }
                }
            }
        }
    ],
    "outputs": {
    }
}

 

Il est important de noter que j’ai ajouté à la liste des paramètres _artifactsLocation et _artifactsLocationSasToken, respectivement de type string et securestring. Ces paramètres sont utilisés pour former l’uri du templateLink avec la syntaxe suivante : [concat(parameters(‘_artifactsLocation’), ‘/my_template.json’, parameters(‘_artifactsLocationSasToken’))].

Il n’est pas nécessaire de spécifier leur valeur, ceci sera fait automatiquement à l’exécution du script PowerShell. Il faut en revanche les initialiser dans le fichier de paramètres :

 

"parameters": {
    "_artifactsLocation": {
        "value": ""
    },
    "_artifactsLocationSasToken": {
        "value": ""
    }
    // other parameters
}

 

Déploiement

 

Le script Deploy-AzureResourceGroup.ps1 contient au début des paramètres qu’il vous faut remplacer avec les bonnes valeurs. Il y a également une autre modification à faire dans le script, remplacer la condition :

null -eq $OptionalParameters[$ArtifactsLocationName]

Par :

"" -eq $OptionalParameters[$ArtifactsLocationName]

 

De même pour $ArtifactsLocationSasTokenName.

Ne pas oublier également d’initialiser une session PowerShell connectée à votre compte et à votre souscription :

Connect-AzAccount
Set-AzContext -SubscriptionId $subscriptionId

 

Enfin lancer le script avec l’option -UploadArtifacts :

./Deploy-AzureResourceGroup.ps1 -UploadArtifacts

 

Dans la trace d’exécution nous pouvons voir que les deux templates sont uploadés avant d’être déployés via le template master.