Hızlı Başlangıç: Azure Yönetilen Uygulama tanımı oluşturmak ve yayımlamak için Bicep kullanma

Bu hızlı başlangıçta hizmet kataloğunuzda Azure Yönetilen Uygulama tanımı oluşturmak ve yayımlamak için Bicep'in nasıl kullanılacağı açıklanmaktadır. Hizmet kataloğunuzdaki tanım, kuruluşunuzun üyeleri tarafından kullanılabilir.

Yönetilen uygulama tanımı oluşturmak ve hizmet kataloğunuzda yayımlamak için aşağıdaki görevleri gerçekleştirin:

  • Şablonunuzu geliştirmek ve bir Azure Resource Manager şablonuna (ARM şablonu) dönüştürmek için Bicep'i kullanın. Şablon, yönetilen uygulama tarafından dağıtılan Azure kaynaklarını tanımlar.
  • Bicep komutuyla Bicep'i JSON'a build dönüştürün. Dosya JSON'a dönüştürüldükten sonra kodun doğruluğu doğrulanması önerilir.
  • Yönetilen uygulamayı dağıtırken portal için kullanıcı arabirimi öğeleri tanımlayın.
  • Gerekli JSON dosyalarını içeren bir .zip paketi oluşturun. .zip paket dosyasının, hizmet kataloğunun yönetilen uygulama tanımı için 120 MB sınırı vardır.
  • Yönetilen uygulama tanımını, hizmet kataloğunuzda kullanılabilir olacak şekilde yayımlayın.

Yönetilen uygulama tanımınız 120 MB'tan fazlaysa veya kuruluşunuzun uyumluluk nedenleriyle kendi depolama hesabınızı kullanmak istiyorsanız Hızlı Başlangıç: Azure Yönetilen Uygulama tanımı oluşturmak ve yayımlamak için Kendi depolama alanınızı getirme bölümüne gidin.

Bicep'i hizmet kataloğunuzdan yönetilen bir uygulama tanımı dağıtmak için de kullanabilirsiniz. Daha fazla bilgi için Hızlı Başlangıç: Azure Yönetilen Uygulama tanımını dağıtmak için Bicep kullanma bölümüne gidin.

Ön koşullar

Bu makaledeki görevleri tamamlamak için aşağıdaki öğelere ihtiyacınız vardır:

Bicep dosyası oluşturma

Her yönetilen uygulama tanımı mainTemplate.json adlı bir dosya içerir. Şablon, dağıtılacak Azure kaynaklarını tanımlar ve normal ARM şablonundan farklı değildir. Bicep kullanarak şablonu geliştirebilir ve ardından Bicep dosyasını JSON'a dönüştürebilirsiniz.

Visual Studio Code'u açın, mainTemplate.bicep adlı büyük/küçük harfe duyarlı bir dosya oluşturun ve kaydedin.

Aşağıdaki Bicep kodunu ekleyin ve dosyayı kaydedin. App Service, App Service planı ve depolama hesabı dağıtmak için yönetilen uygulamanın kaynaklarını tanımlar.

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'i JSON'a dönüştürme

MainTemplate.json dosyasını oluşturmak için PowerShell veya Azure CLI kullanın. Bicep dosyanızı kaydettiğiniz dizine build gidin ve komutunu çalıştırın.

bicep build mainTemplate.bicep

Daha fazla bilgi edinmek için Bicep derlemesi'ne gidin.

Bicep dosyası JSON'a dönüştürüldükten sonra mainTemplate.json dosyanız aşağıdaki örnekle eşleşmelidir. ve templateHashözelliklerinde metadataversion farklı değerleriniz olabilir.

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

Portal deneyiminizi tanımlama

Yayımcı olarak, yönetilen uygulamayı oluşturmak için portal deneyimini tanımlarsınız. createUiDefinition.json dosyası portalın kullanıcı arabirimini oluşturur. Açılan menüler ve metin kutuları gibi denetim öğelerini kullanarak kullanıcıların her parametre için nasıl giriş sağladığını tanımlarsınız.

Bu örnekte kullanıcı arabirimi Sizden App Service ad ön ekini, App Service planının adını, depolama hesabı ön ekini ve depolama hesabı türünü girmenizi ister. Dağıtım sırasında mainTemplate.json dosyasındaki değişkenler, ad ön eklerine 13 karakterlik bir dize ekleyerek adların Azure genelinde genel olarak benzersiz olmasını sağlamak için işlevini kullanıruniqueString.

Visual Studio Code'u açın, büyük/küçük harfe duyarlı createUiDefinition.json adlı bir dosya oluşturun ve kaydedin.

Aşağıdaki JSON kodunu dosyaya ekleyin ve kaydedin.

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

Daha fazla bilgi edinmek için CreateUiDefinition kullanmaya başlama konusuna gidin.

Dosyaları paketleme

İki dosyayı app.zip adlı bir paket dosyasına ekleyin. İki dosya .zip dosyasının kök düzeyinde olmalıdır. Dosyalar bir klasördeyse, yönetilen uygulama tanımını oluşturduğunuzda gerekli dosyaların mevcut olmadığını belirten bir hata alırsınız.

Yönetilen uygulamanın tanımını dağıtırken kullanabilmek için app.zip dosyasını bir Azure depolama hesabına yükleyin. Depolama hesabı adı Azure genelinde genel olarak benzersiz olmalı ve uzunluğu yalnızca küçük harf ve sayılarla 3-24 karakter olmalıdır. komutta köşeli ayraçlar ()<> içeren yer tutucuyu <demostorageaccount> benzersiz depolama hesabı adınızla değiştirin.

Visual Studio Code'da yeni bir PowerShell terminali açın ve Azure aboneliğinizde oturum açın.

Connect-AzAccount

Komut varsayılan tarayıcınızı açar ve Azure'da oturum açmanızı ister. Daha fazla bilgi için Bkz . Azure PowerShell ile oturum açma.

Bağlandıktan sonra aşağıdaki komutları çalıştırın.

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

Paket dosyasının URI'sini adlı packageuribir değişkende depolamak için aşağıdaki komutu kullanın. Yönetilen uygulama tanımını dağıtırken değişkenin değerini kullanırsınız.

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

Yönetilen uygulama tanımı oluşturma

Bu bölümde, Microsoft Entra ID'den kimlik bilgilerini alır, bir kaynak grubu oluşturur ve yönetilen uygulama tanımını dağıtırsınız.

Grup kimliğini ve rol tanımı kimliğini alma

Sonraki adım, müşterinin kaynaklarını yönetmek için bir kullanıcı, güvenlik grubu veya uygulama seçmektir. Bu kimlik, atanan role göre yönetilen kaynak grubunda izinlere sahiptir. Rol, Sahip veya Katkıda Bulunan gibi herhangi bir Azure yerleşik rolü olabilir.

Bu örnekte bir güvenlik grubu kullanılır ve Microsoft Entra hesabınız grubun bir üyesi olmalıdır. Grubun nesne kimliğini almak için köşeli ayraçlar ()<> içeren yer tutucuyu <managedAppDemo> grubunuzun adıyla değiştirin. Yönetilen uygulama tanımını dağıtırken değişkenin değerini kullanırsınız.

Yeni bir Microsoft Entra grubu oluşturmak için Microsoft Entra gruplarını ve grup üyeliğini yönetme bölümüne gidin.

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

Ardından, kullanıcıya, gruba veya uygulamaya erişim vermek istediğiniz Azure yerleşik rolünün rol tanımı kimliğini alın. Yönetilen uygulama tanımını dağıtırken değişkenin değerini kullanırsınız.

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

Tanım dağıtım şablonunu oluşturma

Hizmet kataloğunuzda yönetilen uygulama tanımını dağıtmak için bir Bicep dosyası kullanın.

Visual Studio Code'u açın, deployDefinition.bicep adlı bir dosya oluşturun ve kaydedin.

Aşağıdaki Bicep kodunu ekleyin ve dosyayı kaydedin.

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

Şablonun özellikleri hakkında daha fazla bilgi için Microsoft.Solutions/applicationDefinitions adresine gidin.

lockLevel yönetilen kaynak grubundaki, müşterinin bu kaynak grubunda istenmeyen işlemler gerçekleştirmesini engeller. ReadOnly Şu anda desteklenen tek kilit düzeyidir. ReadOnly müşterinin yalnızca yönetilen kaynak grubunda bulunan kaynakları okuyabileceğini belirtir. Yönetilen kaynak grubuna erişim verilen yayımcı kimlikleri kilit düzeyinden muaf tutulur.

Parametre dosyasını oluşturma

Yönetilen uygulama tanımının dağıtım şablonunun birkaç parametre için giriş yapması gerekir. Dağıtım komutu sizden değerleri ister veya değerler için bir parametre dosyası oluşturabilirsiniz. Bu örnekte, parametre değerlerini dağıtım komutuna geçirmek için bir parametre dosyası kullanırız.

Visual Studio Code'da deployDefinition.parameters.json adlı yeni bir dosya oluşturun ve kaydedin.

Parametre dosyanıza aşağıdakileri ekleyin ve kaydedin. Ardından, köşeli ayraçları ()<> dahil eden değerini değerlerinizle değiştirin<placeholder values>.

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

Aşağıdaki tabloda yönetilen uygulama tanımı için parametre değerleri açıklanmaktadır.

Parametre Değer
managedApplicationDefinitionName Yönetilen uygulama tanımının adı. Bu örnek için sampleBicepManagedApplication kullanın.
packageFileUri .zip paket dosyanızın URI'sini girin. Değişkeninizin packageuri değerini kullanın. Biçim şöyledir: https://yourStorageAccountName.blob.core.windows.net/appcontainer/app.zip.
principalId Yönetilen kaynak grubundaki kaynakları yönetmek için izinlere ihtiyaç duyan yayımcı asıl kimliği. Değişkeninizin principalid değerini kullanın.
roleId Yönetilen kaynak grubuna yönelik izinler için rol kimliği. Örneğin Sahip, Katkıda Bulunan, Okuyucu. Değişkeninizin roleid değerini kullanın.

Değişken değerlerinizi almak için:

  • Azure PowerShell: PowerShell'de bir değişkenin değerini görüntülemek için yazın $variableName .
  • Azure CLI: Bash'te bir değişkenin değerini görüntülemek için yazın echo $variableName .

Tanımı dağıtma

Yönetilen uygulamanın tanımını dağıttığınızda, hizmet kataloğunuzda kullanılabilir hale gelir. Bu işlem yönetilen uygulamanın kaynaklarını dağıtmaz.

bicepDefinitionRG adlı bir kaynak grubu oluşturun ve yönetilen uygulama tanımını dağıtın.

New-AzResourceGroup -Name bicepDefinitionRG -Location westus3

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

Sonuçları doğrulama

Tanımın hizmet kataloğunuzda yayımlandığını doğrulamak için aşağıdaki komutu çalıştırın.

Get-AzManagedApplicationDefinition -ResourceGroupName bicepDefinitionRG

Get-AzManagedApplicationDefinitionsampleBicepManagedApplication gibi belirtilen kaynak grubundaki tüm kullanılabilir tanımları listeler.

Kullanıcıların tanımınıza erişebildiğinden emin olun

Yönetilen uygulama tanımına eriştiniz ama kuruluşunuzdaki diğer kullanıcıların da erişebildiğinden emin olmak istiyorsunuz. Onlara tanım üzerinde en azından Okuyucu rolü verin. Bu erişim düzeyini abonelikten veya kaynak grubunda devralmış olabilirler. Kimlerin tanıma erişimi olduğunu denetlemek ve kullanıcı veya grup eklemek için Azure portalını kullanarak Azure rolleri atama bölümüne gidin.

Kaynakları temizleme

Tanımı dağıtacaksanız, bicep ile tanımı dağıtmak için makaleye bağlanan Sonraki adımlar bölümüne geçin.

Yönetilen uygulama tanımıyla işiniz bittiyse package Depolama RG ve bicepDefinitionRG adlı kaynak gruplarını silebilirsiniz.

Komut, kaynak grubunu kaldırmak istediğinizi onaylamanızı ister.

Remove-AzResourceGroup -Name packageStorageRG

Remove-AzResourceGroup -Name bicepDefinitionRG

Sonraki adımlar

Yönetilen uygulama tanımını yayımladınız. Sonraki adım, bu tanımın bir örneğini dağıtmayı öğrenmektir.