Aracılığıyla paylaş


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ğıtan 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.

Önkoş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ı adı mainTemplate.json 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-09-01",
      "name": "[parameters('appServicePlanName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[variables('appServicePlanSku')]",
        "capacity": "[variables('appServicePlanCapacity')]"
      }
    },
    {
      "type": "Microsoft.Web/sites",
      "apiVersion": "2022-09-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')), '2023-01-01').keys[0].value)]"
            }
          ]
        }
      },
      "dependsOn": [
        "[resourceId('Microsoft.Web/serverfarms', parameters('appServicePlanName'))]",
        "[resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName'))]"
      ]
    },
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2023-01-01",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot",
        "allowSharedKeyAccess": false,
        "minimumTlsVersion": "TLS1_2"
      }
    }
  ],
  "outputs": {
    "appServicePlan": {
      "type": "string",
      "value": "[parameters('appServicePlanName')]"
    },
    "appServiceApp": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Web/sites', variables('appServiceName')), '2022-09-01').defaultHostName]"
    },
    "storageAccount": {
      "type": "string",
      "value": "[reference(resourceId('Microsoft.Storage/storageAccounts', variables('storageAccountName')), '2023-01-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 içindeki 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ı 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
          }
        ]
      },
      {
        "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 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.

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 blob veri katkıda bulunanı Depolama rol atamasını depolama hesabı kapsamına 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şmek için Azure rolü 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

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 westus

komutu, blob paket .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 $pkgstoragecontext

$publishparms = @{
  Name = "sampleManagedApplication"
  Location = "westus"
  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
}

New-AzManagedApplicationDefinition @publishparms

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 .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 grubundan 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.