Dela via


Snabbstart: Skapa och publicera en definition av Azure-hanterat program

Den här snabbstarten ger en introduktion till att arbeta med Azure Managed Applications. Du skapar och publicerar en definition av hanterade program som lagras i tjänstkatalogen och är avsedd för medlemmar i organisationen.

Gör följande för att publicera ett hanterat program i tjänstkatalogen:

  • Skapa en Azure Resource Manager-mall (ARM-mall) som definierar de resurser som distribueras med 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. .zip-paketfilen har en gräns på 120 MB för en tjänstkatalogs definition av hanterade program.
  • Publicera definitionen för det hanterade programmet så att den är tillgänglig i tjänstkatalogen.

Om definitionen för det hanterade programmet är mer än 120 MB eller om du vill använda ditt eget lagringskonto av organisationens efterlevnadsskäl går du till Snabbstart: Ta med din egen lagring för att 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 resurserna för att distribuera en App Service- och App Service-plan. Mallen använder App Service Basic-planen (B1) som har betala per användning-kostnader. Mer information finns i Prissättning för Azure App Service på Linux.

{
  "$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."
      }
    }
  },
  "variables": {
    "appServicePlanSku": "B1",
    "appServicePlanCapacity": 1,
    "appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
    "linuxFxVersion": "DOTNETCORE|8.0"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2023-01-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      },
      "kind": "linux",
      "properties": {
        "zoneRedundant": false,
        "reserved": true
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2023-01-01",
      "name": "[variables('appServiceName')]",
      "location": "[parameters('location')]",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "httpsOnly": true,
        "redundancyMode": "None",
        "siteConfig": {
          "linuxFxVersion": "[variables('linuxFxVersion')]",
          "minTlsVersion": "1.2",
          "ftpsState": "Disabled"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]"
      ]
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2023-01-01').defaultHostName]"
    }
  }
}

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 uppmanar användargränssnittet dig att ange prefixet App Service-namn och App Service-planens namn. Under distributionen av mainTemplate.json appServiceName använder variablerna uniqueString funktionen för att lägga till en 13-teckenssträng i namnprefixet så att namnet är globalt unikt 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
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
      "appServiceNamePrefix": "[steps('webAppSettings').appServiceName]"
    }
  }
}

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.

Öppna en ny PowerShell-terminal i Visual Studio Code och logga in på din Azure-prenumeration.

Connect-AzAccount

Kommandot öppnar din standardwebbläsare och uppmanar dig att logga in på Azure. Mer information finns i Logga in med Azure PowerShell.

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 och Tilldela Azure-roller med hjälp av Azure Portal.

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

Skapa definitionen för det hanterade programmet

I det här avsnittet får du identitetsinformation från Microsoft Entra-ID, skapar en resursgrupp och distribuerar definitionen för det hanterade programmet.

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 den här 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 den här variabelns värde när du distribuerar definitionen för det hanterade programmet.

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

Publicera definitionen för det hanterade programmet

Skapa en resursgrupp för definitionen av det hanterade programmet.

New-AzResourceGroup -Name appDefinitionGroup -Location westus

Kommandot blob skapar en variabel för att lagra URL:en för paketet .zip fil. Variabeln används i kommandot som skapar definitionen för det hanterade programmet.

$blob = Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $pkgstoragecontext

$publishparms = @{
  Name = "sampleManagedApplication"
  Location = "westus"
  ResourceGroupName = "appDefinitionGroup"
  LockLevel = "ReadOnly"
  DisplayName = "Sample managed application"
  Description = "Sample managed application that deploys web resources"
  Authorization = "${principalid}:$roleid"
  PackageFileUri = $blob.ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri
}

New-AzManagedApplicationDefinition @publishparms

När kommandot har slutförts har du en definition för det hanterade programmet i resursgruppen.

Några av de parametrar som användes i det föregående exemplet är:

  • ResourceGroupName: Namnet på resursgruppen där definitionen för det hanterade programmet skapas.
  • LockLevel: 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.
  • Authorization: Beskriver huvud-ID:t och rolldefinitions-ID:t som används för att bevilja behörighet till den hanterade resursgruppen.
    • "${principalid}:$roleid" eller så kan du använda klammerparenteser för varje variabel "${principalid}:${roleid}".
    • Använd ett kommatecken för att separera flera värden: "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri: Platsen för en .zip paketfil som innehåller de filer som krävs.

Kontrollera att användare kan se 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. Information om vem som har åtkomst till definitionen och lägga till användare eller grupper finns i Tilldela Azure-roller med hjälp av Azure Portal.

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 och appDefinitionGroup.

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

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

Nästa steg

Du har publicerat definitionen för det hanterade programmet. Nästa steg är att lära dig hur du distribuerar en instans av den definitionen.