Partager via


Déploiement par programmation des produits de la Place de marché

Cet article explique comment utiliser Azure CLI, Azure PowerShell et Terraform pour déployer des ressources de produits de la Place de marché sur Azure.

Prérequis

Vous devez installer Azure PowerShell et vous connecter à Azure :

Les commandes de déploiement ont changé dans la version 2.2.0 d’Azure CLI. Les exemples de cet article nécessitent la Azure CLI version 2.20.0 ou une version ultérieure.

Pour exécuter cet exemple, installez la dernière version d’Azure CLI. Pour démarrer, exécutez az sign-in pour créer une connexion avec Azure.

Comment trouver des identificateurs de produit de la Place de marché pour l’éditeur, l’offre et le plan

Pour déployer par programme le produit de la Place de marché, vous devez d’abord obtenir les identificateurs uniques d’un produit de la Place de marché.

Pour rechercher les identificateurs uniques :

  1. Ouvrez le Portail Azure et accédez à l’expérience de la Place de marché.
  2. Rechercher le produit de la Place de marché que vous souhaitez déployer
  3. Ouvrez la page des détails du produit en sélectionnant le nom du produit.
  4. Accédez à l’onglet Informations d’utilisation + Support . Dans les informations d’utilisation, l’ID du serveur de publication, l’ID de produit et l’ID de plan s’affichent.

Capture d’écran de la page ID de produit.

Remarque

Dans certaines API, l’ID de produit est également appelé ID d’offre, et l’ID de plan est également appelé ID de référence SKU.

Machine virtuelle à partir de la Place de marché Azure

Pour déployer des machines virtuelles tierces à partir de Place de marché Azure, vous devez d’abord accepter le Contrat de licence utilisateur final (CLUF) pour l’image de machine virtuelle en cours de déploiement. Une fois que le CLUF est accepté une fois dans un abonnement Azure, vous devez être en mesure de déployer à nouveau la même offre de machine virtuelle sans avoir à accepter les conditions. Si vous déployez la machine virtuelle à partir de Portail Azure, les termes sont acceptés. Toutefois, lorsque vous effectuez le déploiement par programmation, vous devez accepter les termes utilisant ou az vm image terms accept --publisher X --offer Y --plan Z en utilisant ARM.

Si les termes ne sont pas encore acceptés, l’erreur suivante s’affiche :

Code : MarketplacePurchaseEligibilityFailed
Message: Marketplace purchase eligibility check returned errors. See inner errors for details
Details: Offer with PublisherId: '<PublisherId>', OfferId: '<OfferId>' cannot be purchased due to validation errors. For more information see details. Correlation Id: 'aaaa0000-bb11-2222-33cc-444444dddddd' You have not accepted the legal terms on this subscription: 'aaaa0000-bb11-2222-33cc-444444dddddd' for this plan. Before the subscription can be used, you need to accept the legal terms of the image. To read and accept legal terms, use the Azure CLI commands described at https://go.microsoft.com/fwlink/?linkid=2110637 or the PowerShell commands available at https://go.microsoft.com/fwlink/?linkid=862451. Alternatively, deploying via the Azure portal provides a UI experience for reading and accepting the legal terms.

Déployer une machine virtuelle à partir de la Place de marché Azure à l’aide d’Azure CLI

Une fois les termes acceptés, vous pouvez déployer la machine virtuelle à l’aide des méthodes régulières telles que le modèle ARM/Bicep, Azure CLI, Terraform, etc.

Pour en savoir plus sur la recherche d’images de machine virtuelle, acceptez les termes et déployez la machine virtuelle à l’aide de l’interface CLI, consultez Rechercher et utiliser les informations du plan d’achat de la Place de marché à l’aide de l’interface CLI.

Déployer une machine virtuelle à partir de la Place de marché Azure à l’aide de Terraform

Instructions sur le déploiement de Machines Virtuelles à l’aide de Terraform pour une machine virtuelle Windows ou une machine virtuelle Linux.

Pour utiliser Terraform pour déployer des machines virtuelles de la Place de marché, vous devez effectuer les actions suivantes :

  1. Acceptez les termes juridiques du produit de machine virtuelle à l’aide de azurerm_marketplace_agreement

  2. Spécifier le plan bloc dans le fournisseur azurerm_virtual_machine

Remarque

Si le bloc de plan n’est pas spécifié, le déploiement échoue avec l’erreur suivante :

Code: VMMarketplaceInvalidInput Message: Creating a virtual machine from Marketplace image or a custom image sourced from a Marketplace image requires Plan information in the request. VM: '/subscriptions/<Subscription ID>/resourceGroups/myResourceGroup/providers/Microsoft.Compute/virtualMachines/myVM

Remarque

azurerm_marketplace_agreement est traitée comme une ressource Terraform. Par conséquent, la première fois que vous créez un produit de machine virtuelle de la Place de marché spécifique, une ressource unique est créée pour représenter le fait que les termes juridiques ont été acceptés. Toutefois, la prochaine fois que vous essayez de déployer une autre machine virtuelle (avec le même ID de serveur de publication et l’ID d’offre) sous le même abonnement Azure, vous obtiendrez une erreur :

A resource with the ID "/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e /providers/Microsoft.MarketplaceOrdering/agreements/<Publisher ID>/offers/<Product ID>/plans/<Plan ID>" already exists - to be managed via Terraform this resource needs to be imported into the State. Please see the resource documentation for "azurerm_marketplace_agreement" for more information

Vous devez exécuter Terraform state list pour voir si vous avez azurerm_marketplace_agreement’état de ressource, et si vous n’avez pas besoin d’importer l’état de la ressource dans votre état Terraform.

terraform import azurerm_marketplace_agreement.<TerraformResourceName> /subscriptions/<AzureSubscriptionId>/providers/Microsoft.MarketplaceOrdering/agreements/<Publisher ID>/offers/<Product ID>/plans/<Plan ID>

Offre SaaS à partir de la Place de marché Azure

Les offres SaaS sont généralement déployées par les clients via le Portail Azure. Une fois l’offre SaaS déployée à l’aide de Portail Azure, le client utilise le bouton « Configurer le compte maintenant » pour visiter la page d’accueil de l’ÉDITEUR SaaS et terminer la configuration de l’offre SaaS. Une fois l’offre configurée, l’ISV SaaS l’active à l’aide de l’API de traitement SaaS.

Lorsque vous déployez une offre SaaS via le Portail Azure, elle crée un modèle ARM et affecte des valeurs de paramètres spécifiques pour le déploiement. L’un des paramètres est termId, qui identifie le terme d’abonnement de l’offre. La valeur termId n’est pas statique, mais dépend de la configuration de l’offre et du temps de déploiement. Par conséquent, vous ne pouvez pas utiliser de valeur fixe pour termId dans votre modèle ARM. Au lieu de cela, vous devez connaître la valeur termId actuelle en procédant comme suit :

  1. Déployez l’offre manuellement via le Portail Azure.
  2. Accédez au groupe de ressources où l’offre est déployée.
  3. Sélectionnez le nom du déploiement dans la section Déploiements.
  4. Affichez les paramètres d’entrée et copiez la valeur de termId.

Si une offre SaaS donnée n’a jamais été déployée dans l’abonnement Azure, le déploiement par programmation échoue avec une erreur semblable à ce qui suit :

code: DeploymentFailed

message: At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage

Details: Failed to process eligibility check with error Purchase has failed due to signature verification on Marketplace legal agreement. Please retry. If error persists use different Azure subscription, or contact support with correlation-id 'aaaa0000-bb11-2222-33cc-444444dddddd' and this error message

Déployer une offre SaaS à l’aide d’un modèle ARM et d’Azure CLI

Consultez l’exemple de modèle ARM.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string"
        },
        "planId": {
            "type": "string"
        },
        "offerId": {
            "type": "string"
        },
        "publisherId": {
            "type": "string"
        },
        "quantity": {
            "type": "int"
        },
        "termId": {
            "type": "string"
        },
        "azureSubscriptionId": {
            "type": "string"
        },
        "publisherTestEnvironment": {
            "type": "string",
            "defaultValue": ""
        },
        "autoRenew": {
            "type": "bool"
        }
    },
    "resources": [
        {
            "type": "Microsoft.SaaS/resources",
            "apiVersion": "2018-03-01-beta",
            "name": "[parameters('name')]",
            "location": "global",
            "properties": {
                "saasResourceName": "[parameters('name')]",
                "publisherId": "[parameters('publisherId')]",
                "SKUId": "[parameters('planId')]",
                "offerId": "[parameters('offerId')]",
                "quantity": "[parameters('quantity')]",
                "termId": "[parameters('termId')]",
                "autoRenew": "[parameters('autoRenew')]",
                "paymentChannelType": "SubscriptionDelegated",
                "paymentChannelMetadata": {
                    "AzureSubscriptionId": "[parameters('azureSubscriptionId')]"
                },
                "publisherTestEnvironment": "[parameters('publisherTestEnvironment')]",
                "storeFront": "AzurePortal"
            }
        }
    ]
}

  • Enregistrer le fichier ci-dessus sous SaaS-ARM.json
  • Exécutez les commandes suivantes :
az group create --resource-group <ResourceGroupName> --location <Location>

az deployment group create --resource-group <Resource Group Name> --template-file ./SaaS-ARM.json --parameters name=<SaaS Resource Name> publisherId=<Publisher ID> offerId=<Product ID> planId=<Plan ID> termId=<termId> quantity=1 azureSubscriptionId=11111111-1111-1111-1111-11111111 autoRenew=true

Une fois la ressource d’offre SaaS configurée, vous pouvez appeler l’API ARM suivante pour afficher ses propriétés :

az rest --method get --uri /subscriptions/<AzureSubscriptionId>/resourceGroups/<ResourceGroupName>/providers/Microsoft.SaaS/resources/<SaaS Resource Name>?api-version=2018-03-01-beta -o json

Vous pouvez maintenant effectuer un POST appel pour obtenir le jeton de la Place de marché et l’URL de la page d’accueil. Cette URL peut être utilisée pour parcourir la page d’accueil de l’ISV SaaS pour terminer la configuration et l’activation de l’offre SaaS.

az rest --method post --uri /subscriptions/<AzureSubscriptionId>/resourceGroups/<ResourceGroupName> /providers/Microsoft.SaaS/resources/<SaaS Resource Name>/listAccessToken?api-version=2018-03-01-beta -o json

Vous trouverez plus d’informations ici : spécification du fournisseur de ressources Microsoft.SaaS.

Déployer une offre SaaS à partir de la Place de marché Azure à l’aide de Terraform

Passez en revue la section ci-dessus décrivant comment déployer une offre SaaS à l’aide d’ARM, car le déploiement terraform utiliserait la même chose que l’utilisation du modèle ARM.

Application Azure à partir de la Place de marché Azure

Le type de produit Azure Application est une offre unique qui permet au serveur de publication de créer un modèle ARM qui inclut un ensemble de ressources Azure et de produits de la Place de marché groupés et configurés pour fournir des applications multi-ressources entièrement fonctionnelles, Azure Application a trois types de plan :

  • Modèle de solution : offre gratuite, déploiement de modèle ARM
  • Applications managées : offre gratuite ou payante, crée un type de ressource Microsoft.Solutions/applications

Portail Azure génère un modèle ARM pour le déploiement d’applications Azure (application managée). Ce modèle ARM crée une ressource de type Microsoft.Solutions/applications qui pointe vers un plan spécifique et passe les paramètres spécifiques à l’application à partir des champs d’interface utilisateur que le client remplit dans Portail Azure.

Accepter les termes de l’application managée Azure

Comme l’offre de machine virtuelle, pour déployer l’application Azure (application managée) par programmation à l’aide du modèle ARM dans un abonnement Azure, l’abonnement doit accepter les termes du plan de l’application managée Azure. Lorsqu’elles sont déployées via le Portail Azure, les conditions d’acceptation se produisent implicitement et ultérieurement dans les déploiements programmatiques du même plan dans le même abonnement Azure fonctionnent sans problème.

Il est également possible d’accepter les conditions d’une offre d’application Azure (application managée) à l’aide des mêmes az vm image terms accept que celles décrites ci-dessus dans la section de la machine virtuelle.

Si le produit Azure Application (Application managée) est un produit payant (par exemple, il utilise une facturation mensuelle ou limitée), l’abonnement Azure que vous utilisez pour le déployer doit être associé à un mode de paiement valide (par exemple, il ne peut pas s’agir d’un abonnement gratuit ou parrainé).

Déployer une application Azure (application managée) à l’aide d’un modèle ARM et d’Azure CLI

Vous trouverez ci-dessous un exemple de modèle ARM pour déployer une application managée.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "type": "string",
            "allowedValues": [
                "westus2",
                "westeurope",
                "eastus",
                "northeurope",
                "centralus",
                "eastus2",
                "francecentral",
                "uksouth"
            ]
        },
        "applicationResourceName": {
            "type": "string"
        },
        "managedResourceGroupId": {
            "type": "string",
            "defaultValue": ""
        },
        "managedIdentity": {
            "type": "object",
            "defaultValue": {}
        },
        "initialConsulVersion": {
            "type": "string",
            "defaultValue": "v1.11.2"
        },
        "storageAccountName": {
            "type": "string",
            "defaultValue": "[concat('storage', uniqueString(resourceGroup().id, deployment().name))]"
        },
        "blobContainerName": {
            "type": "string",
            "defaultValue": "[concat('blob', uniqueString(resourceGroup().id, deployment().name))]"
        },
        "identityName": {
            "type": "string",
            "defaultValue": "[concat(parameters('clusterName'), '-identity')]"
        },
        "clusterMode": {
            "type": "string",
            "defaultValue": "PRODUCTION",
            "allowedValues": [
                "PRODUCTION",
                "DEVELOPMENT"
            ]
        },
        "clusterName": {
            "type": "string",
            "defaultValue": "cluster"
        },
        "consulDataCenter": {
            "type": "string",
            "defaultValue": "dc1"
        },
        "numServers": {
            "type": "string",
            "defaultValue": "3"
        },
        "numServersDevelopment": {
            "type": "string",
            "defaultValue": "1"
        },
        "automaticUpgrades": {
            "type": "string",
            "defaultValue": "disabled"
        },
        "consulConnect": {
            "type": "string",
            "defaultValue": "enabled"
        },
        "externalEndpoint": {
            "type": "string",
            "defaultValue": "enabled"
        },
        "snapshotInterval": {
            "type": "string",
            "defaultValue": "1d"
        },
        "snapshotRetention": {
            "type": "string",
            "defaultValue": "1m"
        },
        "consulVnetCidr": {
            "type": "string",
            "defaultValue": "172.25.16.0/24"
        },
        "providerBaseURL": {
            "defaultValue": "https://ama-api.hashicorp.cloud/consulama/2021-04-23",
            "type": "String",
            "metadata": {
                "description": "The URI of the custom provider API"
            }
        },
        "email": {
            "type": "string"
        },
        "federationToken": {
            "type": "string",
            "defaultValue": ""
        },
        "sourceChannel": {
            "type": "string",
            "defaultValue": "azure-portal"
        },
        "auditLoggingEnabled": {
            "type": "string",
            "defaultValue": "disabled",
            "allowedValues": [
                "enabled",
                "disabled"
            ]
        },
        "auditLogStorageContainerURL": {
            "type": "string",
            "defaultValue": ""
        }
    },
    "variables": {
    },
    "resources": [
        {
            "type": "Microsoft.Solutions/applications",
            "apiVersion": "2017-09-01",
            "name": "[parameters('applicationResourceName')]",
            "location": "[parameters('location')]",
            "kind": "MarketPlace",
            "identity": "[if(empty(parameters('managedIdentity')),json('null'),parameters('managedIdentity'))]",
            "plan": {
                "name": "<Plan ID>",
                "product": "<Product ID>",
                "publisher": "<Publisher ID>",
                "version": "<Version>"
            },
            "properties": {
                "managedResourceGroupId": "[parameters('managedResourceGroupId')]",
                "parameters": {
                    "initialConsulVersion": {
                        "value": "[parameters('initialConsulVersion')]"
                    },
                    "storageAccountName": {
                        "value": "[parameters('storageAccountName')]"
                    },
                    "blobContainerName": {
                        "value": "[parameters('blobContainerName')]"
                    },
                    "identityName": {
                        "value": "[parameters('identityName')]"
                    },
                    "clusterMode": {
                        "value": "[parameters('clusterMode')]"
                    },
                    "clusterName": {
                        "value": "[parameters('clusterName')]"
                    },
                    "consulDataCenter": {
                        "value": "[parameters('consulDataCenter')]"
                    },
                    "numServers": {
                        "value": "[parameters('numServers')]"
                    },
                    "numServersDevelopment": {
                        "value": "[parameters('numServersDevelopment')]"
                    },
                    "automaticUpgrades": {
                        "value": "[parameters('automaticUpgrades')]"
                    },
                    "consulConnect": {
                        "value": "[parameters('consulConnect')]"
                    },
                    "externalEndpoint": {
                        "value": "[parameters('externalEndpoint')]"
                    },
                    "snapshotInterval": {
                        "value": "[parameters('snapshotInterval')]"
                    },
                    "snapshotRetention": {
                        "value": "[parameters('snapshotRetention')]"
                    },
                    "consulVnetCidr": {
                        "value": "[parameters('consulVnetCidr')]"
                    },
                    "location": {
                        "value": "[parameters('location')]"
                    },
                    "providerBaseURL": {
                        "value": "[parameters('providerBaseURL')]"
                    },
                    "email": {
                        "value": "[parameters('email')]"
                    },
                    "federationToken": {
                        "value": "[parameters('federationToken')]"
                    },
                    "sourceChannel": {
                        "value": "[parameters('sourceChannel')]"
                    },
                    "auditLoggingEnabled": {
                        "value": "[parameters('auditLoggingEnabled')]"
                    },
                    "auditLogStorageContainerURL": {
                        "value": "[parameters('auditLogStorageContainerURL')]"
                    }
                },
                "jitAccessPolicy": null
            }
        }
    ]
}

Exécutez ensuite les commande suivantes :

az group create --resource-group <Resource Group Name> --location <location>

az deployment group create --resource-group avmanagedapp100 --template-file <ARM Template JSON file> --parameters location=<location> applicationResourceName=<Resource Group Name> managedResourceGroupId=/subscriptions/<Subscription ID>/resourceGroups/<Resource Group Name>  email=<email address>

Déployer Azure Managed App à partir de la Place de marché Azure à l’aide de Terraform

Passez en revue la section ci-dessus décrivant comment déployer une offre Azure Managed App à l’aide d’ARM, car le déploiement terraform utiliserait le même modèle ARM.

Modèle de solution à partir de Place de marché Azure

Lorsque vous déployez des offres de modèle de solution (pas Azure Managed App) à partir de Place de marché Azure, le déploiement est simplement le modèle ARM publié par l’éditeur de logiciels indépendants avec les champs d’interface utilisateur correspondants passés en tant que paramètres. Pour déployer un modèle de solution par programmation, utilisez Portail Azure pour effectuer le déploiement, copier le modèle ARM et l’utiliser dans les déploiements suivants. Étant donné que les modèles de solution ne sont pas des offres « payantes », il n’existe pas de conditions spéciales qui doivent être acceptées. Toutefois, si le modèle ARM du modèle de solution fait référence à une image de machine virtuelle à partir de Place de marché Azure, vous devez d’abord accepter les conditions de l’offre de machine virtuelle comme décrit pour l’offre de machine virtuelle.