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 ska 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 ett App Service-, App Service-plan- och lagringskonto för programmet. Det här lagringskontot används inte för att lagra definitionen för det hanterade programmet.

{
  "$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 Komma 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.

Ö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 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

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 westus3

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

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

New-AzManagedApplicationDefinition `
  -Name "sampleManagedApplication" `
  -Location "westus3" `
  -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

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-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 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 av det hanterade programmet. Nästa steg är att lära dig hur du distribuerar en instans av den definitionen.