Rychlý start: Vytvoření a publikování definice spravované aplikace Azure pomocí Bicep

Tento rychlý start popisuje, jak pomocí Bicep vytvořit a publikovat definici spravované aplikace Azure ve vašem katalogu služeb. Definice v katalogu služeb je dostupná členům vaší organizace.

Pokud chcete vytvořit a publikovat definici spravované aplikace do katalogu služeb, postupujte následovně:

  • Pomocí Bicep můžete vytvořit šablonu a převést ji na šablonu Azure Resource Manageru (šablonu ARM). Šablona definuje prostředky Azure nasazené spravovanou aplikací.
  • Pomocí příkazu Bicep build převeďte Bicep na JSON. Po převodu souboru na JSON se doporučuje ověřit přesnost kódu.
  • Definujte prvky uživatelského rozhraní portálu pro nasazení spravované aplikace.
  • Vytvořte balíček .zip , který obsahuje požadované soubory JSON. Soubor balíčku .zip má limit 120 MB pro definici spravované aplikace katalogu služeb.
  • Publikujte definici spravované aplikace, aby byla dostupná v katalogu služeb.

Pokud je definice spravované aplikace větší než 120 MB nebo pokud chcete pro účely dodržování předpisů vaší organizace použít vlastní účet úložiště, přejděte do části Rychlý start: Vytvoření a publikování definice spravované aplikace Azure pomocí vlastního úložiště.

Pomocí nástroje Bicep můžete také nasadit definici spravované aplikace z katalogu služeb. Další informace najdete v rychlém startu: Použití Bicep k nasazení definice spravované aplikace Azure.

Předpoklady

K dokončení úkolů v tomto článku potřebujete následující položky:

Vytvoření souboru Bicep

Každá definice spravované aplikace obsahuje soubor s názvem mainTemplate.json. Šablona definuje prostředky Azure, které se mají nasadit, a liší se od běžné šablony ARM. Šablonu můžete vyvíjet pomocí Bicep a pak převést soubor Bicep na JSON.

Otevřete Visual Studio Code, vytvořte soubor s názvem mainTemplate.bicep s rozlišováním velkých a malých písmen a uložte ho.

Přidejte následující kód Bicep a soubor uložte. Definuje prostředky spravované aplikace pro nasazení služby App Service, plánu služby App Service a účtu úložiště.

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

Převod Bicep na JSON

K sestavení souboru mainTemplate.json použijte PowerShell nebo Azure CLI. Přejděte do adresáře, do kterého jste uložili soubor Bicep, a spusťte build příkaz.

bicep build mainTemplate.bicep

Další informace najdete v buildu Bicep.

Po převodu souboru Bicep na JSON by se měl váš soubor mainTemplate.json shodovat s následujícím příkladem. Ve vlastnostech metadata pro version a templateHash.

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

Definování prostředí portálu

Jako vydavatel definujete prostředí portálu pro vytvoření spravované aplikace. Soubor createUiDefinition.json vygeneruje uživatelské rozhraní portálu. Definujete, jak uživatelé poskytují vstup pro každý parametr pomocí ovládacích prvků , jako jsou rozevírací seznamy a textová pole.

V tomto příkladu vás uživatelské rozhraní vyzve k zadání předpony názvu služby App Service, názvu plánu služby App Service, předpony účtu úložiště a typu účtu úložiště. Během nasazování používají proměnné v mainTemplate.jsonuniqueString funkci k připojení řetězce s 13 znaky k předponám názvu, aby názvy byly globálně jedinečné v rámci Azure.

Otevřete Visual Studio Code, vytvořte soubor s názvem s rozlišováním velkých a malých písmen createUiDefinition.json a uložte ho.

Do souboru přidejte následující kód JSON a uložte ho.

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

Další informace najdete v tématu Začínáme s createUiDefinition.

Zabalení souborů

Přidejte dva soubory do souboru balíčku s názvem app.zip. Oba soubory musí být na kořenové úrovni souboru .zip . Pokud jsou soubory ve složce, při vytváření definice spravované aplikace se zobrazí chyba, která uvádí, že požadované soubory nejsou k dispozici.

Nahrajte soubor app.zip do účtu úložiště Azure, abyste ho mohli použít při nasazování definice spravované aplikace. Název účtu úložiště musí být globálně jedinečný v rámci Azure a délka musí být 3 až 24 znaků s malými písmeny a číslicemi. V příkazu nahraďte zástupný symbol <demostorageaccount> včetně úhlových závorek (<>) jedinečným názvem účtu úložiště.

V editoru Visual Studio Code otevřete nový terminál PowerShellu a přihlaste se k předplatnému Azure.

Connect-AzAccount

Příkaz otevře výchozí prohlížeč a vyzve vás, abyste se přihlásili k Azure. Další informace najdete v tématu Přihlášení pomocí Azure PowerShellu.

Po připojení spusťte následující příkazy.

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

Pomocí následujícího příkazu uložte identifikátor URI souboru balíčku do proměnné s názvem packageuri. Hodnotu proměnné použijete při nasazení definice spravované aplikace.

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

Vytvoření definice spravované aplikace

V této části získáte informace o identitě z ID Microsoft Entra, vytvoříte skupinu prostředků a nasadíte definici spravované aplikace.

Získání ID skupiny a ID definice role

Dalším krokem je vybrat uživatele, skupinu zabezpečení nebo aplikaci pro správu prostředků pro zákazníka. Tato identita má oprávnění ke spravované skupině prostředků podle přiřazené role. Role může být libovolná předdefinovaná role Azure, jako je vlastník nebo přispěvatel.

Tento příklad používá skupinu zabezpečení a váš účet Microsoft Entra by měl být členem skupiny. Pokud chcete získat ID objektu skupiny, nahraďte zástupný symbol <managedAppDemo> včetně úhlových závorek (<>) názvem vaší skupiny. Hodnotu proměnné použijete při nasazení definice spravované aplikace.

Pokud chcete vytvořit novou skupinu Microsoft Entra, přejděte do části Správa skupin Microsoft Entra a členství ve skupinách.

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

Dále získejte ID definice role předdefinované role Azure, kterou chcete udělit přístup k uživateli, skupině nebo aplikaci. Hodnotu proměnné použijete při nasazení definice spravované aplikace.

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

Vytvoření šablony nasazení definice

K nasazení definice spravované aplikace v katalogu služeb použijte soubor Bicep.

Otevřete Visual Studio Code, vytvořte soubor s názvem deployDefinition.bicep a uložte ho.

Přidejte následující kód Bicep a soubor uložte.

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
      }
    ]
  }
}

Další informace o vlastnostech šablony najdete v tématu Microsoft.Solutions/applicationDefinitions.

Skupina lockLevel spravovaných prostředků zabrání zákazníkovi v provádění nežádoucích operací s touto skupinou prostředků. ReadOnly V současné době je jedinou podporovanou úrovní uzamčení. ReadOnly určuje, že zákazník může číst pouze prostředky, které jsou ve spravované skupině prostředků. Identity vydavatele, kterým je udělen přístup ke spravované skupině prostředků, jsou z úrovně uzamčení vyloučené.

Vytvoření souboru parametrů

Šablona nasazení definice spravované aplikace potřebuje vstup pro několik parametrů. Příkaz nasazení vás vyzve k zadání hodnot nebo můžete pro tyto hodnoty vytvořit soubor parametrů. V tomto příkladu použijeme soubor parametrů k předání hodnot parametrů příkazu nasazení.

V editoru Visual Studio Code vytvořte nový soubor s názvem deployDefinition.parameters.json a uložte ho.

Do souboru parametrů přidejte následující kód a uložte ho. Potom nahraďte <placeholder values> hodnoty včetně úhlových závorek (<>).

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

Následující tabulka popisuje hodnoty parametrů pro definici spravované aplikace.

Parametr Hodnota
managedApplicationDefinitionName Název definice spravované aplikace V tomto příkladu použijte sampleBicepManagedApplication.
packageFileUri Zadejte identifikátor URI souboru balíčku .zip . Použijte hodnotu proměnné packageuri . Formát je https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId ID objektu zabezpečení vydavatelů, které potřebuje oprávnění ke správě prostředků ve spravované skupině prostředků. Použijte hodnotu proměnné principalid .
roleId ID role pro oprávnění ke spravované skupině prostředků. Například Vlastník, Přispěvatel, Čtenář. Použijte hodnotu proměnné roleid .

Získání hodnot proměnných:

  • Azure PowerShell: V PowerShellu zadejte $variableName hodnotu proměnné.
  • Azure CLI: V Bash zadejte echo $variableName hodnotu proměnné.

Nasazení definice

Když nasadíte definici spravované aplikace, bude dostupná v katalogu služeb. Tento proces nenasazuje prostředky spravované aplikace.

Vytvořte skupinu prostředků s názvem bicepDefinitionRG a nasaďte definici spravované aplikace.

New-AzResourceGroup -Name bicepDefinitionRG -Location westus3

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

Ověření výsledků

Spuštěním následujícího příkazu ověřte, že je definice publikována v katalogu služeb.

Get-AzManagedApplicationDefinition -ResourceGroupName bicepDefinitionRG

Get-AzManagedApplicationDefinition zobrazí seznam všech dostupných definic v zadané skupině prostředků, jako je sampleBicepManagedApplication.

Ujistěte se, že uživatelé mají přístup k vaší definici.

Máte přístup k definici spravované aplikace, ale je potřeba zajistit přístup i pro ostatní uživatele ve vaší organizaci. Udělte jim k definici alespoň přístup role Čtenář. Je možné, že tuto úroveň přístupu zdědili z předplatného nebo skupiny prostředků. Pokud chcete zkontrolovat, kdo má přístup k definici, a přidat uživatele nebo skupiny, přejděte k přiřazení rolí Azure pomocí webu Azure Portal.

Vyčištění prostředků

Pokud definici nasadíte, pokračujte v části Další kroky , která odkazuje na článek a nasadí definici pomocí Bicep.

Pokud jste dokončili definici spravované aplikace, můžete odstranit skupiny prostředků, které jste vytvořili s názvem packageStorageRG a bicepDefinitionRG.

Příkaz vás vyzve k potvrzení, že chcete odebrat skupinu prostředků.

Remove-AzResourceGroup -Name packageStorageRG

Remove-AzResourceGroup -Name bicepDefinitionRG

Další kroky

Publikovali jste definici spravované aplikace. V dalším kroku se dozvíte, jak nasadit instanci této definice.