Szybki start: Tworzenie i publikowanie definicji aplikacji zarządzanej platformy Azure

Ten przewodnik Szybki start zawiera wprowadzenie do pracy z aplikacjami zarządzanymi platformy Azure. Tworzysz i publikujesz definicję aplikacji zarządzanej, która jest przechowywana w katalogu usług i jest przeznaczona dla członków organizacji.

Aby opublikować aplikację zarządzaną w katalogu usług, wykonaj następujące zadania:

  • Utwórz szablon usługi Azure Resource Manager (szablon arm), który definiuje zasoby do wdrożenia za pomocą aplikacji zarządzanej.
  • Zdefiniuj elementy interfejsu użytkownika portalu, stosowane podczas wdrażania aplikacji zarządzanej.
  • Utwórz pakiet zip zawierający wymagane pliki JSON. Plik pakietu zip ma limit 120 MB dla definicji aplikacji zarządzanej katalogu usług.
  • Opublikuj definicję aplikacji zarządzanej, aby była dostępna w katalogu usług.

Jeśli definicja aplikacji zarządzanej jest większa niż 120 MB lub jeśli chcesz używać własnego konta magazynu ze względów zgodności organizacji, przejdź do przewodnika Szybki start: Tworzenie i publikowanie definicji aplikacji zarządzanej platformy Azure.

Możesz użyć Bicep do opracowania definicji aplikacji zarządzanej, ale musi zostać przekonwertowana na kod JSON szablonu usługi ARM, zanim będzie można opublikować definicję na platformie Azure. Aby uzyskać więcej informacji, przejdź do przewodnika Szybki start: tworzenie i publikowanie definicji aplikacji zarządzanej platformy Azure za pomocą aplikacji Bicep.

Możesz również użyć narzędzia Bicep, aby wdrożyć definicję aplikacji zarządzanej z katalogu usług. Aby uzyskać więcej informacji, przejdź do przewodnika Szybki start: wdrażanie definicji aplikacji zarządzanej platformy Azure za pomocą narzędzia Bicep.

Wymagania wstępne

Do ukończenia tego przewodnika Szybki start potrzebne są następujące elementy:

Tworzenie szablonu usługi ARM

Każda definicja aplikacji zarządzanej zawiera plik o nazwie mainTemplate.json. Szablon definiuje zasoby platformy Azure do wdrożenia i nie różni się od zwykłego szablonu usługi ARM.

Otwórz program Visual Studio Code, utwórz plik z nazwą wrażliwą na wielkość liter mainTemplate.json i zapisz go.

Dodaj następujący kod JSON i zapisz plik. Definiuje ona zasoby służące do wdrażania usługi App Service, planu usługi App Service i konta magazynu dla aplikacji. To konto magazynu nie jest używane do przechowywania definicji aplikacji zarządzanej.

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

Definiowanie środowiska portalu

Jako wydawca definiujesz środowisko portalu w celu utworzenia aplikacji zarządzanej. Plik createUiDefinition.json generuje interfejs użytkownika portalu. Definiujesz sposób, w jaki użytkownicy udostępniają dane wejściowe dla każdego parametru przy użyciu elementów sterujących, takich jak listy rozwijane i pola tekstowe.

W tym przykładzie interfejs użytkownika wyświetla monit o wprowadzenie prefiksu nazwy usługi App Service, nazwy planu usługi App Service, prefiksu konta magazynu i typu konta magazynu. Podczas wdrażania zmienne w pliku mainTemplate.json używają uniqueString funkcji do dołączania 13-znakowego ciągu do prefiksów nazw, dzięki czemu nazwy są globalnie unikatowe na platformie Azure.

Otwórz program Visual Studio Code, utwórz plik o nazwie z uwzględnieniem wielkości liter createUiDefinition.json i zapisz go.

Dodaj następujący kod JSON do pliku i zapisz go.

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

Aby dowiedzieć się więcej, zobacz Wprowadzenie do metody CreateUiDefinition.

Pakowanie plików

Dodaj dwa pliki do pliku pakietu o nazwie app.zip. Dwa pliki muszą znajdować się na poziomie głównym pliku zip . Jeśli pliki znajdują się w folderze, podczas tworzenia definicji aplikacji zarządzanej zostanie wyświetlony błąd wskazujący, że wymagane pliki nie są obecne.

Przekaż plik app.zip do konta usługi Azure Storage, aby można było go używać podczas wdrażania definicji aplikacji zarządzanej. Nazwa konta magazynu musi być globalnie unikatowa na platformie Azure, a długość musi zawierać od 3 do 24 znaków z małymi literami i cyframi. W poleceniu zastąp symbol zastępczy <demostorageaccount> zawierający nawiasy kątowe (<>), unikatową nazwą konta magazynu.

W programie Visual Studio Code otwórz nowy terminal programu PowerShell i zaloguj się do subskrypcji platformy Azure.

Connect-AzAccount

Polecenie otwiera domyślną przeglądarkę i wyświetla monit o zalogowanie się na platformie Azure. Aby uzyskać więcej informacji, przejdź do tematu Logowanie się przy użyciu programu 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

Tworzenie definicji aplikacji zarządzanej

W tej sekcji uzyskasz informacje o tożsamości od firmy Microsoft Entra ID, utworzysz grupę zasobów i wdrożysz definicję aplikacji zarządzanej.

Pobieranie identyfikatora grupy i identyfikatora definicji roli

Następnym krokiem jest wybranie użytkownika, grupy zabezpieczeń lub aplikacji do zarządzania zasobami dla klienta. Ta tożsamość ma uprawnienia do zarządzanej grupy zasobów zgodnie z przypisaną rolą. Rola może być dowolną wbudowaną rolą platformy Azure, na przykład właścicielem lub współautorem.

W tym przykładzie użyto grupy zabezpieczeń, a Twoje konto Microsoft Entra powinno być członkiem grupy. Aby uzyskać identyfikator obiektu grupy, zastąp symbol zastępczy <managedAppDemo> , w tym nawiasy kątowe (<>), nazwą grupy. Wartość tej zmiennej jest używana podczas wdrażania definicji aplikacji zarządzanej.

Aby utworzyć nową grupę firmy Microsoft Entra, przejdź do sekcji Zarządzanie grupami i członkostwem w grupach firmy Microsoft.

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

Następnie uzyskaj identyfikator definicji roli wbudowanej roli platformy Azure, której chcesz udzielić dostępu użytkownikowi, grupie lub aplikacji. Wartość tej zmiennej jest używana podczas wdrażania definicji aplikacji zarządzanej.

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

Publikowanie definicji aplikacji zarządzanej

Utwórz grupę zasobów dla definicji aplikacji zarządzanej.

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

Polecenie blob tworzy zmienną do przechowywania adresu URL pliku zip pakietu. Ta zmienna jest używana w poleceniu, które tworzy definicję aplikacji zarządzanej.

$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

Gdy wykonywanie polecenia zakończy się, będziesz mieć w swojej grupie zasobów definicję aplikacji zarządzanej.

Niektóre z parametrów użytych w powyższym przykładzie to:

  • ResourceGroupName: nazwa grupy zasobów, w której jest tworzona definicja aplikacji zarządzanej.
  • LockLevel: grupa lockLevel zasobów zarządzanych uniemożliwia klientowi wykonywanie niepożądanych operacji w tej grupie zasobów. ReadOnly Obecnie jest jedynym obsługiwanym poziomem blokady. ReadOnly określa, że klient może odczytywać tylko zasoby obecne w zarządzanej grupie zasobów. Tożsamości wydawcy, którym udzielono dostępu do zarządzanej grupy zasobów, są wykluczone z poziomu blokady.
  • Authorization: opisuje identyfikator podmiotu zabezpieczeń i identyfikator definicji roli, który jest używany do udzielania uprawnień do zarządzanej grupy zasobów.
    • "${principalid}:$roleid" można też użyć nawiasów klamrowych dla każdej zmiennej "${principalid}:${roleid}".
    • Użyj przecinka, aby oddzielić wiele wartości: "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri: lokalizacja pliku pakietu zip zawierającego wymagane pliki.

Upewnij się, że użytkownicy będą mogli zobaczyć definicję

Masz dostęp do definicji aplikacji zarządzanej, ale chcesz mieć pewność, że inni użytkownicy w Twojej organizacji również mają do niej dostęp. Z definicji przyznaj im co najmniej rolę czytelnika. Użytkownicy mogą odziedziczyć ten poziom dostępu z subskrypcji lub grupy zasobów. Aby sprawdzić, kto ma dostęp do definicji i dodać użytkowników lub grupy, zobacz Przypisywanie ról platformy Azure przy użyciu witryny Azure Portal.

Czyszczenie zasobów

Jeśli zamierzasz wdrożyć definicję, przejdź do sekcji Następne kroki , która zawiera linki do artykułu, aby wdrożyć definicję.

Jeśli skończysz z definicją aplikacji zarządzanej, możesz usunąć utworzone grupy zasobów o nazwie packageStorageGroup i appDefinitionGroup.

Polecenie wyświetla monit o potwierdzenie, że chcesz usunąć grupę zasobów.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

Następne kroki

Opublikowano definicję aplikacji zarządzanej. Następnym krokiem jest dowiedzieć się, jak wdrożyć wystąpienie tej definicji.