Snabbstart: Skapa och publicera en Azure Managed Application-definition

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

Om du vill publicera ett hanterat program i tjänstkatalogen utför du följande uppgifter:

  • 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 kompatibilitetsskäl går du till Snabbstart: Ta med din egen lagring för att skapa och publicera en Azure Managed Application-definition.

Anteckning

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. Om du vill konvertera Bicep till JSON använder du kommandot Bicep build . När filen har konverterats till JSON rekommenderar vi att du verifierar koden för noggrannhet.

Bicep-filer kan användas för att distribuera en befintlig definition av hanterade program.

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, App Service-plan och ett 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.

Öppna Visual Studio Code, skapa en fil med det skiftlägeskänsliga namnet createUiDefinition.json och spara den. Med användargränssnittet kan användaren ange App Service namnprefix, App Service plannamn, 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.

Lägg till följande JSON 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 nödvändiga filerna 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 <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 standardwebbläsaren 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 Azure Active Directory, 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 Azure Active Directory-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 Azure Active Directory-grupp går du till Hantera Azure Active Directory-grupper och gruppmedlemskap.

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

Hämta sedan rolldefinitions-ID:t för den inbyggda Azure-roll som du vill bevilja å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 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 $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 på 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. Utgivaridentiteterna som beviljas åtkomst till den hanterade resursgruppen är undantagna från låsnivån.
  • Authorization: Beskriver huvudkonto-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 avgränsa 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.

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.