Compartir a través de


Implementación mediante programación de productos de Marketplace

En este artículo se explica cómo usar la CLI de Azure, Azure PowerShell y Terraform para implementar recursos de productos de Marketplace en Azure.

Requisitos previos

Debe instalar Azure PowerShell y conectarse a Azure:

Los comandos de implementación cambiaron en la CLI de Azure, versión 2.2.0. Los ejemplos de este artículo requieren la CLI de Azure, versión 2.20.0 o posterior.

Para ejecutar este ejemplo, instale la versión más reciente de la CLI de Azure. Para empezar, ejecute az sign-in para crear una conexión con Azure.

Procedimiento para buscar identificadores de producto de marketplace para anunciante, oferta y plan

Para implementar mediante programación el producto de Marketplace, primero debe obtener los identificadores únicos de un producto de Marketplace.

Para buscar los identificadores únicos:

  1. Abra Azure Portal y vaya a la experiencia de Marketplace.
  2. Busque el producto de Marketplace que desea implementar.
  3. Abra la página de detalles del producto seleccionando el nombre del producto.
  4. Vaya a la pestaña Información de uso y soporte técnico . En Información de uso, aparecen el identificador del publicador, el id. de producto y el identificador de plan.

Captura de pantalla de la página id. de producto.

Nota:

En algunas API, el identificador de producto también se conoce como id. de oferta y el identificador de plan también se conoce como identificador de SKU.

Máquina virtual desde Azure Marketplace

Para implementar máquinas virtuales de terceros desde Azure Marketplace, primero debe aceptar el Contrato de licencia de usuario final (CLUF) para la imagen de máquina virtual que se está implementando. Una vez que el CLUF se acepta una vez en una suscripción de Azure, debería poder volver a implementar la misma oferta de máquina virtual sin necesidad de aceptar los términos de nuevo. Si va a implementar la máquina virtual desde Azure Portal, los términos se aceptan allí. Sin embargo, al realizar la implementación mediante programación, debe aceptar los términos mediante az vm image terms accept --publisher X --offer Y --plan Z o mediante ARM.

Si aún no se aceptan los términos, se muestra el siguiente error:

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.

Implementación de una máquina virtual desde Azure Marketplace mediante la CLI de Azure

Una vez aceptados los términos, puede implementar la máquina virtual mediante los métodos normales, como la plantilla arm/Bicep, la CLI de Azure, Terraform, etcetera.

Para más información sobre cómo buscar imágenes de máquina virtual, acepte los términos e implemente la máquina virtual mediante la CLI, consulte Búsqueda y uso de la información del plan de compra de Marketplace mediante la CLI.

Implementación de una máquina virtual desde Azure Marketplace mediante Terraform

Instrucciones sobre cómo implementar máquinas virtuales mediante Terraform para máquinas virtuales Windows o máquinas virtuales Linux.

Para usar Terraform para implementar máquinas virtuales de Marketplace, debe realizar las siguientes acciones:

  1. Acepte los términos legales del producto de máquina virtual mediante azurerm_marketplace_agreement

  2. Especificar el plan bloque en el proveedor de azurerm_virtual_machine

Nota:

Si no se especifica el bloque de plan, se producirá un error en la implementación:

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

Nota:

azurerm_marketplace_agreement se trata como un recurso de Terraform, por lo tanto, la primera vez que se crea un producto de máquina virtual de Marketplace específico, se crea un recurso único para representar el hecho de que se aceptaron los términos legales. Sin embargo, la próxima vez que intente implementar otra máquina virtual (con el mismo identificador de publicador e id. de oferta) en la misma suscripción de Azure, obtendrá un error:

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

Debe ejecutar Terraform state list para ver si tiene azurerm_marketplace_agreement estado de recurso y, si no es necesario, importar el estado del recurso al estado de Terraform.

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

Oferta de SaaS desde Azure Marketplace

Las ofertas de SaaS suelen implementarse por los clientes a través de Azure Portal. Una vez implementada la oferta de SaaS mediante Azure Portal, el cliente usa el botón "Configurar cuenta ahora" para visitar la página de aterrizaje del ISV de SaaS y terminar de configurar la oferta de SaaS. Una vez configurada la oferta, el ISV de SaaS lo activa mediante la API de suministro de SaaS.

Al implementar una oferta de SaaS a través de Azure Portal, crea una plantilla de ARM y asigna valores de parámetro específicos para la implementación. Uno de los parámetros es termId, que identifica el término de suscripción de la oferta. El valor termId no es estático, pero depende de la configuración de la oferta y del tiempo de implementación. Por lo tanto, no puede usar un valor fijo para termId en la plantilla de ARM. En su lugar, debe averiguar el valor termId actual siguiendo estos pasos:

  1. Implemente la oferta manualmente a través de Azure Portal.
  2. Vaya al grupo de recursos donde se implementa la oferta.
  3. Seleccione el nombre de implementación en la sección Implementaciones.
  4. Vea los parámetros de entrada y copie el valor de termId.

Si una oferta de SaaS determinada nunca se implementó en la suscripción de Azure, la implementación mediante programación produce un error similar al siguiente:

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

Implementación de una oferta de SaaS mediante una plantilla de ARM y la CLI de Azure

Consulte la plantilla de ejemplo de 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"
            }
        }
    ]
}

  • Guarde lo anterior como SaaS-ARM.json
  • Ejecute los comandos siguientes:
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

Una vez aprovisionado el recurso de oferta de SaaS, puede invocar la siguiente API de ARM para ver sus propiedades:

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

Ahora puede realizar una POST llamada para obtener el token de Marketplace y la dirección URL de la página de aterrizaje. Esta dirección URL se puede usar para examinar la página de aterrizaje del ISV de SaaS para terminar de configurar y activar la oferta de 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

Puede encontrar más información aquí: especificación del proveedor de recursos Microsoft.SaaS.

Implementación de una oferta de SaaS desde Azure Marketplace mediante Terraform

Revise la sección anterior que describe cómo implementar una oferta de SaaS mediante ARM, ya que la implementación de Terraform usaría lo mismo que el uso de la plantilla de ARM.

Aplicación de Azure desde Azure Marketplace

App de Azure lication tipo de producto es una oferta única que permite al publicador crear una plantilla de ARM que incluya un conjunto de recursos de Azure y productos de Marketplace agrupados y configurados para proporcionar aplicaciones de varios recursos totalmente funcionales, App de Azure lication tiene tres tipos de plan:

  • Plantilla de solución: oferta gratuita, implementación de plantillas de ARM
  • Aplicaciones administradas: oferta gratuita o de pago, crea un tipo de recurso Microsoft.Solutions/applications.

Azure Portal genera una plantilla de ARM para la implementación de App de Azure lication (aplicación administrada). Esta plantilla de ARM crea un recurso de tipo Microsoft.Solutions/applications que apunta a un plan específico y pasa los parámetros específicos de la aplicación desde los campos de interfaz de usuario que el cliente rellena en Azure Portal.

Aceptación de los términos de la aplicación administrada de Azure

Al igual que la oferta de máquina virtual, para implementar la App de Azure lication (aplicación administrada) mediante programación mediante la plantilla de ARM en una suscripción de Azure, la suscripción debe aceptar los términos del plan de la aplicación administrada de Azure. Cuando se implementa a través de Azure Portal, las condiciones de aceptación se producen implícitamente y posteriores implementaciones mediante programación del mismo plan en la misma suscripción de Azure funcionan sin problemas.

También es posible aceptar los términos de una oferta de App de Azure lication (aplicación administrada) con lo mismo az vm image terms accept que se describe anteriormente en la sección vm.

Si el producto de App de Azure lication (aplicación administrada) es un producto de pago (por ejemplo, usa facturación mensual o de uso medido), la suscripción de Azure que usa para implementarla debe estar asociada a un método de pago válido (por ejemplo, no puede ser una suscripción gratuita o patrocinada).

Implementación de App de Azure lication (aplicación administrada) mediante la plantilla de ARM y la CLI de Azure

A continuación se muestra un ejemplo de plantilla de ARM para implementar la aplicación administrada.

{
    "$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
            }
        }
    ]
}

Luego, ejecute los siguientes comandos:

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>

Implementación de una aplicación administrada de Azure desde Azure Marketplace mediante Terraform

Revise la sección anterior que describe cómo implementar la oferta de Azure Managed App mediante ARM, ya que la implementación de Terraform usaría la misma plantilla de ARM.

Plantilla de solución de Azure Marketplace

Al implementar ofertas de plantilla de solución (no aplicación administrada de Azure) desde Azure Marketplace, la implementación es simplemente la plantilla de ARM que el ISV publicó con los campos de interfaz de usuario correspondientes pasados como parámetros. Para implementar la oferta de plantilla de solución mediante programación, use Azure Portal para realizar la implementación, copie la plantilla de ARM y úsela en las implementaciones posteriores. Dado que las plantillas de solución no son ofertas de "pago", no hay términos especiales que deben aceptarse. Sin embargo, si la plantilla de ARM de plantilla de solución hace referencia a una imagen de máquina virtual de Azure Marketplace, primero debe aceptar los términos de la oferta de máquina virtual, tal como se describe para la oferta de máquina virtual.