Inicio rápido: Creación y publicación de una definición de aplicación administrada de Azure

En este inicio rápido se proporciona una introducción al uso de Azure Managed Applications. Creará y publicará una definición de aplicación administrada que está almacenada en el catálogo de servicios y que está pensada para los miembros de la organización.

Para publicar una aplicación administrada en el catálogo de servicios, debe realizar las siguientes tareas:

  • Cree una plantilla de Azure Resource Manager (plantilla de ARM) que defina los recursos que se van a implementar con la aplicación administrada.
  • Defina los elementos de la interfaz de usuario del portal cuando implemente la aplicación administrada.
  • Cree un paquete .zip que contenga los archivos de JSON necesarios. El archivo de paquete .zip tiene un límite de 120 MB para las definiciones de aplicación administrada de un catálogo de servicios.
  • Implemente la definición de aplicación administrada para que esté disponible en el catálogo de servicios.

Si la definición de aplicación administrada tiene más de 120 MB o si desea usar su propia cuenta de almacenamiento por motivos de cumplimiento de la organización, vaya a Inicio rápido: traiga su propio almacenamiento para crear y publicar una definición de aplicación administrada de Azure.

Puede usar Bicep para desarrollar una definición de aplicación administrada, pero deberá convertirse en JSON de plantilla de ARM para poder publicar la definición en Azure. Para más información, vaya a Inicio rápido: Usar Bicep para crear y publicar una definición de aplicación administrada por Azure.

También puede utilizar Bicep para implementar una definición de aplicación administrada desde el catálogo de servicios. Para más información, vaya a Inicio rápido: Usar Bicep para implementar una definición de aplicación administrada por Azure.

Prerrequisitos

Para completar este inicio rápido, necesita los siguientes elementos:

Creación de la plantilla de Resource Manager

Todas las definiciones de aplicaciones administradas incluyen un archivo denominado mainTemplate.json. La plantilla define los recursos de Azure que se van a implementar, y no difiere de una plantilla de ARM normal.

Abra Visual Studio Code, cree un archivo con el nombre mainTemplate.json (se distingue entre mayúsculas y minúsculas) y guárdelo.

Agregue el siguiente código JSON y guarde el archivo. Define los recursos para implementar una instancia de App Service, un plan de App Service, una cuenta de almacenamiento para la aplicación. Esta cuenta de almacenamiento se usa para almacenar la definición de aplicación administrada.

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

Definición de la experiencia del portal

Como publicador, define la experiencia del portal para crear la aplicación administrada. El archivo createUiDefinition.json genera la interfaz de usuario del portal. Defina cómo los usuarios proporcionan la entrada para cada parámetro mediante elementos de control, como las listas desplegables y los cuadros de texto.

En este ejemplo, la interfaz de usuario le pide que escriba el prefijo de nombre de App Service, el nombre del plan de App Service, el prefijo de la cuenta de almacenamiento y el tipo de cuenta de almacenamiento. Durante la implementación, las variables de mainTemplate.json usarán la función uniqueString para anexar una cadena de 13 caracteres a los prefijos de nombre para que los nombres sean únicos globalmente en Azure.

Abra Visual Studio Code, cree un archivo con el nombre createUiDefinition.json (se distingue entre mayúsculas y minúsculas) y guárdelo.

Agregue el siguiente código JSON y guárdelo.

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

Para más información, consulte Introducción a CreateUiDefinition.

Empaquetado de los archivos

Agregue los dos archivos a un paquete de archivo denominado app.zip. Los dos archivos tienen que estar en el nivel raíz del archivo .zip. Si los archivos estuvieran en una carpeta, cuando cree la definición de la aplicación administrada, recibirá un error indicando que los archivos necesarios no están presentes.

Cargue app.zip en una cuenta de almacenamiento de Azure para que pueda usarla al implementar la definición de la aplicación administrada. El nombre de la cuenta de almacenamiento debe ser único globalmente en Azure y su longitud debe ser de entre 3 y 24 caracteres (solo letras en minúsculas y números). En el comando, reemplace el marcador de posición <demostorageaccount>, incluyendo los corchetes angulares (<>), por el nombre de la cuenta de almacenamiento único.

En Visual Studio Code, abra un nuevo terminal de PowerShell e inicie sesión en su suscripción de Azure.

Connect-AzAccount

Este comando abrirá el explorador predeterminado y le solicitará iniciar sesión en Azure. Para obtener más información, vaya a Inicio de sesión con Azure PowerShell.

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

Creación de la definición de aplicación administrada

En esta sección, obtiene información de identidad de Microsoft Entra ID, crea un grupo de recursos e implementa la definición de aplicación administrada.

Obtención del identificador de grupo y el identificador de definición de roles

El siguiente paso consiste en seleccionar un usuario, grupo de seguridad o aplicación para administrar los recursos para el cliente. Esta identidad tiene permisos en el grupo de recursos administrado según el rol asignado. El rol puede ser cualquier rol integrado en Azure, como Propietario o Colaborador.

En este ejemplo se usa un grupo de seguridad, y la cuenta de Microsoft Entra deberá ser miembro del grupo. Para obtener el id. de objeto del grupo, reemplace el marcador de posición <managedAppDemo>, incluyendo los corchetes angulares (<>), con el nombre del grupo. Use el valor de esta variable al implementar la definición de aplicación administrada.

Para crear un nuevo grupo de Microsoft Entra, vaya a Administración de grupos y pertenencia a grupos de Microsoft Entra.

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

A continuación, obtenga el identificador de definición de rol para el rol integrado de Azure que desee para conceder acceso al usuario, grupo o aplicación. Use el valor de esta variable al implementar la definición de aplicación administrada.

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

Publicación de la definición de aplicación administrada

Cree un grupo de recursos para la definición de aplicación administrada.

New-AzResourceGroup -Name appDefinitionGroup -Location westus3

El blob comando crea una variable para almacenar la URL del archivo .zip del paquete. Esa variable se usa en el comando que crea la definición de aplicación administrada.

$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

Cuando finalice el comando, tendrá una definición de aplicación administrada en el grupo de recursos.

Algunos de los parámetros usados en el ejemplo anterior son:

  • ResourceGroupName: El nombre del grupo de recursos donde se creó la definición de aplicación administrada.
  • LockLevel: El lockLevel del grupo de recursos administrados impedirá que el cliente realice operaciones no deseadas en este grupo de recursos. Actualmente, ReadOnly es el único nivel de bloqueo admitido. ReadOnly especifica que el cliente solo puede leer los recursos presentes en el grupo de recursos administrado. Las identidades del publicador a las que se concede acceso al grupo de recursos administrados están exentas del nivel de bloqueo.
  • Authorization: Describe el identificador de entidad de seguridad y el identificador de definición de rol que se usan para conceder el permiso al grupo de recursos administrado.
    • "${principalid}:$roleid" o puede usar llaves para cada variable "${principalid}:${roleid}".
    • Use una coma para separar varios valores: "${principalid1}:$roleid1", "${principalid2}:$roleid2".
  • PackageFileUri: ubicación del archivo de paquete .zip que contiene los archivos necesarios.

Asegurarse de que los usuarios pueden ver la definición

Tiene acceso a la definición de la aplicación administrada, pero desea asegurarse de que otros usuarios de su organización puedan acceder a ella. Concédales al menos el rol de lector en la definición. Puede haber heredado este nivel de acceso de la suscripción o del grupo de recursos. Para comprobar quién tiene acceso a la definición y agregar usuarios o grupos, consulte Asignación de roles de Azure mediante Azure Portal.

Limpieza de recursos

Si va a implementar la definición, continúe con la sección Pasos siguientes que se vincula al artículo para implementar la definición.

Si ha terminado con la definición de la aplicación administrada, puede eliminar los grupos de recursos creados denominados packageStorageGroup y appDefinitionGroup.

El comando le pide que confirme que quiere quitar el grupo de recursos.

Remove-AzResourceGroup -Name packageStorageGroup

Remove-AzResourceGroup -Name appDefinitionGroup

Pasos siguientes

Ha publicado la definición de aplicación administrada. El siguiente paso es aprender a implementar una instancia de esa definición.