Hızlı başlangıç: Azure Yönetilen Uygulama tanımı oluşturma ve yayımlama

Bu hızlı başlangıçta Azure Yönetilen Uygulamaları ile çalışmaya giriş bilgileri sağlanmaktadır. Hizmet kataloğunuzda depolanan ve kuruluşunuzun üyelerine yönelik yönetilen bir uygulama tanımı oluşturup yayımlarsınız.

Yönetilen bir uygulamayı hizmet kataloğunuzda yayımlamak için aşağıdaki görevleri gerçekleştirin:

  • Yönetilen uygulamayla dağıtılacak kaynakları tanımlayan bir Azure Resource Manager şablonu (ARM şablonu) oluşturun.
  • 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 kullanarak yönetilen uygulama tanımı geliştirebilirsiniz ancak tanımı Azure'da yayımlamadan önce arm şablonu JSON'a dönüştürülmesi gerekir. Daha fazla bilgi için Hızlı Başlangıç: Azure Yönetilen Uygulama tanımı oluşturmak ve yayımlamak için Bicep kullanma 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 hızlı başlangıcı tamamlamak için aşağıdaki öğelere ihtiyacınız vardır:

ARM şablonunu 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.

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

Aşağıdaki JSON dosyasını ekleyin ve dosyayı kaydedin. Uygulama için bir App Service, App Service planı ve depolama hesabı dağıtacak kaynakları tanımlar. Bu depolama hesabı yönetilen uygulama tanımını depolamak için kullanılmaz.

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

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 bkz . CreateUiDefinition'ı kullanmaya başlama.

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.

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

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 bu 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 bu değişkenin değerini kullanırsınız.

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

Yönetilen uygulama tanımını yayımlama

Yönetilen uygulama tanımınız için bir kaynak grubu oluşturun.

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

komutu, blob .zip dosyasının URL'sini depolamak için bir değişken oluşturur. Bu değişken, yönetilen uygulama tanımını oluşturan komutta kullanılır.

$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

Komut tamamlandığında, kaynak grubunuzda bir yönetilen uygulamanız olur.

Yukarıdaki örnekte kullanılan parametrelerden bazıları şunlardır:

  • ResourceGroupName: Yönetilen uygulama tanımının oluşturulduğu kaynak grubunun adı.
  • LockLevellockLevel: 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.
  • Authorization: Yönetilen kaynak grubuna izin vermek için kullanılan asıl kimliği ve rol tanımı kimliğini açıklar.
    • "${principalid}:$roleid" veya her değişken "${principalid}:${roleid}"için küme ayraçları kullanabilirsiniz.
    • Birden çok değeri ayırmak için virgül kullanın: "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri: Gerekli dosyaları içeren bir .zip paket dosyasının konumu.

Kullanıcıların tanımınızı görebilmesini sağlama

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 bkz . Azure portalını kullanarak Azure rolleri atama.

Kaynakları temizleme

Tanımı dağıtacaksanız, tanımı dağıtmak için makaleye bağlanan Sonraki adımlar bölümüyle devam edin.

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

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

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

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.