Démarrage rapide : Créer et publier une définition d’application managée Azure

Ce guide de démarrage rapide offre une présentation de l’utilisation des applications managées Azure. Vous créez et publiez une définition d’application managée stockée dans votre catalogue de services et destinée aux membres de votre organisation.

Pour publier une application managée dans votre catalogue de services, effectuez les tâches suivantes :

  • Créer un modèle ARM (Azure Resource Manager) qui définit les ressources à déployer avec l’application managée.
  • Définir les éléments d’interface utilisateur du portail lors du déploiement de l’application managée.
  • Créez un package .zip qui contient les fichiers JSON nécessaires. Le fichier de package .zip a une limite de 120 Mo pour la définition d’application managée d’un catalogue de services.
  • Publiez la définition d’application managée pour qu’elle soit disponible dans votre catalogue de services.

Si votre définition d’application managée est supérieure à 120 Mo ou si vous souhaitez utiliser votre propre compte de stockage pour les raisons de conformité de votre organisation, accédez à Démarrage rapide et apportez votre propre stockage pour créer et publier une définition d’application managée Azure.

Vous pouvez utiliser Bicep pour développer une définition d’application managée mais elle doit être convertie en modèle ARM JSON avant de pouvoir publier la définition dans Azure. Si vous souhaitez en savoir plus, veuillez consulter la rubrique Démarrage rapide : utiliser Bicep pour créer, puis publier une définition d’application managée Azure.

Vous pouvez également utiliser Bicep pour déployer une définition d’application managée depuis votre catalogue de services. Pour plus d’informations, consultez Démarrage rapide : utiliser Bicep pour déployer une définition d’application managée Azure.

Prérequis

Pour suivre ce guide de démarrage rapide, vous devez disposer des éléments suivants :

Créer le modèle ARM

Chaque définition d’application managée contient un fichier nommé mainTemplate.json. Le modèle définit les ressources Azure à déployer, et n’est pas différent d’un modèle ARM standard.

Ouvrez Visual Studio Code, créez un fichier avec le nom mainTemplate.json (avec respect de la casse) et enregistrez-le.

Ajoutez le code JSON suivant et enregistrez le fichier. Il définit les ressources nécessaires pour déployer un App Service, plan App Service, et un compte de stockage pour l’application. Ce compte de stockage n’est pas utilisé pour stocker la définition d’application managée.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "appServicePlanName": {
      "type": "string",
      "maxLength": 40,
      "metadata": {
        "description": "App Service plan name."
      }
    },
    "appServiceNamePrefix": {
      "type": "string",
      "maxLength": 47,
      "metadata": {
        "description": "App Service name prefix."
      }
    },
    "storageAccountNamePrefix": {
      "type": "string",
      "maxLength": 11,
      "metadata": {
        "description": "Storage account name prefix."
      }
    },
    "storageAccountType": {
      "type": "string",
      "allowedValues": [
        "Premium_LRS",
        "Standard_LRS",
        "Standard_GRS"
      ],
      "metadata": {
        "description": "Storage account type allowed values"
      }
    }
  },
  "variables": {
    "appServicePlanSku": "F1",
    "appServicePlanCapacity": 1,
    "appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
    "storageAccountName": "[format('{0}{1}', parameters('storageAccountNamePrefix'), uniqueString(resourceGroup().id))]"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2022-03-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-03-01",
      "name": "[variables('appServiceName')]",
      "location": "[parameters('location')]",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "httpsOnly": true,
        "siteConfig": {
          "appSettings": [
            {
              "name": "AppServiceStorageConnectionString",
              "value": "[format('DefaultEndpointsProtocol=https;AccountName={0};EndpointSuffix={1};Key={2}', variables('storageAccountName'), environment().suffixes.storage, listKeys(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').keys[0].value)]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2022-09-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-03-01').defaultHostName]"
    },
    "storageAccount": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2022-09-01').primaryEndpoints.blob]"
    }
  }
}

Définissez votre expérience du portail

En tant qu’éditeur, vous définissez l’expérience du portail pour créer l’application managée. Le fichier createUiDefinition.json génère l’interface utilisateur du portail. Vous définissez comment les utilisateurs fournissent une entrée pour chaque paramètre à l’aide d’éléments de contrôle tels que des listes déroulantes et des zones de texte.

Dans cet exemple, l’interface utilisateur vous invite à entrer le préfixe de nom App Service, le nom de plan App Service, le préfixe et le type du compte de stockage. Pendant le déploiement, les variables de mainTemplate.json utilisent la fonction uniqueString pour ajouter une chaîne de 13 caractères aux préfixes des noms afin que les noms soient globalement uniques dans Azure.

Ouvrez Visual Studio Code, créez un fichier avec le nom createUiDefinition.json (avec respect de la casse) et enregistrez-le.

Ajoutez le code JSON suivant au fichier, puis enregistrez-le.

{
  "$schema": "https://schema.management.azure.com/schemas/0.1.2-preview/CreateUIDefinition.MultiVm.json#",
  "handler": "Microsoft.Azure.CreateUIDef",
  "version": "0.1.2-preview",
  "parameters": {
    "basics": [
      {}
    ],
    "steps": [
      {
        "name": "webAppSettings",
        "label": "Web App settings",
        "subLabel": {
          "preValidation": "Configure the web app settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "appServicePlanName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service plan name",
            "placeholder": "App Service plan name",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with a maximum of 40 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{1,40}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a maximum of 40 characters."
            },
            "visible": true
          },
          {
            "name": "appServiceName",
            "type": "Microsoft.Common.TextBox",
            "label": "App Service name prefix",
            "placeholder": "App Service name prefix",
            "defaultValue": "",
            "toolTip": "Use alphanumeric characters or hyphens with minimum of 2 characters and maximum of 47 characters.",
            "constraints": {
              "required": true,
              "regex": "^[a-z0-9A-Z-]{2,47}$",
              "validationMessage": "Only alphanumeric characters or hyphens are allowed, with a minimum of 2 characters and maximum of 47 characters."
            },
            "visible": true
          }
        ]
      },
      {
        "name": "storageConfig",
        "label": "Storage settings",
        "subLabel": {
          "preValidation": "Configure the storage settings",
          "postValidation": "Completed"
        },
        "elements": [
          {
            "name": "storageAccounts",
            "type": "Microsoft.Storage.MultiStorageAccountCombo",
            "label": {
              "prefix": "Storage account name prefix",
              "type": "Storage account type"
            },
            "toolTip": {
              "prefix": "Enter maximum of 11 lowercase letters or numbers.",
              "type": "Available choices are Standard_LRS, Standard_GRS, and Premium_LRS."
            },
            "defaultValue": {
              "type": "Standard_LRS"
            },
            "constraints": {
              "allowedTypes": [
                "Premium_LRS",
                "Standard_LRS",
                "Standard_GRS"
              ]
            },
            "visible": true
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
      "appServiceNamePrefix": "[steps('webAppSettings').appServiceName]",
      "storageAccountNamePrefix": "[steps('storageConfig').storageAccounts.prefix]",
      "storageAccountType": "[steps('storageConfig').storageAccounts.type]"
    }
  }
}

Pour en savoir plus, consultez la page Prise en main de CreateUiDefinition.

Empaqueter les fichiers

Ajoutez les deux fichiers au fichier de package nommé app.zip. Les deux fichiers doivent se trouver au niveau racine du fichier .zip. Si les fichiers sont dans un dossier, lorsque vous créez la définition d’application managée, une erreur vous indique que les fichiers nécessaires ne sont pas présents.

Chargez app.zip sur un compte de stockage Azure afin de pouvoir l’utiliser lorsque vous déployez la définition de l’application managée. Le nom du compte de stockage doit être globalement unique dans Azure, et la longueur doit être comprise entre trois et 24 caractères avec uniquement des lettres minuscules et des chiffres. Dans la commande, remplacez l’espace réservé <demostorageaccount>, y compris les chevrons (<>), par le nom de votre compte de stockage unique.

Dans Visual Studio Code, ouvrez un nouveau terminal PowerShell et connectez-vous à votre abonnement Azure.

Connect-AzAccount

La commande ouvre votre navigateur par défaut et vous invite à vous connecter à Azure. Pour plus d’informations, accédez à Se connecter avec Azure PowerShell.

New-AzResourceGroup -Name packageStorageGroup -Location westus3

$storageAccount = New-AzStorageAccount `
  -ResourceGroupName packageStorageGroup `
  -Name "<demostorageaccount>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

$ctx = $storageAccount.Context

New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob

Set-AzStorageBlobContent `
  -File "app.zip" `
  -Container appcontainer `
  -Blob "app.zip" `
  -Context $ctx

Créer la définition d’application gérée

Dans cette section, vous obtenez des informations d’identité à partir de Microsoft Entra ID, créez un groupe de ressources et déployez la définition d’application managée.

Obtenir l’ID du groupe et l’ID de définition de rôle

L’étape suivante consiste à sélectionner un utilisateur, un groupe de sécurité ou une application afin de gérer les ressources pour le client. Cette identité dispose des autorisations sur le groupe de ressources managées en fonction du rôle attribué. Le rôle peut être n’importe quel rôle intégré Azure comme Propriétaire ou Contributeur.

Cet exemple utilise un groupe de sécurité, et votre compte Microsoft Entra doit être membre du groupe. Pour obtenir l’ID d’objet du groupe, remplacez l’espace réservé <managedAppDemo>, y compris les crochets (<>), par le nom de votre groupe. Vous utilisez la valeur de cette variable lorsque vous déployez la définition de l’application managée.

Pour créer un groupe Microsoft Entra, accédez à Gérer les groupes Microsoft Entra et l’appartenance au groupe.

$principalid=(Get-AzADGroup -DisplayName <managedAppDemo>).Id

Obtenez ensuite l’ID de définition de rôle du rôle intégré Azure auquel vous souhaitez accorder l’accès à l’utilisateur, au groupe ou à l’application. Vous utilisez la valeur de cette variable lorsque vous déployez la définition de l’application managée.

$roleid=(Get-AzRoleDefinition -Name Owner).Id

Publier la définition d’application managée

Créez un groupe de ressources pour la définition de votre application managée.

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

La commande blob crée une variable pour stocker l’URL du fichier .zip du package. Cette variable est utilisée dans la commande qui crée la définition de l’application managée.

$blob = Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx

New-AzManagedApplicationDefinition `
  -Name "sampleManagedApplication" `
  -Location "westus3" `
  -ResourceGroupName appDefinitionGroup `
  -LockLevel ReadOnly `
  -DisplayName "Sample managed application" `
  -Description "Sample managed application that deploys web resources" `
  -Authorization "${principalid}:$roleid" `
  -PackageFileUri $blob.ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

Une fois la commande terminée, vous avez une définition de l’application managée dans votre groupe de ressources.

Certains des paramètres utilisés dans cet exemple sont les suivants :

  • ResourceGroupName : nom du groupe de ressources dans lequel la définition de l’application managée est créée.
  • LockLevel : le lockLevel du groupe de ressources managées empêche le client d’effectuer des opérations indésirables sur ce groupe de ressources. Actuellement, ReadOnly est le seul niveau de verrou pris en charge. ReadOnly spécifie que le client peut uniquement lire les ressources présentes dans le groupe de ressources managées. Les identités de l’éditeur dont l’accès est octroyé au groupe de ressources managées sont exemptées du niveau de verrou.
  • Authorization : décrit l’ID principal et l’ID de définition de rôle utilisés pour accorder des autorisations au groupe de ressources managées.
    • "${principalid}:$roleid" ou vous pouvez utiliser des accolades pour chaque variable "${principalid}:${roleid}".
    • Utilisez des virgules pour séparer plusieurs valeurs : "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri : emplacement d’un package .zip qui contient les fichiers requis.

Assurez-vous que les utilisateurs peuvent voir votre définition.

Vous avez accès à la définition de l’application managée, mais vous souhaitez vous assurer que d’autres utilisateurs de votre organisation peuvent y accéder. Accordez-leur au moins le rôle Lecteur dans la définition. Ils ont peut-être hérité de ce niveau d’accès suite à l’abonnement ou au groupe de ressources. Pour vérifier qui a accès à la définition et ajouter des utilisateurs ou des groupes, consultez Attribuer des rôles Azure à l’aide du portail Azure.

Nettoyer les ressources

Si vous prévoyez de déployer la définition, passez à la section Étapes suivantes qui établit un lien vers l’article pour déployer la définition.

Si vous avez terminé la définition d’application managée, vous pouvez supprimer les groupes de ressources que vous avez créés et qui se nomment packageStorageGroup et appDefinitionGroup.

La commande vous invite à confirmer que vous souhaitez supprimer le groupe de ressources.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

Étapes suivantes

Vous avez publié la définition d’application managée. L’étape suivante consiste à apprendre à déployer une instance de cette définition.