Rövid útmutató: Azure Managed Application-definíció létrehozása és közzététele a Bicep használatával

Ez a rövid útmutató bemutatja, hogyan hozhat létre és tehet közzé Azure Managed Application-definíciót a szolgáltatáskatalógusban a Bicep használatával. A definíció a szolgáltatáskatalógusban a szervezet tagjai számára érhető el.

Felügyelt alkalmazásdefiníció létrehozásához és a szolgáltatáskatalógusban való közzétételéhez hajtsa végre a következő feladatokat:

  • A Bicep használatával fejlesztheti a sablont, és azure Resource Manager-sablonná (ARM-sablonlá) alakíthatja. A sablon meghatározza a felügyelt alkalmazás által üzembe helyezett Azure-erőforrásokat.
  • A Bicep átalakítása JSON-ra a Bicep build paranccsal. A fájl JSON-ra való konvertálása után ajánlott ellenőrizni a kódot a pontosság érdekében.
  • Meg kell határoznia a felhasználói felület elemeit a portál számára, amikor üzembe helyezi a felügyelt alkalmazást.
  • Hozzon létre egy .zip csomagot, amely tartalmazza a szükséges JSON-fájlokat. A .zip-csomagfájl 120 MB-os korláttal rendelkezik a szolgáltatáskatalógus felügyelt alkalmazásdefiníciójára vonatkozóan.
  • Tegye közzé a felügyelt alkalmazásdefiníciót, hogy elérhető legyen a szolgáltatáskatalógusban.

Ha a felügyelt alkalmazásdefiníció több mint 120 MB, vagy ha saját tárfiókját szeretné használni a szervezet megfelelőségi okokból, tekintse meg a rövid útmutatót: Hozzon létre és tegyen közzé egy Azure Managed Application-definíciót saját tárterület használatával.

A Bicep használatával felügyelt alkalmazásdefiníciót is üzembe helyezhet a szolgáltatáskatalógusból. További információ : Rövid útmutató: Azure Managed Application Definition üzembe helyezése a Bicep használatával.

Előfeltételek

A cikkben szereplő feladatok elvégzéséhez a következő elemekre van szüksége:

Bicep-fájl létrehozása

Minden felügyelt alkalmazás definíciója tartalmaz egy mainTemplate.json nevű fájlt. A sablon meghatározza az üzembe helyezendő Azure-erőforrásokat, és nem különbözik a szokásos ARM-sablontól. A sablont a Bicep használatával fejlesztheti, majd a Bicep-fájlt JSON-fájllá alakíthatja.

Nyissa meg a Visual Studio Code-ot, hozzon létre egy fájlt a mainTemplate.bicep kis- és nagybetűk megkülönböztetésével, és mentse azt.

Adja hozzá a következő Bicep-kódot, és mentse a fájlt. Meghatározza a felügyelt alkalmazás erőforrásait az App Service, az App Service-csomag és a tárfiók üzembe helyezéséhez.

param location string = resourceGroup().location

@description('App Service plan name.')
@maxLength(40)
param appServicePlanName string

@description('App Service name prefix.')
@maxLength(47)
param appServiceNamePrefix string

@description('Storage account name prefix.')
@maxLength(11)
param storageAccountNamePrefix string

@description('Storage account type allowed values')
@allowed([
  'Premium_LRS'
  'Standard_LRS'
  'Standard_GRS'
])
param storageAccountType string

var appServicePlanSku = 'F1'
var appServicePlanCapacity = 1
var appServiceName = '${appServiceNamePrefix}${uniqueString(resourceGroup().id)}'
var storageAccountName = '${storageAccountNamePrefix}${uniqueString(resourceGroup().id)}'
var appServiceStorageConnectionString = 'DefaultEndpointsProtocol=https;AccountName=${storageAccount.name};EndpointSuffix=${environment().suffixes.storage};Key=${storageAccount.listKeys().keys[0].value}'

resource appServicePlan 'Microsoft.Web/serverfarms@2022-03-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSku
    capacity: appServicePlanCapacity
  }
}

resource appServiceApp 'Microsoft.Web/sites@2022-03-01' = {
  name: appServiceName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    siteConfig: {
      appSettings: [
        {
          name: 'AppServiceStorageConnectionString'
          value: appServiceStorageConnectionString
        }
      ]
    }
  }
}

resource storageAccount 'Microsoft.Storage/storageAccounts@2022-09-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: storageAccountType
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

output appServicePlan string = appServicePlan.name
output appServiceApp string = appServiceApp.properties.defaultHostName
output storageAccount string = storageAccount.properties.primaryEndpoints.blob

Bicep átalakítása JSON-ra

A MainTemplate.json fájl létrehozásához használja a PowerShellt vagy az Azure CLI-t. Nyissa meg azt a könyvtárat, ahová a Bicep-fájlt mentette, és futtassa a build parancsot.

bicep build mainTemplate.bicep

További információ: Bicep build.

Miután a Bicep-fájlt JSON-ra konvertálta, a mainTemplate.json fájlnak meg kell egyeznie az alábbi példával. Előfordulhat, hogy a tulajdonságok versiontemplateHashközött különböző értékek szerepelnek.metadata

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "metadata": {
    "_generator": {
      "name": "bicep",
      "version": "0.17.1.54307",
      "templateHash": "1234567891234567890"
    }
  },
  "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]"
    }
  }
}

A portál élményének meghatározása

Közzétevőként ön határozza meg a portál felületét a felügyelt alkalmazás létrehozásához. A createUiDefinition.json fájl létrehozza a portál felhasználói felületét. Ön határozza meg, hogy a felhasználók hogyan adnak bemenetet az egyes paraméterekhez vezérlőelemek, például legördülő listák és szövegdobozok használatával.

Ebben a példában a felhasználói felület kéri, hogy adja meg az App Service névelőtagját, az App Service-csomag nevét, a tárfiók előtagját és a tárfiók típusát. Az üzembe helyezés során a mainTemplate.json változói a uniqueString függvény használatával fűznek hozzá egy 13 karakteres sztringet a névelőtagokhoz, így a nevek globálisan egyediek az Azure-ban.

Nyissa meg a Visual Studio Code-ot, hozzon létre egy fájlt a createUiDefinition.json kis- és nagybetűk megkülönböztetésével, és mentse azt.

Adja hozzá a következő JSON-kódot a fájlhoz, és mentse.

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

További információért olvassa el a CreateUiDefinition használatának első lépéseit.

A fájlok becsomagolása

Adja hozzá a két fájlt egy app.zip nevű csomagfájlhoz. A két fájlnak a .zip fájl gyökérszintjén kell lennie. Ha a fájlok egy mappában találhatók, a felügyelt alkalmazásdefiníció létrehozásakor hibaüzenet jelenik meg, amely szerint a szükséges fájlok nincsenek jelen.

Töltse fel az app.zip fájlt egy Azure Storage-fiókba, hogy a felügyelt alkalmazás definíciójának üzembe helyezésekor használhassa. A tárfiók nevének globálisan egyedinek kell lennie az Azure-ban, a hossznak pedig 3–24 karakternek kell lennie, csak kisbetűkkel és számokkal. A parancsban cserélje le a helyőrzőt <demostorageaccount> , beleértve a szögletes zárójeleket (<>) az egyedi tárfiók nevére.

A Visual Studio Code-ban nyisson meg egy új PowerShell-terminált, és jelentkezzen be az Azure-előfizetésbe.

Connect-AzAccount

A parancs megnyitja az alapértelmezett böngészőt, és kéri, hogy jelentkezzen be az Azure-ba. További információ: Bejelentkezés az Azure PowerShell-lel.

A csatlakozás után futtassa a következő parancsokat.

New-AzResourceGroup -Name packageStorageRG -Location westus3

$storageAccount = New-AzStorageAccount `
  -ResourceGroupName packageStorageRG `
  -Name "<demostorageaccount>" `
  -Location westus3 `
  -SkuName Standard_LRS `
  -Kind StorageV2 `
  -AllowBlobPublicAccess $true

$ctx = $storageAccount.Context

New-AzStorageContainer -Name appcontainer -Context $ctx -Permission blob

Set-AzStorageBlobContent `
  -File "app.zip" `
  -Container appcontainer `
  -Blob "app.zip" `
  -Context $ctx

A csomagfájl URI-jának tárolásához használja az alábbi parancsot egy nevesített packageuriváltozóban. A felügyelt alkalmazásdefiníció üzembe helyezésekor használja a változó értékét.

$packageuri=(Get-AzStorageBlob -Container appcontainer -Blob app.zip -Context $ctx).ICloudBlob.StorageUri.PrimaryUri.AbsoluteUri

A felügyelt alkalmazás definíciójának létrehozása

Ebben a szakaszban lekérheti az identitásadatokat a Microsoft Entra-azonosítóból, létrehoz egy erőforráscsoportot, és üzembe helyezi a felügyelt alkalmazásdefiníciót.

Csoportazonosító és szerepkördefiníció azonosítójának lekérése

A következő lépés egy felhasználó, biztonsági csoport vagy alkalmazás kiválasztása az ügyfél erőforrásainak kezelésére. Ez az identitás a hozzárendelt szerepkörnek megfelelően rendelkezik engedélyekkel a felügyelt erőforráscsoporthoz. A szerepkör lehet bármilyen beépített Azure-szerepkör, például tulajdonos vagy közreműködő.

Ez a példa egy biztonsági csoportot használ, és a Microsoft Entra-fióknak a csoport tagjának kell lennie. A csoport objektumazonosítójának lekéréséhez cserélje le a helyőrzőt <managedAppDemo> , beleértve a szögletes zárójeleket (<>) a csoport nevére. A felügyelt alkalmazásdefiníció üzembe helyezésekor használja a változó értékét.

Új Microsoft Entra-csoport létrehozásához lépjen a Microsoft Entra-csoportok és csoporttagság kezelése elemre.

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

Ezután szerezze be annak az Azure-beli beépített szerepkörnek a szerepkördefiníciós azonosítóját, amelyet hozzáférést szeretne biztosítani a felhasználónak, csoportnak vagy alkalmazásnak. A felügyelt alkalmazásdefiníció üzembe helyezésekor használja a változó értékét.

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

A definíció üzembehelyezési sablonjának létrehozása

A felügyelt alkalmazásdefiníciót egy Bicep-fájl használatával helyezheti üzembe a szolgáltatáskatalógusban.

Nyissa meg a Visual Studio Code-ot, hozzon létre egy deployDefinition.bicep nevű fájlt, és mentse.

Adja hozzá a következő Bicep-kódot, és mentse a fájlt.

param location string = resourceGroup().location

@description('Name of the managed application definition.')
param managedApplicationDefinitionName 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 Bicep managed application'
var definitionDescription = 'Sample Bicep 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
    authorizations: [
      {
        principalId: principalId
        roleDefinitionId: roleId
      }
    ]
  }
}

A sablon tulajdonságairól további információt a Microsoft.Solutions/applicationDefinitions webhelyen talál.

A lockLevel felügyelt erőforráscsoportban az ügyfél nem kívánt műveleteket hajt végre ezen az erőforráscsoporton. ReadOnly Jelenleg ez az egyetlen támogatott zárolási szint. ReadOnly megadja, hogy az ügyfél csak a felügyelt erőforráscsoportban található erőforrásokat olvassa be. A felügyelt erőforráscsoporthoz hozzáférést biztosító közzétevői identitások mentesülnek a zárolási szint alól.

A paraméterfájl létrehozása

A felügyelt alkalmazásdefiníció üzembehelyezési sablonjának több paraméterhez is bemenetre van szüksége. Az üzembe helyezési parancssor kéri az értékek megadását, vagy létrehozhat egy paraméterfájlt az értékekhez. Ebben a példában egy paraméterfájl használatával továbbítja a paraméterértékeket az üzembe helyezési parancsnak.

A Visual Studio Code-ban hozzon létre egy új fájlt deployDefinition.parameters.json néven, és mentse.

Adja hozzá a következőt a paraméterfájlhoz, és mentse. Ezután cserélje le a <placeholder values> szögletes zárójeleket (<>) az értékekre.

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentParameters.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "managedApplicationDefinitionName": {
      "value": "sampleBicepManagedApplication"
    },
    "packageFileUri": {
      "value": "<placeholder for the packageFileUri>"
    },
    "principalId": {
      "value": "<placeholder for principalid value>"
    },
    "roleId": {
      "value": "<placeholder for roleid value>"
    }
  }
}

Az alábbi táblázat a felügyelt alkalmazásdefiníció paraméterértékét ismerteti.

Paraméter Érték
managedApplicationDefinitionName A felügyelt alkalmazás definíciójának neve. Ebben a példában használja a sampleBicepManagedApplication parancsot.
packageFileUri Adja meg a .zip-csomag fájljának URI-címét. Használja a packageuri változó értékét. A formátum https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId A közzétevők főazonosítója, amely engedélyeket igényel a felügyelt erőforráscsoport erőforrásainak kezeléséhez. Használja a principalid változó értékét.
roleId A felügyelt erőforráscsoport engedélyeinek szerepkör-azonosítója. Például Tulajdonos, Közreműködő, Olvasó. Használja a roleid változó értékét.

A változóértékek lekérése:

  • Azure PowerShell: A PowerShellben írja be $variableName a változó értékének megjelenítéséhez.
  • Azure CLI: A Bashben írja be echo $variableName a változó értékének megjelenítéséhez.

A definíció üzembe helyezése

A felügyelt alkalmazás definíciójának üzembe helyezésekor elérhetővé válik a szolgáltatáskatalógusban. Ez a folyamat nem telepíti a felügyelt alkalmazás erőforrásait.

Hozzon létre egy bicepDefinitionRG nevű erőforráscsoportot, és telepítse a felügyelt alkalmazásdefiníciót.

New-AzResourceGroup -Name bicepDefinitionRG -Location westus3

New-AzResourceGroupDeployment `
  -ResourceGroupName bicepDefinitionRG `
  -TemplateFile deployDefinition.bicep `
  -TemplateParameterFile deployDefinition.parameters.json

Az eredmények ellenőrzése

Futtassa a következő parancsot annak ellenőrzéséhez, hogy a definíció közzé van-e téve a szolgáltatáskatalógusban.

Get-AzManagedApplicationDefinition -ResourceGroupName bicepDefinitionRG

Get-AzManagedApplicationDefinition Felsorolja a megadott erőforráscsoport összes elérhető definícióját, például a sampleBicepManagedApplicationt.

Győződjön meg arról, hogy a felhasználók hozzáférhetnek a definícióhoz

Ön hozzáfér a felügyelt alkalmazás definíciójához, azonban gondoskodnia kell róla, hogy a vállalat más felhasználói is hozzáférjenek. Engedélyezzen számukra legalább Olvasó szerepkört a definícióhoz. Előfordulhat, hogy ezt a hozzáférési szintet már megörökölték az előfizetéstől vagy az erőforráscsoporttól. Annak ellenőrzéséhez, hogy kinek van hozzáférése a definícióhoz, és felhasználókat vagy csoportokat vehet fel, lépjen az Azure-szerepkörök hozzárendelése az Azure Portalon.

Clean up resources

Ha telepíteni szeretné a definíciót, folytassa a következő lépésekkel , amelyek a cikkre mutató hivatkozásokat követve telepítik a definíciót a Bicep-lel.

Ha végzett a felügyelt alkalmazás definíciójával, törölheti a packageStorageRG és a bicepDefinitionRG nevű erőforráscsoportokat.

A parancssor kéri, hogy erősítse meg, hogy el szeretné távolítani az erőforráscsoportot.

Remove-AzResourceGroup -Name packageStorageRG

Remove-AzResourceGroup -Name bicepDefinitionRG

Következő lépések

Sikeresen közzétette a felügyelt alkalmazás definícióját. A következő lépés a definíció egy példányának üzembe helyezésének elsajátítása.

Rövid útmutató: Azure Managed Application-definíció üzembe helyezése a Bicep használatával.