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:
- Ett Azure-konto med en aktiv prenumeration och behörigheter till Microsoft Entra-resurser som användare, grupper eller tjänstens huvudnamn. Om du inte har något konto skapar du ett kostnadsfritt konto innan du börjar.
- Visual Studio Code med det senaste Azure Resource Manager Tools-tillägget. För Bicep-filer installerar du Bicep-tillägget för Visual Studio Code.
- Installera den senaste versionen av Azure PowerShell eller Azure CLI.
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-09-01",
"name": "[parameters('appServicePlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('appServicePlanSku')]",
"capacity": "[variables('appServicePlanCapacity')]"
}
},
{
"type": "Microsoft.Web/sites",
"apiVersion": "2022-09-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')), '2023-01-01').keys[0].value)]"
}
]
}
},
"dependsOn": [
"[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
"[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
]
},
{
"type": "Microsoft.Storage/storageAccounts",
"apiVersion": "2023-01-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[parameters('storageAccountType')]"
},
"kind": "StorageV2",
"properties": {
"accessTier": "Hot",
"allowSharedKeyAccess": false,
"minimumTlsVersion": "TLS1_2"
}
}
],
"outputs": {
"appServicePlan": {
"type": "string",
"value": "[parameters('appServicePlanName')]"
},
"appServiceApp": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-09-01').defaultHostName]"
},
"storageAccount": {
"type": "string",
"value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-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 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 Storage-konto 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 <pkgstorageaccountname>
inklusive vinkelparenteserna (<>
) med ditt unika lagringskontonamn.
New-AzResourceGroup -Name packageStorageGroup -Location westus
$pkgstorageparms = @{
ResourceGroupName = "packageStorageGroup"
Name = "<pkgstorageaccountname>"
Location = "westus"
SkuName = "Standard_LRS"
Kind = "StorageV2"
MinimumTlsVersion = "TLS1_2"
AllowBlobPublicAccess = $true
AllowSharedKeyAccess = $false
}
$pkgstorageaccount = New-AzStorageAccount @pkgstorageparms
Variabeln $pkgstorageparms
använder PowerShell-splatting för att förbättra läsbarheten för de parametervärden som används i kommandot för att skapa det nya lagringskontot. Splatting används i andra PowerShell-kommandon som använder flera parametervärden.
När du har skapat lagringskontot lägger du till rolltilldelningen Storage Blob Data Contributor i lagringskontots omfång. Tilldela åtkomst till ditt Microsoft Entra-användarkonto. Beroende på din åtkomstnivå i Azure kan du behöva andra behörigheter som tilldelats av administratören. Mer information finns i Tilldela en Azure-roll för åtkomst till blobdata.
När du har lagt till rollen i lagringskontot tar det några minuter att bli aktiv i Azure. Du kan sedan skapa den kontext som behövs för att skapa containern och ladda upp filen.
$pkgstoragecontext = New-AzStorageContext -StorageAccountName $pkgstorageaccount.StorageAccountName -UseConnectedAccount
New-AzStorageContainer -Name appcontainer -Context $pkgstoragecontext -Permission blob
$blobparms = @{
File = "app.zip"
Container = "appcontainer"
Blob = "app.zip"
Context = $pkgstoragecontext
}
Set-AzStorageBlobContent @blobparms
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 $pkgstoragecontext).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 <byosaccountname>
inklusive vinkelparenteserna (<>
) med ditt unika lagringskontonamn.
New-AzResourceGroup -Name byosDefinitionStorageGroup -Location westus
$byostorageparms = @{
ResourceGroupName = "byosDefinitionStorageGroup"
Name = "<byosaccountname>"
Location = "westus"
SkuName = "Standard_LRS"
Kind = "StorageV2"
MinimumTlsVersion = "TLS1_2"
AllowBlobPublicAccess = $true
AllowSharedKeyAccess = $true
}
$byosstorageaccount = New-AzStorageAccount @byostorageparms
När du har skapat lagringskontot lägger du till rolltilldelningen Storage Blob Data Contributor i lagringskontots omfång. Tilldela åtkomst till ditt Microsoft Entra-användarkonto. Du behöver åtkomst för ett steg senare i processen.
När du har lagt till rollen i lagringskontot tar det några minuter att bli aktiv i Azure. Du kan sedan skapa den kontext som behövs för att skapa containern och ladda upp filen.
$byosstoragecontext = New-AzStorageContext -StorageAccountName $byosstorageaccount.StorageAccountName -UseConnectedAccount
Använd följande kommando för att lagra lagringskontots resurs-ID i en variabel med namnet byosstorageid
. Du använder variabelns värde när du distribuerar definitionen för det hanterade programmet.
$byosstorageid = (Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).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 $byosstorageid
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 $byosstorageid
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.
På 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.bicepparam och sparar den.
Lägg till följande i parameterfilen och spara den. Ersätt sedan inklusive <placeholder values>
vinkelparenteser (<>
) med dina värden.
using './deployDefinition.bicep'
param managedApplicationDefinitionName = 'sampleByosManagedApplication'
param definitionStorageResourceID = '<placeholder for you BYOS storage account ID>'
param packageFileUri = '<placeholder for the packageFileUri>'
param principalId = '<placeholder for principalid value>'
param roleId = '<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. byosstorageid Använd variabelns värde. |
packageFileUri |
Ange URI:n för din .zip-paketfil . 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 westus
$deployparms = @{
ResourceGroupName = "byosAppDefinitionGroup"
TemplateFile = "deployDefinition.bicep"
TemplateParameterFile = "deployDefinition-parameters.bicepparam"
Name = "deployDefinition"
}
New-AzResourceGroupDeployment @deployparms
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 det .zip paket 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 <byosaccountname>
inklusive vinkelparenteserna (<>
) med ditt unika lagringskontonamn.
Get-AzStorageContainer -Name applicationdefinitions -Context $byosstoragecontext |
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.
Uppdatera säkerheten för lagringskontot
Inaktivera egenskapen för delad åtkomstnyckel för att förbättra lagringskontots säkerhet efter en lyckad distribution. När lagringskontot skapades lade du till en rolltilldelning för Storage Blob Data Contributor som ger dig åtkomst till containern och blobarna utan att använda lagringsnycklar.
Om du vill granska och uppdatera lagringskontots inställningar för delad åtkomstnyckel använder du följande kommandon:
(Get-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName).AllowSharedKeyAccess
Set-AzStorageAccount -ResourceGroupName $byosstorageaccount.ResourceGroupName -Name $byosstorageaccount.StorageAccountName -AllowSharedKeyAccess $false
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 byosDefinitionStorageGroup
Remove-AzResourceGroup -Name byosAppDefinitionGroup
Nästa steg
Du har publicerat definitionen för det hanterade programmet. Nu ska du lära dig hur du distribuerar en instans av den definitionen.