Compartilhar via


Implantação programática de produtos do Marketplace

Este artigo explica como usar a CLI do Azure, o Azure PowerShell e o Terraform para implantar recursos de produtos do Marketplace no Azure.

Pré-requisitos

Você precisa instalar o Azure PowerShell e se conectar ao Azure:

Os comandos de implantação foram alterados na CLI do Azure versão 2.2.0. Os exemplos neste artigo exigem a versão 2.20.0 ou posterior da CLI do Azure.

Para executar esta amostra, instale a última versão da CLI do Azure. Para começar, execute az sign-in para criar uma conexão com o Azure.

Como encontrar identificadores de produto do Marketplace para fornecedor, oferta e plano

Para implantar programaticamente o produto do Marketplace, primeiro você deve obter os identificadores exclusivos de um produto do Marketplace.

Para encontrar os identificadores exclusivos:

  1. Abra o portal do Azure e navegue até a experiência do Marketplace.
  2. Pesquise o produto do Marketplace que você deseja implantar
  3. Abra a página de detalhes do produto selecionando o nome do produto.
  4. Navegue até a guia Informações de uso + suporte . Em Informações de Uso, a ID do Editor, a ID do Produto e a ID do Plano são exibidas.

Captura de tela da página de ID do produto.

Observação

Em algumas APIs, a ID do Produto também é conhecida como ID da Oferta e a ID do Plano também é conhecida como ID do SKU.

Máquina virtual do Azure Marketplace

Para implantar VMs de terceiros do Azure Marketplace, primeiro você precisa aceitar o EULA (Contrato de Licença de Usuário Final) para a imagem de VM que está sendo implantada. Depois que o EULA for aceito uma vez em uma assinatura do Azure, você poderá implantar a mesma oferta de VM novamente sem precisar aceitar os termos novamente. Se você estiver implantando a VM do portal do Azure, os termos serão aceitos lá. No entanto, ao fazer a implantação programaticamente, você precisa aceitar os termos usando o ou usando o az vm image terms accept --publisher X --offer Y --plan Z ARM.

Se os termos ainda não forem aceitos, o seguinte erro será mostrado:

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.

Implantar uma VM do Azure Marketplace utilizando a CLI do Azure

Depois que os termos forem aceitos, você poderá implantar a VM usando os métodos regulares, como modelo ARM/Bicep, CLI do Azure, Terraform etc.

Para saber mais sobre como encontrar imagens de VM, Aceitar os termos e implantar a VM usando a CLI, consulte Localizar e usar informações do plano de compra do marketplace usando a CLI.

Implantar uma VM do Azure Marketplace utilizando o Terraform

Instruções sobre como implantar Máquinas Virtuais usando o Terraform para VM do Windows ou VM do Linux.

Para usar o Terraform para implantar VMs do Marketplace, você deve executar as seguintes ações:

  1. Aceitar os termos legais do produto de VM usando azurerm_marketplace_agreement

  2. Especifique o plan bloco no provedor azurerm_virtual_machine

Observação

Se o bloco de plano não for especificado, a implantação falhará com o seguinte erro:

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

Observação

azurerm_marketplace_agreement é tratado como um recurso do Terraform, portanto, na primeira vez que você cria um produto de VM do Marketplace específico, um recurso exclusivo é criado para representar o fato de que os termos legais foram aceitos. No entanto, na próxima vez que você tentar implantar outra VM (com a mesma ID do Editor e ID da Oferta) na mesma Assinatura do Azure, receberá um erro:

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

Você precisa executar Terraform state list para ver se tem azurerm_marketplace_agreement estado do recurso e, caso contrário, precisa importar o estado do recurso para o estado do Terraform.

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

Oferta de SaaS do Azure Marketplace

As ofertas de SaaS geralmente são implantadas pelos clientes por meio do portal do Azure. Depois que a oferta de SaaS é implantada usando o portal do Azure, o cliente usa o botão "Configurar conta agora" para visitar a página de aterrissagem do ISV de SaaS e concluir a configuração da oferta de SaaS. Depois que a oferta é configurada, o ISV de SaaS a ativa usando a API de atendimento de SaaS.

Quando você implanta uma oferta de SaaS por meio do portal do Azure, ela cria um modelo do ARM e atribui valores de parâmetro específicos para a implantação. Um dos parâmetros é termId, que identifica o prazo de assinatura da oferta. O valor termId não é estático, mas depende da configuração da oferta e do tempo de implantação. Portanto, você não pode usar um valor fixo para termId em seu modelo do ARM. Em vez disso, você precisa descobrir o valor termId atual seguindo estas etapas:

  1. Implante a oferta manualmente por meio do portal do Azure.
  2. Vá para o grupo de recursos em que a oferta está implantada.
  3. Selecione o nome da implantação na seção Implantações.
  4. Exiba os parâmetros de entrada e copie o valor de termId.

Se uma determinada oferta de SaaS nunca tiver sido implantada na assinatura do Azure, a implantação programática falhará com um erro como o seguinte:

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

Implantar a oferta de SaaS usando o modelo do ARM e a CLI do Azure

Consulte o modelo de exemplo do 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"
            }
        }
    ]
}

  • Salve o acima como SaaS-ARM.json
  • Execute os comandos a seguir:
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

Depois que o recurso de oferta de SaaS for provisionado, você poderá invocar a seguinte API do ARM para exibir suas propriedades:

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

Agora você pode fazer uma POST chamada para obter o token do marketplace e o URL da página de destino. Essa URL pode ser usada para navegar na página de aterrissagem do ISV de SaaS para concluir a configuração e a ativação da 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

Mais informações podem ser encontradas aqui - especificação do provedor de recursos Microsoft.SaaS.

Implantar a oferta de SaaS do Azure Marketplace utilizando o Terraform

Examine a seção acima que descreve como implantar a oferta de SaaS usando o ARM, pois a implantação do Terraform usaria o mesmo que usar o modelo do ARM.

Aplicativo Azure do Azure Marketplace

O tipo de produto Aplicativo do Azure é uma oferta exclusiva que permite ao editor criar um modelo do ARM que inclui um conjunto de recursos do Azure e produtos do Marketplace agrupados e configurados para fornecer aplicativos de vários recursos totalmente funcionais, o Aplicativo do Azure tem três tipos de plano:

  • Modelo de solução - oferta gratuita, implantação de modelo ARM
  • Aplicativos gerenciados - oferta gratuita ou paga, cria um tipo de recurso Microsoft.Solutions/applications

O portal do Azure gera um modelo do ARM para a implantação do Aplicativo do Azure (Aplicativo Gerenciado). Esse modelo do ARM cria um recurso do tipo Microsoft.Solutions/applications que aponta para um plano específico e passa os parâmetros específicos do aplicativo dos campos de interface do usuário que o cliente preenche no portal do Azure.

Aceitar os termos do Aplicativo Gerenciado do Azure

Assim como a oferta de Máquina Virtual, para implantar o Aplicativo do Azure (Aplicativo Gerenciado) programaticamente usando o modelo do ARM em uma assinatura do Azure, a assinatura precisa aceitar os termos do plano do Aplicativo Gerenciado do Azure. Quando implantado por meio do portal do Azure, a aceitação dos termos ocorre implicitamente e implantações programáticas posteriores do mesmo plano na mesma assinatura do Azure funcionam sem problemas.

Também é possível aceitar os termos de uma oferta de Aplicativo do Azure (Aplicativo Gerenciado) usando o mesmo az vm image terms accept descrito acima na seção VM.

Se o produto Aplicativo do Azure (Aplicativo Gerenciado) for um produto pago (por exemplo, ele usa cobrança mensal ou limitada), a assinatura do Azure que você usa para implantá-lo deve ser associada a uma forma de pagamento válida (por exemplo, não pode ser uma assinatura gratuita ou patrocinada).

Implantar o Aplicativo do Azure (Aplicativo Gerenciado) usando o modelo do ARM e a CLI do Azure

Abaixo está um exemplo de modelo do ARM para implantar o Aplicativo Gerenciado.

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

Em seguida, execute os comandos a seguir:

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>

Implantar o Aplicativo gerenciado do Azure a partir do Azure Marketplace utilizando o Terraform

Examine a seção acima que descreve como implantar a oferta de Aplicativo Gerenciado do Azure usando o ARM, já que a implantação do Terraform usaria o mesmo modelo do ARM.

Modelo de solução do Azure Marketplace

Ao implantar ofertas de Modelo de Solução (não de Aplicativo Gerenciado do Azure) do Azure Marketplace, a implantação é simplesmente o modelo do ARM que o ISV publicou com os campos de interface do usuário correspondentes passados como parâmetros. Para implantar a oferta de modelo de solução programaticamente, use o portal do Azure para fazer a implantação, copie o modelo do ARM e use-o nas implantações subsequentes. Como os Modelos de Solução não são ofertas "pagas", não há termos especiais que precisem ser aceitos. No entanto, se o modelo do ARM do Modelo de Solução estiver se referindo a uma imagem de VM do Azure Marketplace, você precisará primeiro aceitar os termos da oferta de VM, conforme descrito para a oferta de VM.