다음을 통해 공유


Marketplace 제품의 프로그래밍 방식 배포

이 문서에서는 Azure CLI, Azure PowerShell 및 Terraform을 사용하여 Marketplace 제품 리소스를 Azure에 배포하는 방법을 설명합니다.

필수 조건

Azure PowerShell을 설치하고 Azure에 연결해야 합니다.

배포 명령이 Azure CLI 버전 2.2.0에서 변경되었습니다. 이 문서의 예제에는 Azure CLI 버전 2.20.0 이상이 필요합니다.

이 샘플을 실행하려면 최신 버전의 Azure CLI를 설치합니다. 시작하려면 az 로그인을 실행하여 Azure와의 연결을 만듭니다.

게시자, 제품 및 계획에 대한 Marketplace 제품 식별자를 찾는 방법

Marketplace 제품을 프로그래밍 방식으로 배포하려면 먼저 Marketplace 제품의 고유 식별자를 가져와야 합니다.

고유 식별자를 찾으려면 다음을 수행합니다.

  1. Azure Portal을 열고 Marketplace 환경으로 이동합니다.
  2. 배포하려는 Marketplace 제품 검색
  3. 제품 이름을 선택하여 제품 세부 정보 페이지를 엽니다.
  4. 사용량 정보 + 지원 탭으로 이동합니다. 사용량 정보에 게시자 ID, 제품 ID 및 계획 ID가 표시됩니다.

제품 ID 페이지의 스크린샷.

참고 항목

일부 API에서는 제품 ID를 제품 ID라고도 하며 계획 ID를 SKU ID라고도 합니다.

Azure Marketplace의 Virtual Machine

Azure Marketplace에서 타사 VM을 배포하려면 먼저 배포 중인 VM 이미지에 대한 EULA(최종 사용자 사용권 계약)를 수락해야 합니다. Azure 구독에서 EULA가 한 번 수락되면 약관을 다시 수락하지 않고도 동일한 VM 제품을 다시 배포할 수 있어야 합니다. Azure Portal에서 VM을 배포하는 경우 해당 약관이 수락됩니다. 그러나 프로그래밍 방식으로 배포를 수행하는 경우 ARM 사용 또는 사용 az vm image terms accept --publisher X --offer Y --plan Z 약관에 동의해야 합니다.

약관이 아직 수락되지 않은 경우 다음 오류가 표시됩니다.

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.

Azure CLI를 사용하여 Azure Marketplace에서 VM 배포

약관이 수락되면 ARM/Bicep 템플릿, Azure CLI, Terraform 등과 같은 일반 메서드를 사용하여 VM을 배포할 수 있습니다.

VM 이미지를 찾고, 약관에 동의하고 CLI를 사용하여 VM을 배포하는 방법에 대한 자세한 내용은 CLI를 사용하여 마켓플레이스 구매 계획 정보 찾기 및 사용을 참조하세요.

Terraform을 사용하여 Azure Marketplace에서 VM 배포

Windows VM 또는 Linux VM용 Terraform을 사용하여 Virtual Machines를 배포하는 방법에 대한 지침입니다.

Terraform을 사용하여 Marketplace VM을 배포하려면 다음 작업을 수행해야 합니다.

  1. azurerm_marketplace_agreement 사용하여 VM 제품 약관에 동의

  2. plan azurerm_virtual_machine 공급자에서 블록 지정

참고 항목

계획 블록을 지정하지 않으면 다음 오류와 함께 배포가 실패합니다.

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

참고 항목

azurerm_marketplace_agreement Terraform 리소스로 처리되므로 특정 Marketplace VM 제품을 처음 만들 때 법적 조건이 수락되었음을 나타내는 고유한 리소스가 만들어집니다. 그러나 다음에 동일한 Azure 구독에서 다른 VM(동일한 게시자 ID 및 제품 ID 포함)을 배포하려고 하면 오류가 발생합니다.

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

실행 Terraform state list 하여 azurerm_marketplace_agreement 리소스 상태가 있는지, 그렇지 않은 경우 리소스 상태를 Terraform 상태로 가져올 필요가 있는지 확인해야 합니다.

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

Azure Marketplace의 SaaS 제품

SaaS 제품은 일반적으로 Azure Portal을 통해 고객이 배포합니다. Azure Portal을 사용하여 SaaS 제품을 배포한 후 고객은 "지금 계정 구성" 단추를 사용하여 SaaS ISV의 방문 페이지를 방문하여 SaaS 제품 구성을 완료합니다. 제품이 구성되면 SaaS ISV는 SaaS 처리 API를 사용하여 제품을 활성화합니다.

Azure Portal을 통해 SaaS 제품을 배포하는 경우 ARM 템플릿을 만들고 배포에 대한 특정 매개 변수 값을 할당합니다. 매개 변수 중 하나는 제품의 구독 용어를 식별하는 termId입니다. termId 값은 정적이지 않지만 제품 구성 및 배포 시간에 따라 달라집니다. 따라서 ARM 템플릿에서 termId에 대해 고정 값을 사용할 수 없습니다. 대신 다음 단계를 수행하여 현재 termId 값을 찾아야 합니다.

  1. Azure Portal을 통해 제품을 수동으로 배포합니다.
  2. 제품이 배포된 리소스 그룹으로 이동합니다.
  3. 배포 섹션에서 배포 이름을 선택합니다.
  4. 입력 매개 변수를 보고 termId 값을 복사합니다.

지정된 SaaS 제품이 Azure 구독에 배포되지 않은 경우 다음과 같은 오류와 함께 프로그래밍 방식 배포가 실패합니다.

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

ARM 템플릿 및 Azure CLI를 사용하여 SaaS 제품 배포

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

  • 위의 값을 다음과 같이 저장합니다. SaaS-ARM.json
  • 다음 명령을 실행합니다.
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

SaaS 제품 리소스가 프로비전된 후 다음 ARM API를 호출하여 해당 속성을 볼 수 있습니다.

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

이제 마켓플레이스 토큰 및 방문 페이지 URL을 가져오기 위해 호출할 수 있습니다 POST . 이 URL을 사용하여 SaaS ISV의 방문 페이지를 찾아서 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

자세한 내용은 Microsoft.SaaS 리소스 공급자 사양에서 찾을 수 있습니다.

Terraform을 사용하여 Azure Marketplace에서 SaaS 제품 배포

Terraform 배포가 ARM 템플릿을 사용하는 것과 동일하게 사용되므로 ARM을 사용하여 SaaS 제품을 배포하는 방법을 설명하는 위의 섹션을 검토합니다.

Azure Marketplace에서 Azure 애플리케이션

Azure 애플리케이션 제품 유형은 퍼블리셔가 세 가지 계획 유형이 Azure 애플리케이션 완전한 기능의 다중 리소스 애플리케이션을 제공하도록 번들되고 구성된 Azure 리소스 및 Marketplace 제품 집합을 포함하는 ARM 템플릿을 만들 수 있는 고유한 제품입니다.

  • 솔루션 템플릿 - 무료 제공, ARM 템플릿 배포
  • 관리되는 애플리케이션 - 무료 또는 유료 제품으로 Microsoft.Solutions/애플리케이션 리소스 유형을 만듭니다.

Azure Portal은 Azure 애플리케이션(관리되는 애플리케이션) 배포를 위한 ARM 템플릿을 생성합니다. 이 ARM 템플릿은 특정 계획을 가리키고 고객이 Azure Portal에서 작성하는 UI 필드의 애플리케이션별 매개 변수를 전달하는 형식 Microsoft.Solutions/applications 의 리소스를 만듭니다.

Azure 관리되는 앱 약관에 동의

Virtual Machine 제품과 마찬가지로 ARM 템플릿을 사용하여 프로그래밍 방식으로 Azure 애플리케이션(관리되는 애플리케이션)를 Azure 구독에 배포하려면 구독이 Azure Managed App의 계획에 대한 조건을 수락해야 합니다. Azure Portal을 통해 배포하는 경우 동의 조건은 동일한 Azure 구독에서 동일한 플랜의 암시적 이상 프로그래밍 방식 배포가 문제 없이 작동합니다.

VM 섹션에서 위에서 설명한 것과 동일한 az vm image terms accept 방식으로 Azure 애플리케이션(관리되는 애플리케이션) 제품의 조건을 수락할 수도 있습니다.

Azure 애플리케이션(관리되는 애플리케이션) 제품이 유료 제품인 경우(예: 월별 또는 요금제 청구 사용) 배포에 사용하는 Azure 구독은 유효한 결제 방법과 연결되어야 합니다(예: 무료 또는 스폰서 구독일 수 없습니다).

ARM 템플릿 및 Azure CLI를 사용하여 Azure 애플리케이션(관리되는 애플리케이션) 배포

다음은 관리되는 애플리케이션을 배포하기 위한 ARM 템플릿 예제입니다.

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

그런 다음, 다음 명령을 실행합니다.

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>

Terraform을 사용하여 Azure Marketplace에서 Azure Managed App 배포

Terraform 배포에서 동일한 ARM 템플릿을 사용하기 때문에 ARM을 사용하여 Azure Managed App 제품을 배포하는 방법을 설명하는 위의 섹션을 검토합니다.

Azure Marketplace의 솔루션 템플릿

Azure Marketplace에서 솔루션 템플릿(Azure Managed App 아님)을 배포할 때 배포는 ISV가 매개 변수로 전달된 해당 UI 필드와 함께 게시한 ARM 템플릿일 뿐입니다. 솔루션 템플릿 제품을 프로그래밍 방식으로 배포하려면 Azure Portal을 사용하여 배포를 수행하고 ARM 템플릿을 복사한 다음 후속 배포에서 사용합니다. 솔루션 템플릿은 "유료" 제품이 아니므로 수락해야 하는 특별한 용어는 없습니다. 그러나 솔루션 템플릿 ARM 템플릿이 Azure Marketplace의 VM 이미지를 참조하는 경우 먼저 VM 제품에 대해 설명된 대로 VM 제품 약관에 동의해야 합니다.