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ğundan emin olun.
  • 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.

Önkoş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

var appServicePlanSku = 'B1'
var appServicePlanCapacity = 1
var appServiceName = '${appServiceNamePrefix}${uniqueString(resourceGroup().id)}'
var linuxFxVersion = 'DOTNETCORE|8.0'

resource appServicePlan 'Microsoft.Web/serverfarms@2023-01-01' = {
  name: appServicePlanName
  location: location
  sku: {
    name: appServicePlanSku
    capacity: appServicePlanCapacity
  }
  kind: 'linux'
  properties: {
    zoneRedundant: false
    reserved: true
  }
}

resource appService 'Microsoft.Web/sites@2023-01-01' = {
  name: appServiceName
  location: location
  properties: {
    serverFarmId: appServicePlan.id
    httpsOnly: true
    redundancyMode: 'None'
    siteConfig: {
      linuxFxVersion: linuxFxVersion
      minTlsVersion: '1.2'
      ftpsState: 'Disabled'
    }
  }
}

output appServicePlan string = appServicePlanName
output appServiceApp string = appService.properties.defaultHostName

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 metadata version 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.30.3.12046",
      "templateHash": "16466621031230437685"
    }
  },
  "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."
      }
    }
  },
  "variables": {
    "appServicePlanSku": "B1",
    "appServicePlanCapacity": 1,
    "appServiceName": "[format('{0}{1}', parameters('appServiceNamePrefix'), uniqueString(resourceGroup().id))]",
    "linuxFxVersion": "DOTNETCORE|8.0"
  },
  "resources": [
    {
      "type": "Microsoft.Web/serverfarms",
      "apiVersion": "2023-01-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      },
      "kind": "linux",
      "properties": {
        "zoneRedundant": false,
        "reserved": true
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2023-01-01",
      "name": "[variables('appServiceName')]",
      "location": "[parameters('location')]",
      "properties": {
        "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "httpsOnly": true,
        "redundancyMode": "None",
        "siteConfig": {
          "linuxFxVersion": "[variables('linuxFxVersion')]",
          "minTlsVersion": "1.2",
          "ftpsState": "Disabled"
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]"
      ]
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2023-01-01').defaultHostName]"
    }
  }
}

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, App Service adı ön ekini ve App Service planının adını girmenizi ister. mainTemplate.json dağıtımı sırasında değişkenler, adın appServiceName uniqueString Azure genelinde genel olarak benzersiz olması için ad ön ekine 13 karakterlik bir dize eklemek için işlevini kullanır.

Visual Studio Code'u açın, büyük/küçük harfe duyarlı adı createUiDefinition.json 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
          }
        ]
      }
    ],
    "outputs": {
      "location": "[location()]",
      "appServicePlanName": "[steps('webAppSettings').appServicePlanName]",
      "appServiceNamePrefix": "[steps('webAppSettings').appServiceName]"
    }
  }
}

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 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 <pkgstorageaccountname> 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 packageStorageGroup -Location westus

$pkgstorageparms = @{
  ResourceGroupName = "packageStorageGroup"
  Name = "<pkgstorageaccountname>"
  Location = "westus"
  SkuName = "Standard_LRS"
  Kind = "StorageV2"
  MinimumTlsVersion = "TLS1_2"
  AllowBlobPublicAccess = $true
  AllowSharedKeyAccess = $false
}

$pkgstorageaccount = New-AzStorageAccount @pkgstorageparms

değişkeni, $pkgstorageparms yeni depolama hesabını oluşturmak için komutunda kullanılan parametre değerlerinin okunabilirliğini artırmak için PowerShell splatting kullanır. Splatting, birden çok parametre değeri kullanan diğer PowerShell komutlarında kullanılır.

Depolama hesabını oluşturduktan sonra depolama hesabı kapsamına Depolama Blob Verileri Katkıda Bulunanı rol atamasını ekleyin. Microsoft Entra kullanıcı hesabınıza erişim atayın. Azure'daki erişim düzeyinize bağlı olarak, yöneticiniz tarafından atanan diğer izinlere ihtiyacınız olabilir. Daha fazla bilgi için bkz . Blob verilerine erişim için Azure rolü atama ve Azure portalını kullanarak Azure rolleri atama.

Rolü depolama hesabına ekledikten sonra Azure'da etkin hale gelmesi birkaç dakika sürer. Ardından kapsayıcıyı oluşturmak ve dosyayı karşıya yüklemek için gereken bağlamı oluşturabilirsiniz.

$pkgstoragecontext = New-AzStorageContext -StorageAccountName $pkgstorageaccount.StorageAccountName -UseConnectedAccount

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

$blobparms = @{
  File = "app.zip"
  Container = "appcontainer"
  Blob = "app.zip"
  Context = $pkgstoragecontext
}

Set-AzStorageBlobContent @blobparms

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 $pkgstoragecontext).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.bicepparam 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>.

using './deployDefinition.bicep'

param managedApplicationDefinitionName = 'sampleBicepManagedApplication'
param packageFileUri = '<placeholder for the packageFileUri>'
param principalId = '<placeholder for principalid value>'
param roleId = '<placeholder for roleid value>'

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

Parametre Value
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.
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.

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

New-AzResourceGroup -Name bicepDefinitionGroup -Location westus

$deployparms = @{
  ResourceGroupName = "bicepDefinitionGroup"
  TemplateFile = "deployDefinition.bicep"
  TemplateParameterFile = "deployDefinition-parameters.bicepparam"
  Name = "deployDefinition"
}

New-AzResourceGroupDeployment @deployparms

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 bicepDefinitionGroup

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 grubundan 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 packageStorageGroup ve bicepDefinitionGroup adlı kaynak gruplarını silebilirsiniz.

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

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name bicepDefinitionGroup

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.