Snabbstart: Ta med din egen lagring för att skapa och publicera en Azure Managed Application-definition

Den här snabbstarten ger en introduktion till BYOS (Bring Your Own Storage) för ett Azure-hanterat program. Du skapar och publicerar en definition av hanterade program i tjänstkatalogen för medlemmar i organisationen. När du använder ditt eget lagringskonto kan definitionen av det hanterade programmet överskrida tjänstkatalogens gräns på 120 MB.

Gör följande för att publicera en definition för hanterade program i tjänstkatalogen:

  • Skapa en Azure Resource Manager-mall (ARM-mall) som definierar de Azure-resurser som distribueras av det hanterade programmet.
  • Definiera användargränssnittselementen för portalen när du distribuerar det hanterade programmet.
  • Skapa ett .zip-paket som innehåller de JSON-filer som krävs.
  • Skapa ett lagringskonto där du lagrar definitionen för det hanterade programmet.
  • Distribuera definitionen för det hanterade programmet till ditt eget lagringskonto så att det är tillgängligt i tjänstkatalogen.

Om definitionen för det hanterade programmet är mindre än 120 MB och du inte vill använda ditt eget lagringskonto går du till Snabbstart: Skapa och publicera en Azure Managed Application-definition.

Du kan använda Bicep för att utveckla en definition för hanterade program, men den måste konverteras till ARM-mallens JSON innan du kan publicera definitionen i Azure. Mer information finns i Snabbstart: Använd Bicep för att skapa och publicera en Azure Managed Application-definition.

Du kan också använda Bicep för att distribuera en definition av hanterade program från tjänstkatalogen. Mer information finns i Snabbstart: Använd Bicep för att distribuera en Azure Managed Application-definition.

Förutsättningar

För att slutföra den här snabbstarten behöver du följande:

Skapa ARM-mallen

Alla definitioner för hanterade program innehåller en fil med namnet mainTemplate.json. Mallen definierar de Azure-resurser som ska distribueras och skiljer sig inte från en vanlig ARM-mall.

Öppna Visual Studio Code, skapa en fil med skiftlägeskänsligt namn mainTemplate.json och spara den.

Lägg till följande JSON och spara filen. Den definierar det hanterade programmets resurser för att distribuera en App Service, App Service-plan och ett lagringskonto.

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

Definiera portalupplevelsen

Som utgivare definierar du portalupplevelsen för att skapa det hanterade programmet. Filen createUiDefinition.json genererar portalens användargränssnitt. Du definierar hur användare anger indata för varje parameter med hjälp av kontrollelement som listrutor och textrutor.

I det här exemplet uppmanas du i användargränssnittet att ange prefixet App Service-namn, App Service-planens namn, lagringskontoprefix och lagringskontotyp. Under distributionen använder uniqueString variablerna i mainTemplate.json funktionen för att lägga till en 13-teckenssträng i namnprefixen så att namnen är globalt unika i Hela Azure.

Öppna Visual Studio Code, skapa en fil med skiftlägeskänsligt namn createUiDefinition.json och spara den.

Lägg till följande JSON-kod i filen och spara den.

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

Mer information finns i Kom igång med CreateUiDefinition.

Paketera filerna

Lägg till de två filerna i en paketfil med namnet app.zip. De två filerna måste vara på rotnivån för .zip-filen . Om filerna finns i en mapp får du ett felmeddelande om att de filer som krävs inte finns när du skapar definitionen för det hanterade programmet.

Ladda upp app.zip till ett Azure-lagringskonto så att du kan använda det när du distribuerar definitionen för det hanterade programmet. Lagringskontonamnet måste vara globalt unikt i Azure och längden måste vara 3–24 tecken med endast gemener och siffror. I kommandot ersätter du platshållaren <demostorageaccount> inklusive vinkelparenteserna (<>) med ditt unika lagringskontonamn.

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

Använd följande kommando för att lagra paketfilens URI i en variabel med namnet packageuri. Du använder variabelns värde när du distribuerar definitionen för det hanterade programmet.

$packageuri=(Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

Ta med din egen lagring för definitionen för det hanterade programmet

Du lagrar definitionen för ditt hanterade program i ditt eget lagringskonto så att dess plats och åtkomst kan hanteras av dig för organisationens regelbehov. Med ditt eget lagringskonto kan du ha ett program som överskrider gränsen på 120 MB för en tjänstkatalogs definition av hanterade program.

Kommentar

Bring Your Own Storage stöds endast med ARM-mallen eller REST API-distributioner av definitionen för det hanterade programmet.

Skapa lagringskontot

Skapa lagringskontot för definitionen av det hanterade programmet. Lagringskontonamnet måste vara globalt unikt i Azure och längden måste vara 3–24 tecken med endast gemener och siffror.

I det här exemplet skapas en ny resursgrupp med namnet byosDefinitionStorageGroup. I kommandot ersätter du platshållaren <definitionstorage> inklusive vinkelparenteserna (<>) med ditt unika lagringskontonamn.

New-AzResourceGroup -Name byosDefinitionStorageGroup -Location westus3

New-AzStorageAccount `
  -ResourceGroupName byosDefinitionStorageGroup `
  -Name "<definitionstorage>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2

Använd följande kommando för att lagra lagringskontots resurs-ID i en variabel med namnet storageid. Du använder variabelns värde när du distribuerar definitionen för det hanterade programmet.

$storageid = (Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage>).Id

Ange rolltilldelningen för ditt lagringskonto

Innan du distribuerar definitionen av det hanterade programmet till lagringskontot tilldelar du rollen Deltagare till användaren av resursprovidern för installation i lagringskontots omfång. Med den här tilldelningen kan identiteten skriva definitionsfiler till lagringskontots container.

Du kan använda variabler för att konfigurera rolltilldelningen. I det här exemplet används variabeln $storageid du skapade i föregående steg och variabeln $arpid skapas.

$arpid = (Get-AzADServicePrincipal -SearchString "Appliance Resource Provider").Id

New-AzRoleAssignment -ObjectId $arpid `
-RoleDefinitionName Contributor `
-Scope $storageid

Resursprovidern för installationen är ett huvudnamn för tjänsten i din Microsoft Entra-klientorganisation. Från Azure-portalen kan du kontrollera om den är registrerad genom att gå till Microsoft Entra ID>Enterprise-program och ändra sökfiltret till Microsoft Applications. Sök efter resursprovidern för installationen. Om den inte hittas registrerar du resursprovidern Microsoft.Solutions .

Hämta grupp-ID och rolldefinitions-ID

Nästa steg är att välja en användare, säkerhetsgrupp eller ett program för att hantera kundens resurser. Den här identiteten har behörigheter för den hanterade resursgruppen enligt den tilldelade rollen. Rollen kan vara valfri inbyggd Azure-roll som Ägare eller Deltagare.

I det här exemplet används en säkerhetsgrupp och ditt Microsoft Entra-konto bör vara medlem i gruppen. Om du vill hämta gruppens objekt-ID ersätter du platshållaren <managedAppDemo> inklusive vinkelparenteserna (<>) med gruppens namn. Du använder variabelns värde när du distribuerar definitionen för det hanterade programmet.

Om du vill skapa en ny Microsoft Entra-grupp går du till Hantera Microsoft Entra-grupper och gruppmedlemskap.

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

Hämta sedan rolldefinitions-ID:t för den inbyggda Azure-roll som du vill ge åtkomst till användaren, gruppen eller programmet. Du använder variabelns värde när du distribuerar definitionen för det hanterade programmet.

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

Skapa mallen för definitionsdistribution

Använd en Bicep-fil för att distribuera definitionen av det hanterade programmet i tjänstkatalogen. Efter distributionen lagras definitionsfilerna i ditt eget lagringskonto.

Öppna Visual Studio Code, skapa en fil med namnet deployDefinition.bicep och spara den.

Lägg till följande Bicep-kod och spara filen.

param location string = resourceGroup().location

@description('Name of the managed application definition.')
param managedApplicationDefinitionName string

@description('Resource ID for the bring your own storage account where the definition is stored.')
param definitionStorageResourceID string

@description('The URI of the .zip package file.')
param packageFileUri string

@description('Publishers Principal ID that needs permissions to manage resources in the managed resource group.')
param principalId string

@description('Role ID for permissions to the managed resource group.')
param roleId string

var definitionLockLevel = 'ReadOnly'
var definitionDisplayName = 'Sample BYOS managed application'
var definitionDescription = 'Sample BYOS managed application that deploys web resources'

resource managedApplicationDefinition 'Microsoft.Solutions/applicationDefinitions@2021-07-01' = {
  name: managedApplicationDefinitionName
  location: location
  properties: {
    lockLevel: definitionLockLevel
    description: definitionDescription
    displayName: definitionDisplayName
    packageFileUri: packageFileUri
    storageAccountId: definitionStorageResourceID
    authorizations: [
      {
        principalId: principalId
        roleDefinitionId: roleId
      }
    ]
  }
}

Mer information om mallens egenskaper finns i Microsoft.Solutions/applicationDefinitions.

lockLevel den hanterade resursgruppen hindrar kunden från att utföra oönskade åtgärder i den här resursgruppen. ReadOnly Är för närvarande den enda låsnivå som stöds. ReadOnly anger att kunden bara kan läsa de resurser som finns i den hanterade resursgruppen. De utgivaridentiteter som beviljas åtkomst till den hanterade resursgruppen är undantagna från låsnivån.

Skapa parameterfilen

Distributionsmallen för den hanterade programdefinitionen behöver indata för flera parametrar. Distributionskommandot frågar efter värdena eller så kan du skapa en parameterfil för värdena. I det här exemplet använder vi en parameterfil för att skicka parametervärdena till distributionskommandot.

I Visual Studio Code skapar du en ny fil med namnet deployDefinition.parameters.json och sparar den.

Lägg till följande i parameterfilen och spara den. Ersätt sedan inklusive <placeholder values> vinkelparenteser (<>) med dina värden.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "managedApplicationDefinitionName": {
      "value": "<placeholder for managed application name>"
    },
    "definitionStorageResourceID": {
      "value": "<placeholder for you storage account ID>"
    },
    "packageFileUri": {
      "value": "<placeholder for the packageFileUri>"
    },
    "principalId": {
      "value": "<placeholder for principalid value>"
    },
    "roleId": {
      "value": "<placeholder for roleid value>"
    }
  }
}

I följande tabell beskrivs parametervärdena för definitionen av det hanterade programmet.

Parameter Värde
managedApplicationDefinitionName Namnet på definitionen för det hanterade programmet. I det här exemplet använder du sampleByosManagedApplication.
definitionStorageResourceID Resurs-ID för lagringskontot där definitionen lagras. storageid Använd variabelns värde.
packageFileUri Ange URI:n för .zip-paketfilen . packageuri Använd variabelns värde. Formatet är https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId Utgivarens huvudnamns-ID som behöver behörighet för att hantera resurser i den hanterade resursgruppen. principalid Använd variabelns värde.
roleId Roll-ID för behörigheter till den hanterade resursgruppen. Till exempel Ägare, Deltagare, Läsare. roleid Använd variabelns värde.

Så här hämtar du dina variabelvärden:

  • Azure PowerShell: I PowerShell skriver du $variableName för att visa en variabels värde.
  • Azure CLI: I Bash skriver du echo $variableName för att visa en variabels värde.

Distribuera definitionen

När du distribuerar definitionen för det hanterade programmet blir den tillgänglig i tjänstkatalogen. Den här processen distribuerar inte det hanterade programmets resurser.

Skapa en resursgrupp med namnet byosAppDefinitionGroup och distribuera definitionen av det hanterade programmet till ditt lagringskonto.

New-AzResourceGroup -Name byosAppDefinitionGroup -Location westus3

New-AzResourceGroupDeployment `
  -ResourceGroupName byosAppDefinitionGroup `
  -TemplateFile deployDefinition.bicep `
  -TemplateParameterFile deployDefinition.parameters.json

Verifiera lagring av definitionsfiler

Under distributionen använder mallens egenskap ditt lagringskontos resurs-ID och skapar en ny container med skiftlägeskänsligt storageAccountId namn applicationdefinitions. Filerna från .zip-paketet som du angav under distributionen lagras i den nya containern.

Du kan använda följande kommandon för att kontrollera att definitionsfilerna för hanterade program sparas i lagringskontots container. I kommandot ersätter du platshållaren <definitionstorage> inklusive vinkelparenteserna (<>) med ditt unika lagringskontonamn.

Get-AzStorageAccount -ResourceGroupName byosDefinitionStorageGroup -Name <definitionstorage> |
Get-AzStorageContainer -Name applicationdefinitions |
Get-AzStorageBlob | Select-Object -Property Name | Format-List

Kommentar

För ökad säkerhet kan du skapa en definition av hanterade program och lagra den i en Azure Storage-kontoblob där kryptering är aktiverat. Definitionsinnehållet krypteras via lagringskontots krypteringsalternativ. Endast användare med behörighet till filen kan komma åt definitionen i tjänstkatalogen.

Kontrollera att användarna kan komma åt din definition

Du har åtkomst till definitionen för hanterade program, men du vill kontrollera att andra användare i din organisation kan komma åt den. Ge dem minst rollen Läsare på definitionen. De kan ha ärvt den här åtkomstnivån från prenumerationen eller resursgruppen. Om du vill kontrollera vem som har åtkomst till definitionen och lägga till användare eller grupper går du till Tilldela Azure-roller med hjälp av Azure-portalen.

Rensa resurser

Om du ska distribuera definitionen fortsätter du med avsnittet Nästa steg som länkar till artikeln för att distribuera definitionen.

Om du är klar med definitionen för det hanterade programmet kan du ta bort de resursgrupper som du skapade med namnet packageStorageGroup, byosDefinitionStorageGroup och byosAppDefinitionGroup.

Kommandot uppmanar dig att bekräfta att du vill ta bort resursgruppen.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name byosAppDefinitionGroup

Remove-AzResourceGroup -Name byosDefinitionStorageGroup

Nästa steg

Du har publicerat definitionen av det hanterade programmet. Nu ska du lära dig hur du distribuerar en instans av den definitionen.