Azure Azure Resource Manager Managed Applications
Azure Azure Resource Manager Managed Applications
e INFORMACIÓN GENERAL
p CONCEPTO
f INICIO RÁPIDO
g TUTORIAL
Control de acceso
Elementos de la interfaz
Funciones de la interfaz
Administrar recursos
7 Nota
Las aplicaciones administradas le permiten establecer una relación continuada con los
clientes. Defina los términos de administración de la aplicación y todos los cargos se
controlarán mediante la facturación de Azure.
Catálogo de servicios
El catálogo de servicios es un catálogo interno de soluciones aprobadas para los
usuarios de una organización. Usará el catálogo para cumplir los estándares
organizativos y ofrecer al mismo tiempo soluciones para las organizaciones. Los
empleados usan el catálogo de servicios para encontrar aplicaciones recomendadas y
aprobadas por sus departamentos de TI. También pueden ver las aplicaciones
administradas que otras personas de su organización comparten con ellos.
Azure Marketplace
Los proveedores que deseen facturar sus servicios pueden disponer de una aplicación
administrada mediante Azure Marketplace. Después de que el proveedor publica una
aplicación, esta está disponible para los usuarios de fuera de la organización. Con este
enfoque, los proveedores de servicios administrados (MSP), los proveedores de software
independiente (ISV) o los integradores de sistemas (SI) pueden ofrecer sus soluciones a
todos los clientes de Azure.
No se admite actualmente la restricción del acceso para las operaciones de datos para
todos los proveedores de datos en Azure.
El cliente tiene acceso total al grupo de recursos y lo utiliza para administrar el ciclo de
vida de la aplicación administrada.
Proveedor de recursos
Las aplicaciones administradas usan el proveedor de recursos [Link] con
JSON de plantilla de ARM. Para más información, consulte los tipos de recursos y las
versiones de API.
[Link]/applicationDefinitions
[Link]/applications
[Link]/jitRequests
Azure Policy
Puede aplicar una directiva de Azure Policy para auditar la aplicación administrada. Las
definiciones de directiva se aplican para garantizar que las instancias implementadas de
la aplicación administrada cumplan con los requisitos de seguridad y datos. Si la
aplicación interactúa con datos confidenciales, asegúrese de que se ha evaluado cómo
debe protegerse. Por ejemplo, si la aplicación interactúa con datos de Microsoft 365,
aplique una definición de directiva para asegurarse de que el cifrado de datos esté
habilitado.
Pasos siguientes
En este artículo, ha aprendido acerca de las ventajas de uso de las aplicaciones
administradas. Vaya al siguiente artículo para crear una definición de aplicación
administrada.
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.
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.
Prerrequisitos
Para completar este inicio rápido, necesita los siguientes elementos:
Una cuenta de Azure con una suscripción activa y permisos para recursos de Azure
Active Directory, como usuarios, grupos o entidades de servicio. Antes de
comenzar, si no tiene una cuenta, cree una gratuita .
Visual Studio Code con la extensión Herramientas de Azure Resource Manager
más reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para
Visual Studio Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
Abra Visual Studio Code, cree un archivo con el nombre [Link] (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.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"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": "[Link]/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('appServicePlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('appServicePlanSku')]",
"capacity": "[variables('appServicePlanCapacity')]"
}
},
{
"type": "[Link]/sites",
"apiVersion": "2022-03-01",
"name": "[variables('appServiceName')]",
"location": "[parameters('location')]",
"properties": {
"serverFarmId": "[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"httpsOnly": true,
"siteConfig": {
"appSettings": [
{
"name": "AppServiceStorageConnectionString",
"value": "[format('DefaultEndpointsProtocol=https;AccountName=
{0};EndpointSuffix={1};Key={2}', variables('storageAccountName'),
environment().[Link],
listKeys(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').keys[0].value)]"
}
]
}
},
"dependsOn": [
"[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"[resourceId('[Link]/storageAccounts',
variables('storageAccountName'))]"
]
},
{
"type": "[Link]/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('[Link]/sites',
variables('appServiceName')), '2022-03-01').defaultHostName]"
},
"storageAccount": {
"type": "string",
"value": "[reference(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').[Link]]"
}
}
}
Abra Visual Studio Code, cree un archivo con el nombre [Link] (se
distingue entre mayúsculas y minúsculas) y guárdelo.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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').[Link]]",
"storageAccountType": "[steps('storageConfig').[Link]]"
}
}
}
Cargue [Link] 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.
PowerShell
Azure PowerShell
Connect-AzAccount
Azure PowerShell
$storageAccount = New-AzStorageAccount `
-ResourceGroupName packageStorageGroup `
-Name "<demostorageaccount>" `
-Location westus3 `
-SkuName Standard_LRS `
-Kind StorageV2
$ctx = $[Link]
Set-AzStorageBlobContent `
-File "[Link]" `
-Container appcontainer `
-Blob "[Link]" `
-Context $ctx
PowerShell
Azure PowerShell
Azure PowerShell
PowerShell
Azure PowerShell
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.
Azure PowerShell
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 $[Link]
"${principalid}:${roleid}" .
Use una coma para separar varios valores: "${principalid1}:$roleid1",
"${principalid2}:$roleid2" .
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.
PowerShell
Azure PowerShell
Pasos siguientes
Ha publicado la definición de aplicación administrada. El siguiente paso es aprender a
implementar una instancia de esa definición.
En este inicio rápido se proporciona una introducción a Traiga su propio almacenamiento (BYOS)
para una aplicación administrada de Azure. Creará y publicará una definición de aplicación
administrada en el catálogo de servicios para los miembros de la organización. Al usar su propia
cuenta de almacenamiento, la definición de la aplicación administrada podrá superar el límite de
120 MB del catálogo de servicios.
Crear una plantilla de Azure Resource Manager (plantilla de ARM) que defina los recursos
de Azure implementados por la aplicación administrada.
Defina los elementos de la interfaz de usuario del portal cuando implemente la aplicación
administrada.
Crear un paquete .zip que contenga los archivos de JSON necesarios.
Crear una cuenta de almacenamiento donde almacene la definición de aplicación
administrada.
Implemente la definición de aplicación administrada en su propia cuenta de
almacenamiento para que esté disponible en el catálogo de servicios.
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:
Una cuenta de Azure con una suscripción activa y permisos para recursos de Azure Active
Directory, como usuarios, grupos o entidades de servicio. Antes de comenzar, si no tiene
una cuenta, cree una gratuita .
Visual Studio Code con la extensión Herramientas de Azure Resource Manager más
reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para Visual Studio
Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
Abra Visual Studio Code, cree un archivo con el nombre [Link] (se distingue entre
mayúsculas y minúsculas) y guárdelo.
Agregue el siguiente código JSON y guarde el archivo. Define los recursos de la aplicación
administrada para implementar un plan de App Service, App Service y una cuenta de
almacenamiento.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"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": "[Link]/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('appServicePlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('appServicePlanSku')]",
"capacity": "[variables('appServicePlanCapacity')]"
}
},
{
"type": "[Link]/sites",
"apiVersion": "2022-03-01",
"name": "[variables('appServiceName')]",
"location": "[parameters('location')]",
"properties": {
"serverFarmId": "[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"httpsOnly": true,
"siteConfig": {
"appSettings": [
{
"name": "AppServiceStorageConnectionString",
"value": "[format('DefaultEndpointsProtocol=https;AccountName=
{0};EndpointSuffix={1};Key={2}', variables('storageAccountName'),
environment().[Link],
listKeys(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').keys[0].value)]"
}
]
}
},
"dependsOn": [
"[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"[resourceId('[Link]/storageAccounts',
variables('storageAccountName'))]"
]
},
{
"type": "[Link]/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('[Link]/sites',
variables('appServiceName')), '2022-03-01').defaultHostName]"
},
"storageAccount": {
"type": "string",
"value": "[reference(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').[Link]]"
}
}
}
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 [Link] 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 [Link] (se distingue
entre mayúsculas y minúsculas) y guárdelo.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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').[Link]]",
"storageAccountType": "[steps('storageConfig').[Link]]"
}
}
}
Cargue [Link] 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.
PowerShell
Azure PowerShell
$storageAccount = New-AzStorageAccount `
-ResourceGroupName packageStorageGroup `
-Name "<demostorageaccount>" `
-Location westus3 `
-SkuName Standard_LRS `
-Kind StorageV2
$ctx = $[Link]
Set-AzStorageBlobContent `
-File "[Link]" `
-Container appcontainer `
-Blob "[Link]" `
-Context $ctx
Use el siguiente comando para almacenar el URI del archivo de paquete en una variable
denominada packageuri . Usará el valor de variable al implementar la definición de
aplicación administrada.
Azure PowerShell
7 Nota
PowerShell
Azure PowerShell
New-AzStorageAccount `
-ResourceGroupName byosDefinitionStorageGroup `
-Name "<definitionstorage>" `
-Location westus3 `
-SkuName Standard_LRS `
-Kind StorageV2
Azure PowerShell
PowerShell
Es posible usar variables para configurar la asignación de roles. En este ejemplo, se usa la
variable $storageid que creó en un paso anterior y se crea la variable $arpid .
Azure PowerShell
$arpid = (Get-AzADServicePrincipal -SearchString "Appliance Resource
Provider").Id
El Proveedor de recursos del dispositivo es una entidad de servicio en el inquilino de Azure Active
Directory. En Azure Portal, es posible verificar si está registrada yendo a Azure Active
Directory>Aplicaciones empresariales y cambiando el filtro de búsqueda a Aplicaciones de
Microsoft. Busque por proveedor de recursos de dispositivos. Si no se encuentra, registre el
proveedor de recursos [Link] .
En este ejemplo se usa un grupo de seguridad, y la cuenta de Azure Active Directory deberá ser
miembro del grupo. Para obtener el identificador de objeto del grupo, reemplace el marcador de
posición <managedAppDemo> , incluyendo los corchetes angulares ( <> ), por el nombre del grupo.
Usará el valor de variable al implementar la definición de aplicación administrada.
Para crear un grupo nuevo de Azure Active Directory, vaya a Administración de grupos y
pertenencia a grupos de Azure Active Directory.
PowerShell
Azure PowerShell
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. Usará el valor de variable al
implementar la definición de aplicación administrada.
PowerShell
Azure PowerShell
Bicep
@description('Resource ID for the bring your own storage account where the
definition is stored.')
param definitionStorageResourceID string
resource managedApplicationDefinition
'[Link]/applicationDefinitions@2021-07-01' = {
name: managedApplicationDefinitionName
location: location
properties: {
lockLevel: definitionLockLevel
description: definitionDescription
displayName: definitionDisplayName
packageFileUri: packageFileUri
storageAccountId: definitionStorageResourceID
authorizations: [
{
principalId: principalId
roleDefinitionId: roleId
}
]
}
}
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.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"managedApplicationDefinitionName": {
"value": "<placeholder for managed application name>"
},
"definitionStorageResourceID": {
"value": "<placeholder for you storage account ID>"
},
"packageFileUri": {
"value": "<placeholder for the packageFileUri>"
},
"principalId": {
"value": "<placeholder for principalid value>"
},
"roleId": {
"value": "<placeholder for roleid value>"
}
}
}
roleId Id. de rol para los permisos para el grupo de recursos administrados. Por
ejemplo: Propietario, Colaborador o Lector. Use el valor de la variable roleid .
Implementación de la definición
Al implementar la definición de la aplicación administrada, estará disponible en el catálogo de
servicios. Este proceso no implementará los recursos de la aplicación administrada.
PowerShell
Azure PowerShell
New-AzResourceGroupDeployment `
-ResourceGroupName byosAppDefinitionGroup `
-TemplateFile [Link] `
-TemplateParameterFile [Link]
Puede usar los siguientes comandos para comprobar que los archivos de definición de aplicación
administrada se guardan en el contenedor de la cuenta de almacenamiento. En el comando,
reemplace el marcador de posición <definitionstorage> , incluyendo los corchetes angulares
( <> ), por el nombre de la cuenta de almacenamiento único.
PowerShell
Azure PowerShell
7 Nota
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.
PowerShell
Azure PowerShell
Pasos siguientes
Ha publicado la definición de aplicación administrada. Ahora, aprenda a implementar una
instancia de esa definición.
Este inicio rápido describe cómo traer su propio almacenamiento para crear y publicar una
definición de aplicación administrada de Azure en el catálogo de servicios. La definición del
catálogo de servicios está disponible para los miembros de su organización.
Usar Bicep para desarrollar la plantilla y convertirla en una plantilla de Azure Resource
Manager (plantilla de ARM). La plantilla define los recursos de Azure implementados por la
aplicación administrada.
Utilice el comando Bicep build para convertir Bicep en JSON. Una vez convertido el archivo
en JSON, se recomienda comprobar la precisión del código.
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.
También puede utilizar Bicep para implementar una definición de aplicación administrada del
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.
Requisitos previos
Para completar las tareas de este artículo, necesitará lo siguiente:
Una cuenta de Azure con una suscripción activa y permisos para recursos de Azure Active
Directory, como usuarios, grupos o entidades de servicio. Antes de comenzar, si no tiene
una cuenta, cree una gratuita .
Visual Studio Code con la extensión Herramientas de Azure Resource Manager más
reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para Visual Studio
Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
Abra Visual Studio Code, cree un archivo con el nombre [Link] (se distingue entre
mayúsculas y minúsculas) y guárdelo.
Agregue el código de Bicep siguiente y guarde el archivo. Define los recursos de la aplicación
administrada para implementar un plan de App Service, App Service y una cuenta de
almacenamiento.
Bicep
PowerShell
PowerShell
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"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": "[Link]/serverfarms",
"apiVersion": "2022-03-01",
"name": "[parameters('appServicePlanName')]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('appServicePlanSku')]",
"capacity": "[variables('appServicePlanCapacity')]"
}
},
{
"type": "[Link]/sites",
"apiVersion": "2022-03-01",
"name": "[variables('appServiceName')]",
"location": "[parameters('location')]",
"properties": {
"serverFarmId": "[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"httpsOnly": true,
"siteConfig": {
"appSettings": [
{
"name": "AppServiceStorageConnectionString",
"value": "[format('DefaultEndpointsProtocol=https;AccountName=
{0};EndpointSuffix={1};Key={2}', variables('storageAccountName'),
environment().[Link],
listKeys(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').keys[0].value)]"
}
]
}
},
"dependsOn": [
"[resourceId('[Link]/serverfarms',
parameters('appServicePlanName'))]",
"[resourceId('[Link]/storageAccounts',
variables('storageAccountName'))]"
]
},
{
"type": "[Link]/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('[Link]/sites',
variables('appServiceName')), '2022-03-01').defaultHostName]"
},
"storageAccount": {
"type": "string",
"value": "[reference(resourceId('[Link]/storageAccounts',
variables('storageAccountName')), '2022-09-01').[Link]]"
}
}
}
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 [Link] 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 [Link] (se distingue
entre mayúsculas y minúsculas) y guárdelo.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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": "[Link]",
"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').[Link]]",
"storageAccountType": "[steps('storageConfig').[Link]]"
}
}
}
Cargue [Link] 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.
PowerShell
Azure PowerShell
Connect-AzAccount
$storageAccount = New-AzStorageAccount `
-ResourceGroupName packageStorageRG `
-Name "<demostorageaccount>" `
-Location westus3 `
-SkuName Standard_LRS `
-Kind StorageV2 `
-AllowBlobPublicAccess $true
$ctx = $[Link]
Set-AzStorageBlobContent `
-File "[Link]" `
-Container appcontainer `
-Blob "[Link]" `
-Context $ctx
Use el siguiente comando para almacenar el URI del archivo de paquete en una variable
denominada packageuri . Usará el valor de variable al implementar la definición de
aplicación administrada.
Azure PowerShell
En este ejemplo se usa un grupo de seguridad, y la cuenta de Azure Active Directory deberá ser
miembro del grupo. Para obtener el identificador de objeto del grupo, reemplace el marcador de
posición <managedAppDemo> , incluyendo los corchetes angulares ( <> ), por el nombre del grupo.
Usará el valor de variable al implementar la definición de aplicación administrada.
Para crear un grupo nuevo de Azure Active Directory, vaya a Administración de grupos y
pertenencia a grupos de Azure Active Directory.
PowerShell
Azure PowerShell
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. Usará el valor de variable al
implementar la definición de aplicación administrada.
PowerShell
Azure PowerShell
Bicep
resource managedApplicationDefinition
'[Link]/applicationDefinitions@2021-07-01' = {
name: managedApplicationDefinitionName
location: location
properties: {
lockLevel: definitionLockLevel
description: definitionDescription
displayName: definitionDisplayName
packageFileUri: packageFileUri
authorizations: [
{
principalId: principalId
roleDefinitionId: roleId
}
]
}
}
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.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"managedApplicationDefinitionName": {
"value": "sampleBicepManagedApplication"
},
"packageFileUri": {
"value": "<placeholder for the packageFileUri>"
},
"principalId": {
"value": "<placeholder for principalid value>"
},
"roleId": {
"value": "<placeholder for roleid value>"
}
}
}
Parámetro Valor
roleId Id. de rol para los permisos para el grupo de recursos administrados. Por
ejemplo: Propietario, Colaborador o Lector. Use el valor de la variable roleid .
Implementación de la definición
Al implementar la definición de la aplicación administrada, estará disponible en el catálogo de
servicios. Este proceso no implementará los recursos de la aplicación administrada.
PowerShell
Azure PowerShell
PowerShell
Azure PowerShell
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 con Bicep.
PowerShell
Azure PowerShell
Remove-AzResourceGroup -Name packageStorageRG
Pasos siguientes
Ha publicado la definición de aplicación administrada. El siguiente paso es aprender a
implementar una instancia de esa definición.
Inicio rápido: Usar Bicep para implementar una definición de aplicación administrada por
Azure
.
Inicio rápido: implementación de una
aplicación administrada del catálogo de
servicios
Artículo • 12/05/2023
En este inicio rápido, se usará la definición de aplicación administrada que creó usando
uno de los artículos de inicio rápido. La implementación crea dos grupos de recursos.
Uno contiene la aplicación administrada y el otro es un grupo de recursos administrado
para el recurso implementado. La definición de aplicación administrada implementa un
plan de App Service, App Service y cuenta de almacenamiento.
Prerrequisitos
Una definición de aplicación administrada creada con la publicación de una
definición de aplicación o la publicación de una definición con Bring Your Own
Storage.
Una cuenta de Azure con una suscripción activa. Antes de comenzar, si no tiene
una cuenta, cree una gratuita .
Visual Studio Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
PowerShell
Para obtener la definición de la aplicación administrada con Azure PowerShell,
ejecute los siguientes comandos.
Azure PowerShell
Connect-AzAccount
Azure PowerShell
Azure PowerShell
PowerShell
Ejecute los comandos siguientes para crear el nombre del grupo de recursos
administrado.
Azure PowerShell
$mrgprefix = 'mrg-sampleManagedApplication-'
$mrgtimestamp = Get-Date -UFormat "%Y%m%d%H%M%S"
$mrgname = $mrgprefix + $mrgtimestamp
$mrgname
JSON
Para mejorar la legibilidad, la cadena JSON completada usa la tilde aguda para la
continuación de línea. Los valores se almacenan en el valor de variable $params ,
que se usa en el comando de implementación. Los parámetros de la cadena JSON
son necesarios para implementar los recursos administrados.
PowerShell
$params="{ `"appServicePlanName`": {`"value`":`"demoAppServicePlan`"}, `
`"appServiceNamePrefix`": {`"value`":`"demoApp`"}, `
`"storageAccountNamePrefix`": {`"value`":`"demostg1234`"}, `
`"storageAccountType`": {`"value`":`"Standard_LRS`"} }"
PowerShell
Azure PowerShell
New-AzManagedApplication `
-Name "demoManagedApplication" `
-ResourceGroupName applicationGroup `
-Location westus3 `
-ManagedResourceGroupName $mrgname `
-ManagedApplicationDefinitionId $definitionid `
-Kind ServiceCatalog `
-Parameter $params
Los parámetros usados en el comando de implementación:
use westus3.
ManagedResourceGroupName : usa el valor de la variable de $mrgname . El grupo de
ServiceCatalog.
Parameter : Usa el valor de variable $params en la cadena con formato JSON.
Vista de resultados
Una vez implementada la aplicación administrada del catálogo de servicios, tendrá dos
nuevos grupos de recursos. Uno contiene la aplicación administrada El otro grupo de
recursos contiene los recursos administrados que se han implementado. En este
ejemplo, un App Service, un plan de App Service y una cuenta de almacenamiento.
Aplicación administrada
Una vez finalizada la implementación, puede comprobar el estado de la aplicación
administrada.
PowerShell
Azure PowerShell
Azure PowerShell
Recursos administrados
Puede ver los recursos implementados en el grupo de recursos administrados.
PowerShell
Para mostrar los recursos del grupo de recursos administrados, ejecute el siguiente
comando. Ha creado la variable $mrgname al crear los parámetros.
Azure PowerShell
Azure PowerShell
Azure PowerShell
Azure PowerShell
PowerShell
Azure PowerShell
Pasos siguientes
Para obtener información sobre cómo crear y publicar los archivos de definición
para una aplicación administrada, ve a Inicio rápido: crear y publicar una definición
de aplicación administrada de Azure.
Para usar tu propio almacenamiento para crear y publicar los archivos de
definición para una aplicación administrada, ve a Inicio rápido: trae tu propio
almacenamiento para crear y publicar una definición de aplicación administrada de
Azure.
Inicio rápido: Usar Bicep para
implementar una definición de
aplicación administrada por Azure
Artículo • 17/05/2023
En este inicio rápido se describe cómo usar Bicep para implementar una definición de
aplicación administrada de Azure desde el catálogo de servicios. La definición del
catálogo de servicios está disponible para los miembros de su organización.
Use Bicep para desarrollar una plantilla que implemente una definición de
aplicación administrada.
Cree un archivo de parámetros para la implementación.
Implemente la definición de aplicación administrada desde el catálogo de
servicios.
Prerrequisitos
Para completar las tareas de este artículo, necesitará lo siguiente:
Complete el inicio rápido para usar Bicep para crear y publicar una definición de
aplicación administrada en su catálogo de servicios.
Una cuenta de Azure con una suscripción activa. Antes de comenzar, si no tiene
una cuenta, cree una gratuita .
Visual Studio Code con la extensión Herramientas de Azure Resource Manager
más reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para
Visual Studio Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
Azure PowerShell
Connect-AzAccount
Azure PowerShell
Azure PowerShell
Bicep
@maxLength(40)
@description('Service plan name with maximum 40 alphanumeric characters and
hyphens. Must be unique within a resource group in your subscription.')
param appServicePlanName string
@maxLength(47)
@description('Globally unique across Azure. Maximum of 47 alphanumeric
characters or hyphens.')
param appServiceNamePrefix string
@maxLength(11)
@description('Use only lowercase letters and numbers and a maximum of 11
characters.')
param storageAccountNamePrefix string
@allowed([
'Premium_LRS'
'Standard_LRS'
'Standard_GRS'
])
@description('The options are Premium_LRS, Standard_LRS, or Standard_GRS')
param storageAccountType string
@description('Creates the path for the managed resource group. The resource
group is created during deployment.')
var mrgId = '${subscription().id}/resourceGroups/${mrgName}'
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"definitionName": {
"value": "sampleBicepManagedApplication"
},
"definitionRG": {
"value": "bicepDefinitionRG"
},
"managedAppName": {
"value": "sampleBicepManagedApp"
},
"mrgName": {
"value": "<placeholder for managed resource group name>"
},
"appServicePlanName": {
"value": "demoAppServicePlan"
},
"appServiceNamePrefix": {
"value": "demoApp"
},
"storageAccountNamePrefix": {
"value": "demostg1234"
},
"storageAccountType": {
"value": "Standard_LRS"
}
}
}
Debe proporcionar varios parámetros para implementar la aplicación administrada:
Parámetro Value
mrgName Nombre único del grupo de recursos administrado que contiene los
recursos implementados de la aplicación. El grupo de recursos se
crea al implementar la aplicación administrada. Para crear un nombre
de grupo de recursos administrado, puede ejecutar los comandos
que siguen esta lista de parámetros.
Puede ejecutar los comandos siguientes para crear un nombre para el grupo de
recursos administrado.
PowerShell
Azure PowerShell
$mrgprefix = 'mrg-sampleBicepManagedApplication-'
$mrgtimestamp = Get-Date -UFormat "%Y%m%d%H%M%S"
$mrgname = $mrgprefix + $mrgtimestamp
$mrgname
Las variables $mrgprefix y $mrgtimestamp se concatenan y almacenan en la variable
$mrgname . El valor de la variable tiene el formato mrg-sampleBicepManagedApplication-
PowerShell
Azure PowerShell
New-AzResourceGroupDeployment `
-ResourceGroupName bicepAppRG `
-TemplateFile [Link] `
-TemplateParameterFile [Link]
Vista de resultados
Una vez implementada la aplicación administrada del catálogo de servicios, tendrá dos
nuevos grupos de recursos. Uno contiene la aplicación administrada El otro grupo de
recursos contiene los recursos administrados que se han implementado. En este
ejemplo, un App Service, un plan de App Service y una cuenta de almacenamiento.
Aplicación administrada
Una vez finalizada la implementación, puede comprobar el estado de la aplicación
administrada.
PowerShell
Ejecute el comando siguiente para comprobar el estado de la aplicación
administrada.
Azure PowerShell
Azure PowerShell
Recursos administrados
Puede ver los recursos implementados en el grupo de recursos administrados.
PowerShell
Para mostrar los recursos del grupo de recursos administrados, ejecute el siguiente
comando. Ha creado la variable $mrgname al crear los parámetros.
Azure PowerShell
Azure PowerShell
Azure PowerShell
Get-AzRoleAssignment -ResourceGroupName $mrgname -RoleDefinitionName
Owner
Azure PowerShell
Limpieza de recursos
Cuando haya terminado con la aplicación administrada, podrá eliminar los grupos de
recursos y eso eliminará todos los recursos creados. Por ejemplo, ha creado los grupos
de recursos bicepAppRG y un grupo de recursos administrados con el prefijo mrg-
bicepManagedApplication.
PowerShell
Azure PowerShell
Pasos siguientes
Para obtener información sobre cómo crear y publicar los archivos de definición de
una aplicación administrada usando Azure PowerShell, la CLI de Azure o el portal,
vaya a Inicio rápido: Crear y publicar una definición de aplicación administrada de
Azure.
Para usar tu propio almacenamiento para crear y publicar los archivos de
definición para una aplicación administrada, ve a Inicio rápido: trae tu propio
almacenamiento para crear y publicar una definición de aplicación administrada de
Azure.
Inicio rápido: implementar una
aplicación administrada de Azure
Marketplace
Artículo • 01/05/2023
Para evitar costes innecesarios para los recursos de Azure de la aplicación administrada,
ve a Limpiar recursos cuando hayas terminado.
Prerrequisitos
Una cuenta de Azure con una suscripción activa. Antes de comenzar, si no tiene una
cuenta, cree una gratuita .
Para este ejemplo, la disponibilidad del sitio web no es necesaria. El propósito del
artículo es mostrar cómo implementar una aplicación administrada de Azure
Marketplace y verificar los recursos. Para evitar costos innecesarios, ve a limpiar los
recursos cuando hayas terminado.
El sitio podría responder con una página que la implementación aún está procesando.
Cuando tu sitio web está disponible, se muestra una página de inicio de sesión
predeterminada. Puedes iniciar sesión con el número de teléfono móvil que utilizaste
durante la implementación y recibirás un mensaje de texto de confirmación. Cuando
hayas terminado, asegúrate de cerrar sesión en tu sitio web de entrenamiento.
Limpieza de recursos
Cuando hayas terminado con la aplicación administrada, podrás eliminar los grupos de
recursos y eso eliminará todos los recursos de Azure creados. Por ejemplo, en este inicio
rápido creaste los grupos de recursos demo-marketplace-app y un grupo de recursos
administrado con el prefijo mrg-microsoft-community-training.
Prerrequisitos
Para completar este tutorial, necesita saber lo siguiente:
JSON
{
"name": "funcname",
"type": "[Link]",
"label": "Name of the function to be created",
"toolTip": "Name of the function to be created",
"visible": true,
"constraints": {
"required": true
}
},
{
"name": "storagename",
"type": "[Link]",
"label": "Name of the storage to be created",
"toolTip": "Name of the storage to be created",
"visible": true,
"constraints": {
"required": true
}
},
{
"name": "zipFileBlobUri",
"type": "[Link]",
"defaultValue": "[Link]
templates/tree/master/quickstarts/[Link]/custom-rp-with-
function/artifacts/functionzip/[Link]",
"label": "The Uri to the uploaded function zip file",
"toolTip": "The Uri to the uploaded function zip file",
"visible": true
}
y de salida en [Link]:
JSON
"funcname": "[steps('applicationSettings').funcname]",
"storageName": "[steps('applicationSettings').storagename]",
"zipFileBlobUri": "[steps('applicationSettings').zipFileBlobUri]"
En este tutorial, creará un tipo de recurso users , una acción personalizada ping y una
acción personalizada users/contextAction que se realizarán en un contexto de un
recurso personalizado users . Para cada tipo de recurso y acción, proporcione un punto
de conexión que apunte a la función con el nombre proporcionado en
[Link]. Especifique routingType como Proxy,Cache para los tipos de
recurso y Proxy para las acciones:
JSON
{
"apiVersion": "[variables('customrpApiversion')]",
"type": "[Link]/resourceProviders",
"name": "[variables('customProviderName')]",
"location": "[parameters('location')]",
"properties": {
"actions": [
{
"name": "ping",
"routingType": "Proxy",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
},
{
"name": "users/contextAction",
"routingType": "Proxy",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
}
],
"resourceTypes": [
{
"name": "users",
"routingType": "Proxy,Cache",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
}
]
},
"dependsOn": [
"[concat('[Link]/sites/',parameters('funcname'))]"
]
}
JSON
{
"kind": "Overview",
"properties": {
"header": "Welcome to your Demo Azure Managed Application",
"description": "This Managed application with Custom Provider is for
demo purposes only.",
"commands": [{
"displayName": "Ping Action",
"path": "/customping",
"icon": "LaunchCurrent"
}]
}
}
JSON
{
"kind": "CustomResources",
"properties": {
"displayName": "Users",
"version": "[Link]",
"resourceType": "users",
"createUIDefinition": {
},
"commands": [{
"displayName": "Custom Context Action",
"path": "users/contextAction",
"icon": "Start"
}],
"columns": [
{ "key": "[Link]", "displayName": "Full Name" },
{ "key": "[Link]", "displayName": "Location",
"optional": true }
]
}
}
[Link]
[Link]
[Link]
Todos los archivos deben estar en el nivel raíz. El paquete con artefactos se puede
almacenar en cualquier almacenamiento, por ejemplo, un blob de GitHub o un blob de
una cuenta de Azure Storage. Este es un script para cargar el paquete de aplicación en la
cuenta de almacenamiento:
PowerShell
$resourceGroup="appResourcesGroup"
$storageName="mystorageaccount$RANDOM"
Ejecute el siguiente script de la CLI de Azure o siga los pasos descritos en Azure Portal
para implementar una definición de aplicación administrada del catálogo de servicios:
Para ejecutar este ejemplo, instale la versión más reciente de la CLI de Azure. Para
empezar, ejecute az login para crear una conexión con Azure.
Los ejemplos de la CLI de Azure están escritos para el shell bash . Para ejecutar este
ejemplo en Windows PowerShell o en el símbolo del sistema, es posible que necesite
cambiar algunos elementos del script.
CLI de Azure
Azure CLI
resourceGroup="appResourcesGroup"
# Select subscription and create resource group (if you have not created
yet)
az account set --subscription <subscriptionID>
az group create --name $resourceGroup --location eastus
CLI de Azure
Azure CLI
appResourcesGroup="appResourcesGroup"
applicationGroup="usersApplicationGroup"
proveedor personalizado.
¿Busca ayuda?
Si tiene preguntas sobre Azure Managed Applications, puede probar a formularlas en
Stack Overflow con la etiqueta azure-managed-app o en Microsoft Q&A con la
etiqueta azure-managed-application. Puede que ya se haya formulado y respondido
una pregunta similar, así que compruébelo antes de publicar la suya. Use las etiquetas
correspondientes para recibir una respuesta más rápida.
Pasos siguientes
Para publicar la aplicación administrada en Azure Marketplace, consulte Aplicaciones
administradas de Azure en Marketplace.
Ejemplo Descripción
Aplicación web administrada Implementa una máquina virtual que hospeda una aplicación
(IaaS) con los servicios de web.
administración de Azure
Managed SQL 2017 IaaS with Implementa una máquina virtual que hospeda SQL 2017.
automated patching and
backup (IaaS administrada de
SQL 2017 con revisiones y
copias de seguridad
automatizadas)
Artefacto de definición de vistas en
Azure Managed Applications
Artículo • 01/06/2023
JSON
{
"$schema":
"[Link]
preview/[Link]#",
"contentVersion": "[Link]",
"views": [
{
"kind": "Overview",
"properties": {
"header": "Welcome to your Azure Managed Application",
"description": "This managed application is for demo purposes
only.",
"commands": [
{
"displayName": "Test Action",
"path": "testAction"
}
]
}
},
{
"kind": "Metrics",
"properties": {
"displayName": "This is my metrics view",
"version": "1.0.0",
"charts": [
{
"displayName": "Sample chart",
"chartType": "Bar",
"metrics": [
{
"name": "Availability",
"aggregationType": "avg",
"resourceTagFilter": [
"tag1"
],
"resourceType": "[Link]/storageAccounts",
"namespace": "[Link]/storageAccounts"
}
]
}
]
}
},
{
"kind": "CustomResources",
"properties": {
"displayName": "Test custom resource type",
"version": "1.0.0",
"resourceType": "testCustomResource",
"createUIDefinition": {},
"commands": [
{
"displayName": "Custom Context Action",
"path": "testCustomResource/testContextAction",
"icon": "Stop",
"createUIDefinition": {}
}
],
"columns": [
{
"key": "name",
"displayName": "Name"
},
{
"key": "properties.myProperty1",
"displayName": "Property 1"
},
{
"key": "properties.myProperty2",
"displayName": "Property 2",
"optional": true
}
]
}
},
{
"kind": "Associations",
"properties": {
"displayName": "Test association resource type",
"version": "1.0.0",
"targetResourceType": "[Link]/virtualMachines",
"createUIDefinition": {}
}
}
]
}
Información general
"kind": "Overview"
JSON
{
"kind": "Overview",
"properties": {
"header": "Welcome to your Azure Managed Application",
"description": "This managed application is for demo purposes only.",
"commands": [
{
"displayName": "Test Action",
"path": "testAction"
}
]
}
}
Métricas
"kind": "Metrics"
JSON
{
"kind": "Metrics",
"properties": {
"displayName": "This is my metrics view",
"version": "1.0.0",
"charts": [
{
"displayName": "Sample chart",
"chartType": "Bar",
"metrics": [
{
"name": "Availability",
"aggregationType": "avg",
"resourceTagFilter": [
"tag1"
],
"resourceType": "[Link]/storageAccounts",
"namespace": "[Link]/storageAccounts"
}
]
}
]
}
}
Gráfico
Métrica
Recursos personalizados
"kind": "CustomResources"
Puede definir varias vistas de este tipo. Cada vista representa un único tipo de recurso
personalizado del proveedor personalizado que ha definido en [Link]. Para
consultar una introducción a los proveedores de recursos, vea la introducción a los
proveedores personalizados de Azure en versión preliminar.
En esta vista, puede realizar operaciones GET, PUT, DELETE y POST para el tipo de
recurso personalizado. Las operaciones POST podrían ser acciones personalizadas
globales o acciones personalizadas en un contexto del tipo de recurso personalizado.
JSON
{
"kind": "CustomResources",
"properties": {
"displayName": "Test custom resource type",
"version": "1.0.0",
"resourceType": "testCustomResource",
"icon": "[Link]",
"createUIDefinition": {},
"commands": [
{
"displayName": "Custom Context Action",
"path": "testCustomResource/testContextAction",
"icon": "Stop",
"createUIDefinition": {},
}
],
"columns": [
{
"key": "name",
"displayName": "Name"
},
{
"key": "properties.myProperty1",
"displayName": "Property 1"
},
{
"key": "properties.myProperty2",
"displayName": "Property 2",
"optional": true
}
]
}
}
Comandos
La propiedad commands es una matriz de botones adicionales de la barra de
herramientas que se muestran en la página. Cada comando representa una acción POST
del proveedor personalizado de Azure definida en [Link]. Para ver una
introducción a los proveedores personalizados, consulte la información general sobre
proveedores personalizados de Azure.
JSON
{
"commands": [
{
"displayName": "Start Test Action",
"path": "testAction",
"icon": "Start",
"createUIDefinition": {}
},
]
}
Asociaciones
"kind": "Associations"
Puede definir varias vistas de este tipo. Esta vista permite vincular recursos existentes a
la aplicación administrada a través del proveedor personalizado definido en
[Link]. Para consultar una introducción a los proveedores de recursos, vea la
introducción a los proveedores personalizados de Azure en versión preliminar.
En esta vista puede extender recursos de Azure existentes en función de
targetResourceType . Cuando se selecciona un recurso, se crea una solicitud de
incorporación al proveedor personalizado público, lo que puede aplicar un efecto
secundario al recurso.
JSON
{
"kind": "Associations",
"properties": {
"displayName": "Test association resource type",
"version": "1.0.0",
"targetResourceType": "[Link]/virtualMachines",
"createUIDefinition": {}
}
}
¿Busca ayuda?
Si tiene alguna pregunta sobre Azure Managed Applications, pregunte en Stack
Overflow . Puede que ya se haya formulado y respondido una pregunta similar, así que
compruébelo antes de publicar la suya. Agregue la etiqueta azure-managed-app para
obtener una respuesta rápida.
Pasos siguientes
Para una introducción a las aplicaciones administradas, consulte la introducción a
las aplicaciones administradas de Azure.
Para ver una introducción a los proveedores personalizados, consulte la
información general sobre proveedores personalizados de Azure.
Para crear una aplicación administrada de Azure con proveedores personalizados
de Azure, consulte Tutorial: Creación de una aplicación administrada con tipos de
recursos y acciones de proveedor personalizados.
Implementación de asociaciones para
aplicaciones administradas mediante
Azure Policy
Artículo • 01/06/2023
Se pueden usar directivas de Azure para implementar asociaciones con el fin de asociar
recursos a aplicaciones administradas. En este artículo se describe una directiva
integrada que implementa asociaciones y el modo de usarla.
Prerrequisitos
Si la aplicación administrada necesita permisos sobre la suscripción para realizar una
acción, la implementación de los recursos de asociación de la directiva no funcionará sin
conceder los permisos.
Asignación de directiva
Para usar la directiva integrada, cree una asignación de directiva y asigne las
asociaciones de implementación a una directiva de aplicación administrada. Cuando la
directiva se haya asignado correctamente, identificará los recursos no compatibles e
implementará la asociación de esos recursos.
Ayuda
Si tiene preguntas sobre el desarrollo de proveedores de recursos personalizados de
Azure, haga su consulta en Stack Overflow . Puede que ya se haya respondido a una
pregunta similar, así que compruébelo antes de publicar la suya. Use la etiqueta azure-
custom-providers .
Pasos siguientes
En este artículo, aprendió a usar la directiva integrada para implementar asociaciones.
Para obtener más información, vea estos artículos:
7 Nota
Perfil de seguridad
El perfil de seguridad resume los comportamientos de alto impacto de Las aplicaciones
administradas de Azure, lo que puede dar lugar a un aumento de las consideraciones de
seguridad.
ノ Expandir tabla
Atributo de comportamiento del servicio Value
Categoría de productos
Seguridad de red
Para más información, consulte la prueba comparativa de seguridad en la nube de
Microsoft: Seguridad de red.
Características
ノ Expandir tabla
Referencia: Uso de una red virtual existente con Azure Managed Applications
ノ Expandir tabla
Compatible Habilitado de forma predeterminada Responsabilidad de configuración
Características
Descripción: funcionalidad de filtrado ip nativa del servicio para filtrar el tráfico de red
(no confundir con NSG o Azure Firewall). Más información.
ノ Expandir tabla
ノ Expandir tabla
Administración de identidades
Para obtener más información, consulte La prueba comparativa de seguridad en la nube
de Microsoft: Administración de identidades.
Características
ノ Expandir tabla
Compatible Habilitado de forma predeterminada Responsabilidad de configuración
Características
Identidades administradas
ノ Expandir tabla
ノ Expandir tabla
Guía de configuración: no hay ninguna guía actual de Microsoft para esta configuración
de características. Revise y determine si su organización quiere configurar esta
característica de seguridad.
Características
ノ Expandir tabla
Características
Descripción: el plano de datos admite el uso nativo de Azure Key Vault para el almacén
de credenciales y secretos. Más información.
ノ Expandir tabla
Características
ノ Expandir tabla
Características
Descripción: Azure Role-Based Access Control (Azure RBAC) se puede usar para
administrar el acceso a las acciones del plano de datos del servicio. Más información.
ノ Expandir tabla
Características
Descripción: La Caja de seguridad del cliente se puede usar para el acceso de soporte
técnico de Microsoft. Más información.
ノ Expandir tabla
Características
ノ Expandir tabla
Características
ノ Expandir tabla
Características
Cifrado de los datos en tránsito
ノ Expandir tabla
Características
ノ Expandir tabla
Características
Cifrado de datos en reposo mediante CMK
ノ Expandir tabla
Para obtener más información sobre el uso de su propio almacenamiento, visite: Traiga
su propio almacenamiento para la definición de aplicación administrada.
Características
Descripción: el servicio admite la integración de Azure Key Vault para las claves, secretos
o certificados de cliente. Más información.
ノ Expandir tabla
Guía de configuración: use Azure Key Vault para crear y controlar el ciclo de vida de las
claves de cifrado, incluida la generación de claves, la distribución y el almacenamiento.
Gire y revoque las claves en Azure Key Vault y el servicio en función de una
programación definida o cuando haya una retirada o peligro de clave. Cuando sea
necesario usar la clave administrada por el cliente (CMK) en el nivel de carga de trabajo,
servicio o aplicación, asegúrese de seguir los procedimientos recomendados para la
administración de claves: use una jerarquía de claves para generar una clave de cifrado
de datos independiente (DEK) con la clave de cifrado de claves (KEK) en el almacén de
claves. Asegúrese de que las claves están registradas con Azure Key Vault y a las que se
hace referencia a través de identificadores de clave desde el servicio o la aplicación. Si
necesita traer su propia clave (BYOK) al servicio (por ejemplo, importar claves protegidas
con HSM desde los HSM locales a Azure Key Vault), siga las instrucciones recomendadas
para realizar la generación inicial de claves y la transferencia de claves.
Características
Descripción: el servicio admite la integración de Azure Key Vault para los certificados de
cliente. Más información.
ノ Expandir tabla
Guía de configuración: use Azure Key Vault para crear y controlar el ciclo de vida del
certificado, incluida la creación, la importación, la rotación, la revocación, el
almacenamiento y la purga del certificado. Asegúrese de que la generación de
certificados sigue los estándares definidos sin usar ninguna propiedad no segura, como:
tamaño de clave insuficiente, período de validez demasiado largo, criptografía no
segura. Configure la rotación automática del certificado en Azure Key Vault y el servicio
de Azure (si se admite) en función de una programación definida o cuando haya una
expiración del certificado. Si no se admite la rotación automática en la aplicación,
asegúrese de que siguen rotando mediante métodos manuales en Azure Key Vault y la
aplicación.
Administración de recursos
Para obtener más información, consulte La prueba comparativa de seguridad en la nube
de Microsoft: Administración de recursos.
Características
ノ Expandir tabla
Guía de configuración: use Microsoft Defender for Cloud para configurar Azure Policy
para auditar y aplicar configuraciones de los recursos de Azure. Use Azure Monitor para
crear alertas cuando se detecte una desviación de la configuración en los recursos. Use
Azure Policy [deny] y [deploy if not exists] efectos para aplicar la configuración segura
en los recursos de Azure.
AM-5: Uso exclusivo de aplicaciones aprobadas en una
máquina virtual
Características
ノ Expandir tabla
Características
ノ Expandir tabla
Características
ノ Expandir tabla
Guía de configuración: habilite los registros de recursos para el servicio. Por ejemplo,
Key Vault admite registros de recursos adicionales para las acciones que obtienen un
secreto de un almacén de claves o Azure SQL tiene registros de recursos que realizan un
seguimiento de las solicitudes a una base de datos. El contenido de estos registros de
recurso varía según el servicio de Azure y el tipo de recurso.
Características
ノ Expandir tabla
ノ Expandir tabla
ノ Expandir tabla
ノ Expandir tabla
ノ Expandir tabla
Guía de configuración: siga las recomendaciones de Microsoft Defender for Cloud para
realizar evaluaciones de vulnerabilidades en las máquinas virtuales de Azure, las
imágenes de contenedor y los servidores SQL Server.
Características
ノ Expandir tabla
Características
Solución EDR
ノ Expandir tabla
Guía de configuración: Azure Defender para servidores (con Microsoft Defender para
punto de conexión integrado) proporciona funcionalidad EDR para evitar, detectar,
investigar y responder a amenazas avanzadas. Use Microsoft Defender for Cloud para
implementar Azure Defender para servidores para el punto de conexión e integrar las
alertas en la solución SIEM, como Azure Sentinel.
ES-2: Uso de software antimalware moderno
Características
Solución antimalware
ノ Expandir tabla
Características
ノ Expandir tabla
Compatible Habilitado de forma predeterminada Responsabilidad de configuración
Características
Azure Backup
Descripción: el servicio puede realizar una copia de seguridad del servicio Azure Backup.
Más información.
ノ Expandir tabla
Pasos siguientes
Consulte la introducción a la prueba comparativa de seguridad en la nube de
Microsoft.
Obtenga más información sobre las líneas de base de seguridad de Azure.
[Link] para la
experiencia de creación de aplicaciones
administradas de Azure
Artículo • 01/06/2023
La plantilla es la siguiente:
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"config": {
"isWizard": false,
"basics": { }
},
"basics": [ ],
"steps": [ ],
"outputs": { },
"resourceTypes": [ ]
}
}
handler
version
parámetros
Puede usar un editor de JSON para crear el valor createUiDefinition y luego probarlo en
el espacio aislado createUiDefinition para obtener una vista previa. Para obtener más
información sobre el espacio aislado, consulte Probar la interfaz del portal de Azure
Managed Applications.
Config
La propiedad config es opcional. Utilícela para invalidar el comportamiento
predeterminado del paso básico o para establecer la interfaz como un asistente paso a
paso. Si se usa config , es la primera propiedad de la sección parameters del archivo
[Link]. En el ejemplo siguiente se muestran las propiedades
disponibles.
JSON
"config": {
"isWizard": false,
"basics": {
"description": "Customized description with **markdown**, see [more]
([Link]
"subscription": {
"constraints": {
"validations": [
{
"isValid": "
[not(contains(subscription().displayName, 'Test'))]",
"message": "Can't use test subscription."
},
{
"permission":
"[Link]/virtualmachines/write",
"message": "Must have write permission for the
virtual machine."
},
{
"permission":
"[Link]/virtualMachines/extensions/write",
"message": "Must have write permission for the
extension."
}
]
},
"resourceProviders": [
"[Link]"
]
},
"resourceGroup": {
"constraints": {
"validations": [
{
"isValid": "[not(contains(resourceGroup().name,
'test'))]",
"message": "Resource group name can't contain
'test'."
}
]
},
"allowExisting": true
},
"location": {
"label": "Custom label for location",
"toolTip": "provide a useful tooltip",
"resourceTypes": [
"[Link]/virtualMachines"
],
"allowedValues": [
"eastus",
"westus2"
],
"visible": true
}
}
},
Para la propiedad isValid , escriba una expresión que se resuelva en true o en false.
Para la propiedad permission , especifique una de las acciones del proveedor de
recursos.
Asistente
La propiedad isWizard le permite solicitar la validación correcta de cada paso antes de
continuar con el paso siguiente. Cuando no se especifica la propiedad isWizard , el valor
predeterminado es falso y la validación paso a paso no es necesaria.
El control de grupo de recursos tiene una opción allowExisting . Cuando es true , los
usuarios pueden seleccionar grupos de recursos que ya tengan recursos. Esta marca se
aplica principalmente a las plantillas de soluciones, donde el comportamiento
predeterminado obliga a los usuarios a seleccionar un grupo de recursos nuevo o vacío.
En la mayoría del resto de los escenarios, no es necesario especificar esta propiedad.
En location , especifique las propiedades del control de ubicación que quiere invalidar.
Cualquier propiedad que no se haya invalidado se establece en sus valores
predeterminados. resourceTypes acepta una matriz de cadenas que contienen los
nombres de tipo de recurso completos. Las opciones de ubicación solo están
restringidas a las regiones que admiten los tipos de recursos. allowedValues acepta una
matriz de cadenas de región. Solo esas regiones aparecen en la lista desplegable. Puede
establecer tanto allowedValues como resourceTypes . El resultado es la intersección de
ambas listas. Por último, la propiedad visible se puede utilizar para deshabilitar la lista
desplegable de ubicación de forma condicional o por completo.
Aspectos básicos
El paso Aspectos básicos es el primer paso que se genera cuando Azure Portal analiza el
archivo. De forma predeterminada, este paso permite a los usuarios elegir la suscripción,
el grupo de recursos y la ubicación de la implementación.
Puede agregar más elementos en esta sección. Cuando sea posible, agregue elementos
que consulten los parámetros de toda la implementación, como el nombre de un clúster
o las credenciales del administrador.
JSON
"basics": [
{
"name": "textBox1",
"type": "[Link]",
"label": "Textbox on basics",
"defaultValue": "my text value",
"toolTip": "",
"visible": true
}
]
Pasos
La propiedad steps contiene cero o más pasos que se muestran después de los aspectos
básicos. Cada paso contiene uno o varios elementos. Considere la posibilidad de
agregar pasos por rol o nivel de aplicación que se está implementando. Por ejemplo,
agregue un paso para las entradas del nodo principal y otro para los nodos de trabajo
de un clúster.
JSON
"steps": [
{
"name": "demoConfig",
"label": "Configuration settings",
"elements": [
ui-elements-needed-to-create-the-instance
]
}
]
Salidas
Azure Portal usa la propiedad outputs para asignar elementos de basics y steps a los
parámetros de la plantilla de implementación de Azure Resource Manager. Las claves de
este diccionario son los nombres de los parámetros de plantilla, y los valores son
propiedades de los objetos de salida de los elementos a los que se hace referencia.
Para definir el nombre del recurso de la aplicación administrada, debe incluir un valor
llamado applicationResourceName en la propiedad outputs. Si no establece este valor, la
aplicación asigna un GUID al nombre. Puede incluir un cuadro de texto en la interfaz de
usuario que requiera un nombre de usuario.
JSON
"outputs": {
"vmName": "[steps('appSettings').vmName]",
"trialOrProduction": "[steps('appSettings').trialOrProd]",
"userName": "[steps('vmCredentials').adminUsername]",
"pwd": "[steps('vmCredentials').[Link]]",
"applicationResourceName": "[steps('appSettings').vmName]"
}
Tipos de recursos
Para limitar las ubicaciones disponibles a solo las que admiten los tipos de recursos que
se van a implementar, proporcione una matriz de los tipos de recursos. Si se
proporciona más de un tipo de recurso, solo se devuelven las ubicaciones que admiten
todos los tipos de recursos. Esta propiedad es opcional.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"resourceTypes": ["[Link]/disks"],
"basics": [
...
Functions
CreateUiDefinition proporciona funciones para trabajar con entradas y salidas de los
elementos, y características como los condicionales. La sintaxis y funcionalidad de estas
funciones son similares a las de las funciones de las plantillas de Azure Resource
Manager.
Pasos siguientes
El propio archivo [Link] tiene un esquema simple. Su profundidad real
procede de todos los elementos y funciones que admite. Dichos elementos se describen
con más detalle en:
Elementos
Funciones
preview/[Link] .
Requisitos previos
Un archivo [Link]. Si no tiene este archivo, copie el archivo de
ejemplo .
Como editor del marketplace comercial, puede crear una oferta de Aplicación de Azure
para que los posibles clientes puedan comprar su solución. En este artículo se explica el
proceso de crear una oferta de Aplicación de Azure en el marketplace comercial de
Microsoft.
Antes de empezar
Antes de publicar una oferta de aplicación de Azure, cree una cuenta de Marketplace
comercial en el Centro de partners y asegúrese de que su cuenta esté inscrita en el
programa de Marketplace comercial. Consulte Crear una cuenta de marketplace
comercial en el Centro de partners y Comprobar la información de su cuenta al
inscribirse en un nuevo programa del Centro de partners.
3. En la página de ofertas de Marketplace, seleccione + Nueva oferta>Aplicación de
Azure.
7 Nota
El publicador seleccionado debe inscribirse en el programa Marketplace
comercial y no se puede modificar después de crear la oferta.
7 Nota
3. Rellene los campos que aparecen. Para más información, consulte los siguientes
artículos:
7 Nota
Asegúrese de actualizar estas conexiones siempre que haya algún cambio. Todavía
puede acceder a los clientes potenciales en el área de trabajo Referencias del Centro
de partners. Si es necesario, puede exportar clientes potenciales desde el Centro de
partners para importarlos a su CRM.
Pasos siguientes
Configuración de las propiedades de la aplicación de Azure
Tutorial en vídeo
Configuración del Centro de partners para Azure Managed Applications:
demostración
Comentarios
¿Le ha resultado útil esta página? Sí No
Este artículo se centra en las acciones que los editores llevan a cabo para habilitar el
acceso JIT y enviar solicitudes. Para obtener información acerca de la aprobación de
solicitudes de acceso JIT, consulte el tema sobre la aprobación del acceso Just-In-Time
en Azure Managed Applications.
En "steps":
JSON
{
"name": "jitConfiguration",
"label": "JIT Configuration",
"subLabel": {
"preValidation": "Configure JIT settings for your application",
"postValidation": "Done"
},
"bladeTitle": "JIT Configuration",
"elements": [
{
"name": "jitConfigurationControl",
"type": "[Link]",
"label": "JIT Configuration"
}
]
}
En "outputs":
JSON
"jitAccessPolicy": "[steps('jitConfiguration').jitConfigurationControl]"
7 Nota
2. Para obtener instrucciones sobre cómo crear una nueva aplicación administrada,
siga los pasos descritos en Creación de una oferta de aplicación de Azure.
3. En la página Configuración técnica, seleccione la casilla Habilitar acceso Just-In-
Time (JIT) .
Solicitar acceso
Cuando necesite acceder a los recursos administrados del consumidor, envíe una
solicitud para un rol, una hora y una duración específicos. A continuación, el consumidor
debe aprobar la solicitud.
5. Para ver el estado de todas las solicitudes JIT de una aplicación administrada,
seleccione Acceso de JIT e Historial de solicitudes.
Problemas conocidos
El identificador de entidad de seguridad de la cuenta que solicita acceso JIT debe
incluirse explícitamente en la definición de la aplicación administrada. La cuenta no
puede incluirse solo a través de un grupo especificado en el paquete. Esta limitación se
corregirá en una versión futura.
Pasos siguientes
Para obtener información acerca de la aprobación de solicitudes de acceso JIT, consulte
el tema sobre la aprobación del acceso Just-In-Time en Azure Managed Applications.
Uso de una red virtual existente con
Azure Managed Applications
Artículo • 01/06/2023
En este artículo se muestra cómo definir una aplicación administrada de Azure que se
integra con una red virtual existente en la suscripción del cliente. La aplicación
administrada permite al cliente decidir si quiere crear una nueva red virtual o usar una
existente. La red virtual existente puede estar fuera del grupo de recursos administrado.
Plantilla principal
En primer lugar, vamos a echar un vistazo al archivo [Link]. Toda la plantilla
para implementar una máquina virtual y sus recursos asociados se muestra a
continuación. Luego, vamos a examinar más detalladamente los elementos de la
plantilla que están relacionadas con el uso de una red virtual existente.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"location": {
"type": "string",
"metadata": {
"description": "Deployment location"
}
},
"windowsOSVersion": {
"type": "string",
"defaultValue": "2016-Datacenter",
"allowedValues": [
"2008-R2-SP1",
"2012-Datacenter",
"2012-R2-Datacenter",
"2016-Nano-Server",
"2016-Datacenter-with-Containers",
"2016-Datacenter",
"2019-Datacenter"
],
"metadata": {
"description": "The Windows version for the VM. This will pick a
fully patched image of this given Windows version."
}
},
"vmName": {
"type": "string",
"metadata": {
"title": "VM Name",
"description": "This is the name of the your VM"
}
},
"adminUsername": {
"type": "string",
"defaultValue": "testadmin",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Password for the Virtual Machine."
}
},
"virtualNetworkName": {
"type": "string",
"metadata": {
"description": "New or Existing VNet Name"
}
},
"virtualNetworkNewOrExisting": {
"type": "string",
"metadata": {
"description": "Boolean indicating whether the VNet is new or
existing"
}
},
"virtualNetworkAddressPrefix": {
"type": "string",
"metadata": {
"description": "VNet address prefix"
}
},
"virtualNetworkResourceGroup": {
"type": "string",
"metadata": {
"description": "Resource group of the VNet"
}
},
"virtualMachineSize": {
"type": "string",
"metadata": {
"description": "The size of the VM"
}
},
"subnetName": {
"type": "string",
"metadata": {
"description": "New or Existing subnet Name"
}
},
"subnetAddressPrefix": {
"type": "string",
"metadata": {
"description": "Subnet address prefix"
}
},
"baseUrl": {
"type": "string",
"defaultValue": "",
"metadata": {
"artifactsBaseUrl": "",
"description": "URL to acquire other templates"
}
}
},
"variables": {
"storageAccountName": "[concat(uniquestring(resourceGroup().id),
'sawinvm')]",
"publicIPAddressName": "
[concat(uniqueString(resourceGroup().id),'IP')]",
"vmName": "[parameters('vmName')]",
"nicName": "[concat(parameters('vmName'),'Nic')]",
"vnetId": {
"new": "
[resourceId('[Link]/virtualNetworks',parameters('virtualNetworkNa
me'))]",
"existing": "
[resourceId(parameters('virtualNetworkResourceGroup'),'[Link]/vir
tualNetworks',parameters('virtualNetworkName'))]"
},
"subnetId": "[concat(variables('vnetId')
[parameters('virtualNetworkNewOrExisting')],'/subnets/',parameters('subnetNa
me'))]",
"publicIPAddressType": "Dynamic"
},
"resources": [
{
"condition": "
[equals(parameters('virtualNetworkNewOrExisting'),'new')]",
"type": "[Link]/virtualNetworks",
"apiVersion": "2021-02-01",
"name": "[parameters('virtualNetworkName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('virtualNetworkAddressPrefix')]"
]
},
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "[parameters('subnetAddressPrefix')]"
}
}
]
}
},
{
"type": "[Link]/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"apiVersion": "2021-02-01",
"location": "[parameters('location')]",
"properties": {
"publicIPAllocationMethod": "[variables('publicIPAddressType')]"
}
},
{
"type": "[Link]/networkInterfaces",
"name": "[variables('nicName')]",
"apiVersion": "2021-02-01",
"location": "[parameters('location')]",
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "
[resourceId('[Link]/publicIPAddresses',variables('publicIPAddress
Name'))]"
},
"subnet": {
"id": "[variables('subnetId')]"
}
}
}
],
"enableIPForwarding": true
},
"dependsOn": [
"[concat('[Link]/publicIPAddresses/',
variables('publicIPAddressName'))]",
"[resourceId('[Link]/virtualNetworks/',
parameters('virtualNetworkName'))]"
]
},
{
"type": "[Link]/storageAccounts",
"apiVersion": "2021-04-01",
"name": "[variables('storageAccountName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
},
"kind": "Storage",
"properties": {}
},
{
"type": "[Link]/virtualMachines",
"apiVersion": "2021-04-01",
"name": "[variables('vmName')]",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('[Link]/storageAccounts/',
variables('storageAccountName'))]",
"[resourceId('[Link]/networkInterfaces/',
variables('nicName'))]"
],
"properties": {
"hardwareProfile": {
"vmSize": "[parameters('virtualMachineSize')]"
},
"osProfile": {
"computerName": "[variables('vmName')]",
"adminUsername": "[parameters('adminUsername')]",
"adminPassword": "[parameters('adminPassword')]"
},
"storageProfile": {
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "[parameters('windowsOSVersion')]",
"version": "latest"
},
"osDisk": {
"createOption": "FromImage"
},
"dataDisks": [
{
"diskSizeGB": 1023,
"lun": 0,
"createOption": "Empty"
}
]
},
"networkProfile": {
"networkInterfaces": [
{
"id": "
[resourceId('[Link]/networkInterfaces',variables('nicName'))]"
}
]
},
"diagnosticsProfile": {
"bootDiagnostics": {
"enabled": true,
"storageUri": "
[reference(resourceId('[Link]/storageAccounts/',
variables('storageAccountName'))).[Link]]"
}
}
}
}
]
}
Observe que la red virtual se implementa de forma condicional. El cliente pasa un valor
de parámetro que indica si se va a crear una red virtual nueva o se va a usar una
existente. Si el cliente selecciona una red virtual nueva, se implementa el recurso. De lo
contrario, el recurso se omite durante la implementación.
JSON
{
"condition": "[equals(parameters('virtualNetworkNewOrExisting'),'new')]",
"type": "[Link]/virtualNetworks",
"apiVersion": "2021-02-01",
"name": "[parameters('virtualNetworkName')]",
"location": "[parameters('location')]",
"properties": {
"addressSpace": {
"addressPrefixes": [
"[parameters('virtualNetworkAddressPrefix')]"
]
},
"subnets": [
{
"name": "[parameters('subnetName')]",
"properties": {
"addressPrefix": "[parameters('subnetAddressPrefix')]"
}
}
]
}
},
La variable del identificador de red virtual tiene dos propiedades. Una propiedad
devuelve el identificador de recurso cuando se implementa una nueva red virtual. La
otra devuelve el identificador de recurso cuando se usa una red virtual existente. El
identificador de recurso de la red virtual existente incluye el nombre del grupo de
recursos que contiene la red virtual.
El identificador de subred se construye a partir del valor del identificador de red virtual.
Usa el valor que coincide con la selección de los clientes.
JSON
"variables": {
"storageAccountName": "[concat(uniquestring(resourceGroup().id),
'sawinvm')]",
"publicIPAddressName": "[concat(uniqueString(resourceGroup().id),'IP')]",
"vmName": "[parameters('vmName')]",
"nicName": "[concat(parameters('vmName'),'Nic')]",
"vnetId": {
"new": "
[resourceId('[Link]/virtualNetworks',parameters('virtualNetworkNa
me'))]",
"existing": "
[resourceId(parameters('virtualNetworkResourceGroup'),'[Link]/vir
tualNetworks',parameters('virtualNetworkName'))]"
},
"subnetId": "[concat(variables('vnetId')
[parameters('virtualNetworkNewOrExisting')],'/subnets/',parameters('subnetNa
me'))]",
"publicIPAddressType": "Dynamic"
},
JSON
{
"type": "[Link]/networkInterfaces",
"name": "[variables('nicName')]",
"apiVersion": "2021-02-01",
"location": "[parameters('location')]",
"properties": {
"ipConfigurations": [
{
"name": "ipconfig1",
"properties": {
"privateIPAllocationMethod": "Dynamic",
"publicIPAddress": {
"id": "
[resourceId('[Link]/publicIPAddresses',variables('publicIPAddress
Name'))]"
},
"subnet": {
"id": "[variables('subnetId')]"
}
}
}
],
"enableIPForwarding": true
},
JSON
{
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [],
"steps": [
{
"name": "deploymentDetails",
"label": "Deployment Details",
"subLabel": {
"preValidation": "Required",
"postValidation": "Done"
},
"bladeTitle": "Deployment Details",
"elements": [
{
"name": "virtualMachine",
"type": "[Link]",
"elements": [
{
"name": "vmName",
"type": "[Link]",
"label": "VM Name",
"toolTip": "Name of your virtual machine",
"constraints": {
"required": true
}
},
{
"name": "vmPassword",
"type": "[Link]",
"label": {
"password": "Password",
"confirmPassword": "Confirm password"
},
"toolTip": {
"password": ""
},
"constraints": {
"required": true,
"customPasswordRegex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-
z\\d]{12,}$",
"customValidationMessage": "The password must be
alphanumeric, contain at least 12 characters, and have at least 1 letter and
1 number."
},
"options": {
"hideConfirmation": false
},
"osPlatform": "Windows",
"visible": true
}
],
"visible": true
},
{
"name": "vnet",
"type": "[Link]",
"label": {
"virtualNetwork": "Virtual Network",
"subnets": "Subnets"
},
"defaultValue": {
"name": "vmx-vnet",
"addressPrefixSize": "/16"
},
"constraints": {
"minAddressPrefixSize": "/24"
},
"subnets": {
"subnet1": {
"label": "Subnet",
"defaultValue": {
"name": "vmx-subnet",
"addressPrefixSize": "/24"
},
"constraints": {
"minAddressPrefixSize": "/29",
"minAddressCount": 8,
"requireContiguousAddresses": true
}
}
}
},
{
"name": "VMSize",
"type": "[Link]",
"label": "VM size",
"toolTip": "The size of virtual machine for VM.",
"recommendedSizes": [
"Standard_D2_v2",
"Standard_D2_v3"
],
"constraints": {
"allowedSizes": [
"Standard_D2_v2",
"Standard_D2_v3"
],
"excludedSizes": []
},
"osPlatform": "Windows",
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter"
}
}
]
},
{
"name": "identityDetails",
"label": "Managed Identity Details",
"subLabel": {
"preValidation": "Required",
"postValidation": "Done"
},
"bladeTitle": "Managed Identity Details",
"elements": [
{
"name": "identity",
"type": "[Link]",
"label": "Managed Identity Configuration",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to
grant the resource access to other existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant
the resource access to other existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": false,
"hideUserAssignedIdentity": false
},
"visible": true
}
]
}
],
"outputs": {
"location": "[location()]",
"vmName": "[steps('deploymentDetails').[Link]]",
"adminPassword": "
[steps('deploymentDetails').[Link]]",
"virtualNetworkName": "[steps('deploymentDetails').[Link]]",
"virtualNetworkNewOrExisting": "
[steps('deploymentDetails').[Link]]",
"virtualNetworkAddressPrefix": "
[first(steps('deploymentDetails').[Link])]",
"virtualNetworkResourceGroup": "
[steps('deploymentDetails').[Link]]",
"virtualMachineSize": "[steps('deploymentDetails').VMSize]",
"subnetName": "
[steps('deploymentDetails').[Link]]",
"subnetAddressPrefix": "
[steps('deploymentDetails').[Link]]",
"managedIdentity": "[steps('identityDetails').identity]"
}
}
}
JSON
{
"name": "vnet",
"type": "[Link]",
"label": {
"virtualNetwork": "Virtual Network",
"subnets": "Subnets"
},
"defaultValue": {
"name": "vmx-vnet",
"addressPrefixSize": "/16"
},
"constraints": {
"minAddressPrefixSize": "/24"
},
"subnets": {
"subnet1": {
"label": "Subnet",
"defaultValue": {
"name": "vmx-subnet",
"addressPrefixSize": "/24"
},
"constraints": {
"minAddressPrefixSize": "/29",
"minAddressCount": 8,
"requireContiguousAddresses": true
}
}
}
},
Ese elemento permite al cliente seleccionar una red virtual nueva o existente.
En las salidas, se incluye un valor que indica si el cliente ha seleccionado una red virtual
nueva o existente. También hay un valor de identidad administrada.
7 Nota
El valor de salida de la identidad administrada debe tener el nombre
managedIdentity.
JSON
"outputs": {
"location": "[location()]",
"vmName": "[steps('deploymentDetails').[Link]]",
"adminPassword": "
[steps('deploymentDetails').[Link]]",
"virtualNetworkName": "[steps('deploymentDetails').[Link]]",
"virtualNetworkNewOrExisting": "
[steps('deploymentDetails').[Link]]",
"virtualNetworkAddressPrefix": "
[first(steps('deploymentDetails').[Link])]",
"virtualNetworkResourceGroup": "
[steps('deploymentDetails').[Link]]",
"virtualMachineSize": "[steps('deploymentDetails').VMSize]",
"subnetName": "[steps('deploymentDetails').[Link]]",
"subnetAddressPrefix": "
[steps('deploymentDetails').[Link]]",
"managedIdentity": "[steps('identityDetails').identity]"
}
Pasos siguientes
Para obtener más información sobre cómo crear el archivo de definición de la interfaz
de usuario, vea [Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Trabajo con los recursos del grupo de
recursos administrado de una aplicación
administrada de Azure
Artículo • 01/06/2023
En este artículo se describe cómo actualizar los recursos que se implementan como
parte de una aplicación administrada. Como editor de una aplicación administrada, tiene
acceso a los recursos del grupo de recursos administrado. Para actualizar estos recursos,
debe encontrar el grupo de recursos administrados asociado a una aplicación
administrada y acceder a los recursos de ese grupo.
Azure CLI
Azure CLI
Azure CLI
Azure CLI
az vm resize --size Standard_D2_v2 --ids $(az vm list -g
DemoApp6zkevchqk7sfq --query "[].id" -o tsv)
Azure CLI
Azure CLI
Pasos siguientes
Para una introducción a las aplicaciones administradas, consulte Introducción a las
aplicaciones administradas.
Para ver ejemplos de proyectos, consulte Sample projects for Azure managed
applications (Ejemplos de proyectos para aplicaciones administradas de Azure).
Acceso al secreto de Key Vault al
implementar Azure Managed
Applications
Artículo • 21/10/2023
Cuando tiene que pasar un valor seguro (por ejemplo, una contraseña) como un
parámetro durante la implementación, puede recuperar el valor de Azure Key Vault. Para
acceder a Key Vault cuando se implementa Managed Applications, debe conceder
acceso a la entidad de servicio del proveedor de recursos de dispositivos. El servicio
Managed Applications utiliza esta identidad para ejecutar operaciones. Para recuperar
correctamente un valor de un almacén de claves durante la implementación, es
necesario que la entidad de servicio pueda obtener acceso al almacén de claves.
En este artículo se describe cómo configurar Key Vault para que funcione con Managed
Applications.
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "The location where the resources will be deployed."
}
},
"vaultName": {
"type": "string",
"metadata": {
"description": "The name of the key vault that contains the secret."
}
},
"secretName": {
"type": "string",
"metadata": {
"description": "The name of the secret."
}
},
"vaultResourceGroupName": {
"type": "string",
"metadata": {
"description": "The name of the resource group that contains the key
vault."
}
},
"vaultSubscription": {
"type": "string",
"defaultValue": "[subscription().subscriptionId]",
"metadata": {
"description": "The name of the subscription that contains the key
vault."
}
}
},
"resources": [
{
"type": "[Link]/deployments",
"apiVersion": "2022-09-01",
"name": "dynamicSecret",
"properties": {
"mode": "Incremental",
"expressionEvaluationOptions": {
"scope": "inner"
},
"template": {
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"adminLogin": {
"type": "string"
},
"adminPassword": {
"type": "securestring"
},
"location": {
"type": "string"
}
},
"variables": {
"sqlServerName": "[concat('sql-',
uniqueString(resourceGroup().id, 'sql'))]"
},
"resources": [
{
"type": "[Link]/servers",
"apiVersion": "2022-05-01-preview",
"name": "[variables('sqlServerName')]",
"location": "[parameters('location')]",
"properties": {
"administratorLogin": "[parameters('adminLogin')]",
"administratorLoginPassword": "
[parameters('adminPassword')]"
}
}
],
"outputs": {
"sqlFQDN": {
"type": "string",
"value": "
[reference(variables('sqlServerName')).fullyQualifiedDomainName]"
}
}
},
"parameters": {
"location": {
"value": "[parameters('location')]"
},
"adminLogin": {
"value": "ghuser"
},
"adminPassword": {
"reference": {
"keyVault": {
"id": "[resourceId(parameters('vaultSubscription'),
parameters('vaultResourceGroupName'), '[Link]/vaults',
parameters('vaultName'))]"
},
"secretName": "[parameters('secretName')]"
}
}
}
}
}
],
"outputs": {
}
}
Pasos siguientes
Ha configurado Key Vault para que esté accesible durante la implementación de una
aplicación administrada.
Para obtener información sobre cómo pasar un valor de Key Vault como parámetro
de plantilla, consulte Uso de Azure Key Vault para pasar el valor de parámetro
seguro durante la implementación.
Para obtener más información sobre la seguridad del almacén de claves, consulte
Seguridad de Azure Key Vault y Autenticación en Azure Key Vault.
Para ver ejemplos de aplicaciones administradas, consulte Ejemplos de proyectos
para aplicaciones administradas de Azure.
Para aprender a crear un archivo de definición de interfaz de usuario para una
aplicación administrada, consulte Comenzar con CreateUiDefinition.
Aplicación administrada por Azure con
identidad administrada
Artículo • 19/07/2023
7 Nota
Obtenga información sobre cómo configurar una aplicación administrada para contener
una identidad administrada. Se puede usar una identidad administrada para permitir
que el cliente conceda a la aplicación administrada acceso a los recursos existentes. La
plataforma de Azure administra la identidad y no requiere que aprovisione ni gire
ningún secreto. Para más información sobre las identidades administradas en Azure
Active Directory (Azure AD), consulte Identidades administradas para recursos de Azure.
JSON
{
"identity": {
"type": "SystemAssigned, UserAssigned",
"userAssignedIdentities": {
"/subscriptions/00000000-0000-0000-0000-
000000000000/resourceGroups/testRG/providers/[Link]/usera
ssignedidentites/myuserassignedidentity": {}
}
}
}
Hay dos maneras comunes de crear una aplicación administrada con identity :
[Link] y plantillas de Azure Resource Manager. Para escenarios simples
de creación única, debe usarse createUIDefinition para habilitar la identidad
administrada, ya que proporciona una experiencia enriquecida. Sin embargo, cuando se
trabaja con sistemas avanzados o complejos que requieren implementaciones
automatizadas o múltiples de aplicación administrada, pueden usarse plantillas.
Uso de createUIDefinition
Se puede configurar una aplicación administrada con identidad administrada a través de
[Link]. En la sección Salidas, la clave managedIdentity puede usarse
para reemplazar la propiedad identity de la plantilla de aplicación administrada. En el
ejemplo siguiente, se habilita una identidad administrada asignada por el sistema en la
aplicación administrada. Para formar objetos de identidad más complejos, use
elementos createUIDefinition para pedir entradas al consumidor. Estas entradas se
pueden usar para construir aplicaciones administradas con una identidad administrada
asignada por el usuario.
JSON
"outputs": {
"managedIdentity": { "Type": "SystemAssigned" }
}
Cuándo usar createUIDefinition para identidad administrada
A continuación, se muestran algunas recomendaciones sobre cuándo usar
createUIDefinition para habilitar una identidad administrada en aplicaciones
administradas.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [],
"steps": [
{
"name": "applicationSettings",
"label": "Application Settings",
"subLabel": {
"preValidation": "Configure your application settings",
"postValidation": "Done"
},
"bladeTitle": "Application Settings",
"elements": [
{
"name": "appName",
"type": "[Link]",
"label": "Managed application Name",
"toolTip": "Managed application instance name",
"visible": true
},
{
"name": "appIdentity",
"type": "[Link]",
"label": "Managed Identity Configuration",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to
grant the managed application access to additional existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant
the managed application access to additional existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": false,
"hideUserAssignedIdentity": false,
"readOnlySystemAssignedIdentity": false
},
"visible": true
}
]
}
],
"outputs": {
"applicationResourceName": "[steps('applicationSettings').appName]",
"location": "[location()]",
"managedIdentity": "[steps('applicationSettings').appIdentity]"
}
}
}
7 Nota
Las plantillas de aplicación administrada de Marketplace se generan
automáticamente para los clientes que siguen la experiencia de creación de
Azure Portal. Para estos escenarios, la clave de salida managedIdentity en
createUIDefinition debe usarse para la identidad habilitada.
Plantilla SystemAssigned
Una plantilla básica de Azure Resource Manager que implementa una aplicación
administrada con la identidad administrada asignada por el sistema.
JSON
"resources": [
{
"type": "[Link]/applications",
"name": "[parameters('applicationName')]",
"apiVersion": "2018-09-01-preview",
"location": "[parameters('location')]",
"identity": {
"type": "SystemAssigned"
},
"properties": {
"ManagedResourceGroupId": "
[parameters('managedByResourceGroupId')]",
"parameters": { }
}
}
]
Plantilla UserAssigned
Una plantilla básica de Azure Resource Manager que implementa una aplicación
administrada con la identidad administrada asignada por el usuario.
JSON
"resources": [
{
"type": "[Link]/userAssignedIdentities",
"name": "[parameters('managedIdentityName')]",
"apiVersion": "2018-11-30",
"location": "[parameters('location')]"
},
{
"type": "[Link]/applications",
"name": "[parameters('applicationName')]",
"apiVersion": "2018-09-01-preview",
"location": "[parameters('location')]",
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"
[resourceID('[Link]/userAssignedIdentities/',parameters('
managedIdentityName'))]": {}
}
},
"properties": {
"ManagedResourceGroupId": "
[parameters('managedByResourceGroupId')]",
"parameters": { }
}
}
]
7 Nota
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{}
],
"steps": [
{
"name": "managedApplicationSetting",
"label": "Managed Application Settings",
"subLabel": {
"preValidation": "Managed Application Settings",
"postValidation": "Done"
},
"bladeTitle": "Managed Application Settings",
"elements": [
{
"name": "networkInterfaceId",
"type": "[Link]",
"label": "Network interface resource ID",
"defaultValue": "/subscriptions/00000000-0000-0000-0000-
000000000000/resourceGroups/testRG/providers/[Link]/networkInterf
aces/existingnetworkinterface",
"toolTip": "Must represent the identity as an Azure Resource
Manager resource identifer format ex.
/subscriptions/sub1/resourcegroups/myGroup/providers/[Link]/netwo
rkInterfaces/networkinterface1",
"visible": true
},
{
"name": "userAssignedId",
"type": "[Link]",
"label": "User-assigned managed identity resource ID",
"defaultValue": "/subscriptions/00000000-0000-0000-0000-
000000000000/resourceGroups/testRG/providers/[Link]/usera
ssignedidentites/myuserassignedidentity",
"toolTip": "Must represent the identity as an Azure Resource
Manager resource identifer format ex.
/subscriptions/sub1/resourcegroups/myGroup/providers/[Link]
ty/userAssignedIdentities/identity1",
"visible": true
}
]
}
],
"outputs": {
"existingNetworkInterfaceId": "
[steps('managedApplicationSetting').networkInterfaceId]",
"managedIdentity": "
[parse(concat('{\"Type\":\"UserAssigned\",\"UserAssignedIdentities\":
{',string(steps('managedApplicationSetting').userAssignedId),':{}}}'))]"
}
}
}
Plantilla principal de ejemplo que establece el perfil de red a una interfaz de red
existente proporcionada por [Link].
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"existingNetworkInterfaceId": { "type": "string" }
},
"variables": {
},
"resources": [
{
"apiVersion": "2016-04-30-preview",
"type": "[Link]/virtualMachines",
"name": "myLinkedResourceVM",
"location": "[resourceGroup().location]",
"properties": {
…,
"networkProfile": {
"networkInterfaces": [
{
"id": "[parameters('existingNetworkInterfaceId')]"
}
]
}
}
}
]
}
siguiente aspecto:
HTTP
POST
[Link]
resourceGroup}/providers/[Link]/applications/{applicationName}/
listTokens?api-version=2018-09-01-preview HTTP/1.1
{
"authorizationAudience": "[Link]
"userAssignedIdentities": [
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Mi
[Link]/userAssignedIdentities/{userAssignedIdentityName}"
]
}
HTTP
HTTP/1.1 200 OK
Content-Type: application/json
{
"value": [
{
"access_token": "eyJ0eXAi…",
"expires_in": "2…",
"expires_on": "1557…",
"not_before": "1557…",
"authorizationAudience": "[Link]
"resourceId":
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroup}/providers/Mi
[Link]/applications/{applicationName}",
"token_type": "Bearer"
}
]
}
Parámetro Descripción
not_before El intervalo de tiempo en que el token de acceso surte efecto. Este valor
se representa como el número de segundos desde el tiempo Unix.
authorizationAudience La aud (audiencia) para la cual se solicitó el token de acceso. Este valor
es igual al que se ha proporcionado en la solicitud listTokens .
Parámetro Descripción
Pasos siguientes
Cómo configurar una aplicación administrada con un proveedor personalizado
Creación de una aplicación administrada
de Azure que implementa la cuenta de
almacenamiento cifrada con una clave
administrada por el cliente
Artículo • 06/05/2023
En este artículo se describe cómo crear una aplicación administrada de Azure que
implemente una cuenta de almacenamiento cifrada con una clave administrada por el
cliente. La cuenta de almacenamiento, Cosmos DB y Azure Database for Postgres
admiten el cifrado de datos en reposo mediante claves administradas por el cliente o
claves administradas por Microsoft. Puede usar su propia clave de cifrado para proteger
los datos de la cuenta de almacenamiento. Cuando se especifica una clave administrada
por el cliente, esa clave se usa para proteger y controlar el acceso a la clave que cifra los
datos. Las claves administradas por el cliente ofrecen más flexibilidad para administrar
controles de acceso.
Requisitos previos
Una cuenta de Azure con una suscripción activa y permisos para recursos de Azure
Active Directory, como usuarios, grupos o entidades de servicio. Antes de
comenzar, si no tiene una cuenta, cree una gratuita .
Visual Studio Code con la extensión Herramientas de Azure Resource Manager
más reciente. En el caso de los archivos de Bicep, instale la extensión de Bicep para
Visual Studio Code .
Instale la versión más reciente de Azure PowerShell o la CLI de Azure.
Familiarícese con cómo crear e implementar una definición de catálogo de
servicios.
Identidades administradas
La configuración de una clave administrada por el cliente para una cuenta de
almacenamiento implementada por la aplicación administrada como un recurso dentro
del grupo de recursos administrados requiere una identidad administrada asignada por
el usuario. Esta identidad administrada asignada por el usuario se puede usar para
conceder a la aplicación administrada acceso a otros recursos existentes. Para aprender
a configurar la aplicación administrada con una identidad administrada asignada por el
usuario, vaya a Aplicación administrada de Azure con identidad administrada.
La aplicación puede tener dos tipos de identidades:
Opciones: Generar
Nombre: demo-cmek-llave
Para publicar una aplicación administrada en el catálogo de servicios, debe realizar las
siguientes tareas:
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [],
"steps": [
{
"name": "managedApplicationSetting",
"label": "Application Settings",
"subLabel": {
"preValidation": "Configure your application settings and Managed
Identity for the application",
"postValidation": "Done"
},
"bladeTitle": "Application Settings - Config",
"elements": [
{
"name": "appIdentity",
"type": "[Link]",
"label": "Managed Identity Configuration for the Application
(Needs Managed Identity Operator permissions over KV Managed Identity).",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to
grant the managed application access to additional existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant
the managed application access to additional existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": true,
"hideUserAssignedIdentity": false,
"readOnlySystemAssignedIdentity": true
},
"visible": true
}
]
},
{
"name": "configuration",
"type": "[Link]",
"label": "Configuration",
"elements": [
{
"name": "cmek",
"type": "[Link]",
"label": "Customer Managed Encryption Key (CMEK)",
"elements": [
{
"name": "cmekEnable",
"type": "[Link]",
"label": "Enable CMEK",
"toolTip": "Enable to provide a CMEK",
"constraints": {
"required": false
}
},
{
"name": "cmekKeyVaultUrl",
"type": "[Link]",
"label": "Key Vault URL",
"toolTip": "Specify the CMEK Key Vault URL",
"defaultValue": "",
"constraints": {
"required": "[steps('configuration').[Link]]",
"regex": ".*",
"validationMessage": "The value must not be empty."
},
"visible": "[steps('configuration').[Link]]"
},
{
"name": "cmekKeyName",
"type": "[Link]",
"label": "Key Name",
"toolTip": "Specify the key name from your key vault.",
"defaultValue": "",
"constraints": {
"required": "[steps('configuration').[Link]]",
"regex": ".*",
"validationMessage": "The value must not be empty."
},
"visible": "[steps('configuration').[Link]]"
},
{
"name": "cmekKeyIdentity",
"type": "[Link]",
"label": "Managed Identity Configuration for Key Vault
Access",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity
to grant the managed application access to additional existing resources.",
"userAssignedIdentity": "Add user assigned identities to
grant the managed application access to additional existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": true,
"hideUserAssignedIdentity": false,
"readOnlySystemAssignedIdentity": true
},
"visible": "[steps('configuration').[Link]]"
}
],
"visible": true
}
]
}
],
"outputs": {
"location": "[location()]",
"managedIdentity": "[steps('managedApplicationSetting').appIdentity]",
"cmekConfig": {
"kvUrl": "[if(empty(steps('configuration').[Link]),
'', steps('configuration').[Link])]",
"keyName": "[if(empty(steps('configuration').[Link]), '',
steps('configuration').[Link])]",
"identityId": "
[if(empty(steps('configuration').[Link]), '',
steps('configuration').[Link])]"
}
}
}
}
Bicep
}
}
var identity = items([Link])[0].key
PowerShell
PowerShell
JSON
{
"$schema": "[Link]
01/[Link]#",
"contentVersion": "[Link]",
"metadata": {
"_generator": {
"name": "bicep",
"version": "0.16.2.56959",
"templateHash": "1234567891234567890"
}
},
"parameters": {
"cmekConfig": {
"type": "object",
"defaultValue": {
"kvUrl": "",
"keyName": "",
"identityId": {}
}
},
"location": {
"type": "string",
"defaultValue": "[resourceGroup().location]",
"metadata": {
"description": "Specify the Azure region to place the application
definition."
}
}
},
"variables": {
"commonproperties": {
"name": "cmekdemo",
"displayName": "Common Resources",
"storage": {
"sku": "Standard_LRS",
"kind": "StorageV2",
"accessTier": "Hot",
"minimumTlsVersion": "TLS1_2"
}
},
"identity": "
[items(parameters('cmekConfig').[Link])[0].key]"
},
"resources": [
{
"type": "[Link]/storageAccounts",
"apiVersion": "2022-05-01",
"name": "[format('{0}{1}', variables('commonproperties').name,
uniqueString(resourceGroup().id))]",
"location": "[parameters('location')]",
"sku": {
"name": "[variables('commonproperties').[Link]]"
},
"kind": "[variables('commonproperties').[Link]]",
"identity": "[parameters('cmekConfig').identityId]",
"properties": {
"accessTier": "[variables('commonproperties').[Link]]",
"minimumTlsVersion": "
[variables('commonproperties').[Link]]",
"encryption": {
"identity": {
"userAssignedIdentity": "[variables('identity')]"
},
"services": {
"blob": {
"enabled": true
},
"table": {
"enabled": true
},
"file": {
"enabled": true
}
},
"keySource": "[Link]",
"keyvaultproperties": {
"keyname": "[format('{0}', parameters('cmekConfig').keyName)]",
"keyvaulturi": "[format('{0}', parameters('cmekConfig').kvUrl)]"
}
}
}
}
]
}
Pasos siguientes
Para más información sobre el cifrado de almacenamiento, vaya a Claves
administradas por el cliente para el cifrado de Azure Storage.
Para más información sobre la identidad administrada asignada por el usuario con
permisos para acceder a la clave en el almacén de claves, vaya a Configuración de
claves administradas por el cliente en el mismo inquilino para una cuenta de
almacenamiento existente.
Aplicaciones administradas de Azure
con notificaciones
Artículo • 23/03/2023
Introducción
Para empezar a recibir notificaciones de aplicaciones administradas, cree un punto de
conexión HTTPS público. Especifique el punto de conexión al publicar la definición de
aplicación del catálogo de servicios o la oferta de Microsoft Azure Marketplace.
1. Cree un punto de conexión HTTPS público que registre las solicitudes POST
entrantes y devuelva 200 OK .
2. Agregue el punto de conexión a la definición de aplicación de catálogo de
servicios o a la oferta de Azure Marketplace, como se explica más adelante en este
artículo.
3. Cree una instancia de aplicación administrada que haga referencia a la definición
de la aplicación o a la oferta de Azure Marketplace.
4. Confirme que las notificaciones se reciben.
5. Habilite la autorización tal y como se explica en la sección Autenticación de punto
de conexión de este artículo.
6. Siga las instrucciones de la sección Esquema de notificación de este artículo para
analizar las solicitudes de notificación e implementar la lógica de negocios basada
en la notificación.
Portal de Azure
Para comenzar, consulte Inicio rápido: Creación y publicación de una definición de
aplicación administrada de Azure.
API DE REST
7 Nota
JSON
{
"properties": {
"isEnabled": true,
"lockLevel": "ReadOnly",
"displayName": "Sample Application Definition",
"description": "Notification-enabled application definition.",
"notificationPolicy": {
"notificationEndpoints": [
{
"uri": "[Link]
}
]
},
"authorizations": [
{
"principalId": "d6b7fbd3-4d99-43fe-8a7a-f13aef11dc18",
"roleDefinitionId": "8e3af657-a8ff-443c-a75c-2fe8c4bcb635"
},
...
Desencadenadores de eventos
En la tabla siguiente se describen todas las posibles combinaciones de eventType y
provisioningState y sus desencadenadores:
EventType ProvisioningState Desencadenador para la notificación
Esquema de la notificación
Al crear el punto de conexión de webhook para controlar las notificaciones, necesitará
analizar la carga para obtener propiedades importantes y, después, actuar sobre la
notificación. Las notificaciones de aplicaciones administradas del catálogo de servicios y
de Azure Marketplace proporcionan muchas de esas mismas propiedades, pero hay
algunas diferencias. La propiedad applicationDefinitionId solo se aplica al catálogo de
servicios. Las propiedades billingDetails y plan solo se aplican a Azure Marketplace.
Azure anexa /resource al URI del punto de conexión de notificación que proporcionó
en la definición de aplicación administrada. El punto de conexión de webhook debe ser
capaz de controlar las notificaciones en el URI /resource . Por ejemplo, si proporcionó
un URI de punto de conexión de notificación como [Link] , el URI del
punto de conexión de webhook es [Link] .
HTTP
POST [Link]
{optional_parameter_value} HTTP/1.1
{
"eventType": "PUT",
"applicationId":
"/subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
s/applications/<applicationName>",
"eventTime": "2019-08-14T[Link].1707163Z",
"provisioningState": "Succeeded",
"applicationDefinitionId":
"/subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
s/applicationDefinitions/<appDefName>"
}
HTTP
POST [Link]
{optional_parameter_value} HTTP/1.1
{
"eventType": "PUT",
"applicationId":
"subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
/applications/<applicationName>",
"eventTime": "2019-08-14T[Link].1707163Z",
"provisioningState": "Failed",
"applicationDefinitionId":
"/subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
s/applicationDefinitions/<appDefName>",
"error": {
"code": "ErrorCode",
"message": "error message",
"details": [
{
"code": "DetailedErrorCode",
"message": "error message"
}
]
}
}
Esquema de notificación de aplicación de
Azure Marketplace
El ejemplo siguiente muestra una notificación del catálogo de servicios después de un
aprovisionamiento correcto de una instancia de la aplicación administrada.
HTTP
POST [Link]
{optional_parameter_value} HTTP/1.1
{
"eventType": "PUT",
"applicationId":
"/subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
s/applications/<applicationName>",
"eventTime": "2019-08-14T[Link].1707163Z",
"provisioningState": "Succeeded",
"billingDetails": {
"resourceUsageId": "<resourceUsageId>"
},
"plan": {
"publisher": "publisherId",
"product": "offer",
"name": "skuName",
"version": "1.0.1"
}
}
HTTP
POST [Link]
{optional_parameter_value} HTTP/1.1
{
"eventType": "PUT",
"applicationId":
"/subscriptions/<subId>/resourceGroups/<rgName>/providers/[Link]
s/applications/<applicationName>",
"eventTime": "2019-08-14T[Link].1707163Z",
"provisioningState": "Failed",
"billingDetails": {
"resourceUsageId": "<resourceUsageId>"
},
"plan": {
"publisher": "publisherId",
"product": "offer",
"name": "skuName",
"version": "1.0.1"
},
"error": {
"code": "ErrorCode",
"message": "error message",
"details": [
{
"code": "DetailedErrorCode",
"message": "error message"
}
]
}
}
Propiedad Descripción
Reintentos de notificación
El servicio de notificaciones de aplicaciones administradas espera una respuesta 200 OK
del punto de conexión de webhook a la notificación. El servicio de notificación volverá a
intentarlo si el punto de conexión de webhook devuelve un código de error HTTP igual
o superior a 500, devuelve un código de error 429 o si el punto de conexión no está
disponible temporalmente. Si el punto de conexión de webhook no está disponible en
10 horas, se quitará el mensaje de notificación y se detendrán los reintentos.
Supervisión de una instancia
implementada de una aplicación
administrada
Artículo • 01/06/2023
Visualización de alertas
1. Seleccione Alertas.
2. Si tiene reglas de alerta configuradas, verá información sobre las alertas que han
surgido.
3. Para agregar reglas de alerta, seleccione + Nueva regla de alertas.
Pasos siguientes
Para ver ejemplos de aplicaciones administradas, consulte Sample projects for
Azure managed applications (Ejemplos de proyectos para aplicaciones
administradas de Azure).
Para implementar una aplicación administrada, consulte Implementación de la
aplicación de catálogo de servicio mediante Azure Portal.
Configuración y aprobación del acceso
Just-In-Time para Azure Managed
Applications
Artículo • 25/10/2023
Este artículo se centra en las acciones que los consumidores llevan a cabo para habilitar
el acceso JIT y aprobar solicitudes. Para obtener información sobre la publicación de una
aplicación administrada con acceso JIT, consulte el tema sobre la solicitud de acceso
Just-In-Time en Azure Managed Applications.
7 Nota
Para usar el acceso Just-In-Time, debe tener una licencia de Microsoft Entra ID P2.
Aprobar solicitudes
Cuando el editor solicite acceso, recibirá una notificación de la solicitud. Puede aprobar
las solicitudes de acceso JIT directamente a través de la aplicación administrada, o a
través de todas las aplicaciones administradas a través del servicio de Microsoft Entra
Privileged Identity Management. Para usar el acceso Just-In-Time, debe tener una
licencia de Microsoft Entra ID P2.
Para aprobar las solicitudes a través de Microsoft Entra Privileged Identity Management:
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{}
],
"steps": [
{
"name": "applicationSettings",
"label": "Application Settings",
"subLabel": {
"preValidation": "Configure your application settings",
"postValidation": "Done"
},
"bladeTitle": "Application Settings",
"elements": [
{
"name": "funcname",
"type": "[Link]",
"label": "Name of the function to be created",
"toolTip": "Name of the function to be created",
"visible": true,
"constraints": {
"required": true
}
},
{
"name": "storagename",
"type": "[Link]",
"label": "Name of the storage to be created",
"toolTip": "Name of the storage to be created",
"visible": true,
"constraints": {
"required": true
}
},
{
"name": "zipFileBlobUri",
"type": "[Link]",
"defaultValue": "[Link]
templates/tree/master/quickstarts/[Link]/custom-rp-with-
function/artifacts/functionzip/[Link]",
"label": "The Uri to the uploaded function zip file",
"toolTip": "The Uri to the uploaded function zip file",
"visible": true
}
]
}
],
"outputs": {
"funcname": "[steps('applicationSettings').funcname]",
"storageName": "[steps('applicationSettings').storagename]",
"zipFileBlobUri": "[steps('applicationSettings').zipFileBlobUri]"
}
}
}
Pasos siguientes
Tutorial: Creación de una aplicación administrada con acciones y recursos
personalizados.
Referencia: Artefacto de plantilla de implementación.
Referencia: Artefacto de definición de vista.
Referencia: Artefacto de plantilla de
implementación
Artículo • 01/06/2023
Plantilla de implementación
El JSON siguiente muestra un ejemplo de un archivo [Link] para Azure
Managed Applications:
JSON
{
"$schema": "[Link]
preview/[Link]#",
"contentVersion": "[Link]",
"parameters": {
"location": {
"type": "string",
"defaultValue": "eastus",
"allowedValues": [
"australiaeast",
"eastus",
"westeurope"
],
"metadata": {
"description": "Location for the resources."
}
},
"funcname": {
"type": "string",
"metadata": {
"description": "Name of the Azure Function that hosts the code. Must
be globally unique"
},
"defaultValue": ""
},
"storageName": {
"type": "string",
"metadata": {
"description": "Name of the storage account that hosts the function.
Must be globally unique. The field can contain only lowercase letters and
numbers. Name must be between 3 and 24 characters"
},
"defaultValue": ""
},
"zipFileBlobUri": {
"type": "string",
"defaultValue": "[Link]
templates/tree/master/quickstarts/[Link]/custom-rp-with-
function/artifacts/functionzip/[Link]",
"metadata": {
"description": "The Uri to the uploaded function zip file"
}
}
},
"variables": {
"customrpApiversion": "2018-09-01-preview",
"customProviderName": "public",
"serverFarmName": "functionPlan"
},
"resources": [
{
"type": "[Link]/serverfarms",
"apiVersion": "2016-09-01",
"name": "[variables('serverFarmName')]",
"location": "[parameters('location')]",
"sku": {
"name": "Y1",
"tier": "Dynamic",
"size": "Y1",
"family": "Y",
"capacity": 0
},
"kind": "functionapp",
"properties": {
"name": "[variables('serverFarmName')]",
"perSiteScaling": false,
"reserved": false,
"targetWorkerCount": 0,
"targetWorkerSizeId": 0
}
},
{
"type": "[Link]/sites",
"kind": "functionapp",
"name": "[parameters('funcname')]",
"apiVersion": "2018-02-01",
"location": "[parameters('location')]",
"dependsOn": [
"[resourceId('[Link]/storageAccounts',
parameters('storageName'))]",
"[resourceId('[Link]/serverfarms',
variables('serverFarmName'))]"
],
"identity": {
"type": "SystemAssigned"
},
"properties": {
"name": "[parameters('funcname')]",
"siteConfig": {
"appSettings": [
{
"name": "AzureWebJobsDashboard",
"value": "
[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageNam
e'),';AccountKey=',listKeys(resourceId('[Link]/storageAccounts',
parameters('storageName')), '2015-05-01-preview').key1)]"
},
{
"name": "AzureWebJobsStorage",
"value": "
[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageNam
e'),';AccountKey=',listKeys(resourceId('[Link]/storageAccounts',
parameters('storageName')), '2015-05-01-preview').key1)]"
},
{
"name": "FUNCTIONS_EXTENSION_VERSION",
"value": "~2"
},
{
"name": "AzureWebJobsSecretStorageType",
"value": "Files"
},
{
"name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
"value": "
[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageNam
e'),';AccountKey=',listKeys(resourceId('[Link]/storageAccounts',
parameters('storageName')), '2015-05-01-preview').key1)]"
},
{
"name": "WEBSITE_CONTENTSHARE",
"value": "[concat(toLower(parameters('funcname')), 'b86e')]"
},
{
"name": "WEBSITE_NODE_DEFAULT_VERSION",
"value": "6.5.0"
},
{
"name": "WEBSITE_RUN_FROM_PACKAGE",
"value": "[parameters('zipFileBlobUri')]"
}
]
},
"clientAffinityEnabled": false,
"reserved": false,
"serverFarmId": "[resourceId('[Link]/serverfarms',
variables('serverFarmName'))]"
}
},
{
"type": "[Link]/storageAccounts",
"name": "[parameters('storageName')]",
"apiVersion": "2018-02-01",
"kind": "StorageV2",
"location": "[parameters('location')]",
"sku": {
"name": "Standard_LRS"
}
},
{
"apiVersion": "[variables('customrpApiversion')]",
"type": "[Link]/resourceProviders",
"name": "[variables('customProviderName')]",
"location": "[parameters('location')]",
"properties": {
"actions": [
{
"name": "ping",
"routingType": "Proxy",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
},
{
"name": "users/contextAction",
"routingType": "Proxy",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
}
],
"resourceTypes": [
{
"name": "users",
"routingType": "Proxy,Cache",
"endpoint": "
[listSecrets(resourceId('[Link]/sites/functions',
parameters('funcname'), 'HttpTrigger1'), '2018-02-01').trigger_url]"
}
]
},
"dependsOn": [
"[concat('[Link]/sites/',parameters('funcname'))]"
]
}
],
"outputs": {}
}
Pasos siguientes
Tutorial: Creación de una aplicación administrada con acciones y recursos
personalizados.
Referencia: Artefactos de elementos de la interfaz de usuario.
Referencia: Artefacto de definición de vista.
Referencia: Ver definición de artefacto
Artículo • 01/06/2023
Ver definición
El JSON siguiente muestra un ejemplo de un archivo [Link] para Azure
Managed Applications:
JSON
{
"views": [{
"kind": "Overview",
"properties": {
"header": "Welcome to your Demo Azure Managed Application",
"description": "This Managed application with Custom Provider is for
demo purposes only.",
"commands": [{
"displayName": "Ping Action",
"path": "/customping",
"icon": "LaunchCurrent"
}]
}
},
{
"kind": "CustomResources",
"properties": {
"displayName": "Users",
"version": "[Link]",
"resourceType": "users",
"createUIDefinition": {
"parameters": {
"steps": [{
"name": "add",
"label": "Add user",
"elements": [{
"name": "name",
"label": "User's Full Name",
"type": "[Link]",
"defaultValue": "",
"toolTip": "Provide a full user name.",
"constraints": { "required": true }
},
{
"name": "location",
"label": "User's Location",
"type": "[Link]",
"defaultValue": "",
"toolTip": "Provide a Location.",
"constraints": { "required": true }
}]
}],
"outputs": {
"name": "[steps('add').name]",
"properties": {
"FullName": "[steps('add').name]",
"Location": "[steps('add').location]"
}
}
}
},
"commands": [{
"displayName": "Custom Context Action",
"path": "users/contextAction",
"icon": "Start"
}],
"columns": [
{ "key": "[Link]", "displayName": "Full Name" },
{ "key": "[Link]", "displayName": "Location",
"optional": true }
]
}
}]
}
Pasos siguientes
Tutorial: Creación de una aplicación administrada con acciones y recursos
personalizados.
Referencia: Artefactos de elementos de la interfaz de usuario.
Referencia: Artefacto de plantilla de implementación.
az managedapp
Referencia
Comandos
ノ Expandir tabla
Azure CLI
az managedapp create --kind
--managed-rg-id
--name
--resource-group
[--location]
[--managedapp-definition-id]
[--parameters]
[--plan-name]
[--plan-product]
[--plan-publisher]
[--plan-version]
[--tags]
Ejemplos
Cree una aplicación administrada de tipo "ServiceCatalog". Esto requiere un
identificador de definición de aplicación administrada válido.
Azure CLI
Cree una aplicación administrada de tipo "MarketPlace". Esto requiere un plan válido,
que contiene detalles sobre el paquete de Marketplace existente, como el nombre del
plan, la versión, el publicador y el producto.
Azure CLI
Parámetros requeridos
--kind
--name -n
--resource-group -g
Parámetros opcionales
--location -l
--managedapp-definition-id -d
--parameters
Cadena con formato JSON o una ruta de acceso a un archivo con este contenido.
--plan-name
--plan-product
--plan-publisher
--plan-version
Etiquetas separadas por espacios: key[=value] [key[=value] ...]. Use "" para borrar las
etiquetas existentes.
Parámetros globales
--debug
--help -h
--only-show-errors
--output -o
Formato de salida.
valores aceptados: json, jsonc, none, table, tsv, yaml, yamlc
valor predeterminado: json
--query
--subscription
--verbose
Azure CLI
Ejemplos
Elimine una aplicación administrada. (generado automáticamente)
Azure CLI
Parámetros opcionales
--ids
--name -n
--resource-group -g
--subscription
Parámetros globales
--debug
--help -h
--only-show-errors
--output -o
Formato de salida.
valores aceptados: json, jsonc, none, table, tsv, yaml, yamlc
valor predeterminado: json
--query
--subscription
--verbose
Azure CLI
Azure CLI
Parámetros opcionales
--resource-group -g
Parámetros globales
--debug
--help -h
--only-show-errors
--output -o
Formato de salida.
valores aceptados: json, jsonc, none, table, tsv, yaml, yamlc
valor predeterminado: json
--query
--subscription
Nombre o identificador de la suscripción Puede configurar la suscripción
predeterminada mediante az account set -s NAME_OR_ID .
--verbose
Azure CLI
Parámetros opcionales
--ids
--name -n
--resource-group -g
--subscription
--debug
--help -h
--only-show-errors
--output -o
Formato de salida.
valores aceptados: json, jsonc, none, table, tsv, yaml, yamlc
valor predeterminado: json
--query
--subscription
--verbose
En este tema se muestran temas de ayuda para los cmdlets de Azure Resource Manager.
Active Directory
ノ Expandir tabla
Get-AzADApplication Lists entities from applications or get entity from applications by key
Get-AzADGroup Lists entities from groups or get entity from groups by key
Get-AzADGroupOwner The owners of the group. Limited to 100 owners. Nullable. If this property is not specified when creating a Microsoft 365 g
the calling user is automatically assigned as the group owner. Supports $filter (/$count eq 0, /$count ne 0, /$count eq 1,
/$count ne 1). Supports $expand including nested $select. For example, /groups?
$filter=startsWith(displayName,'Role')&$select=id,displayName&$expand=owners($select=id,userPrincipalName,displayN
Get-AzADServicePrincipal Lists entities from service principals or get entity from service principals by key
Get-AzADSpCredential Lists key credentials and password credentials for an service principal.
Get-AzADUser Lists entities from users or get entity from users by key
Remove-AzADGroupMember Deletes member from group Users, contacts, and groups that are members of this group. HTTP Methods: GET (supported f
all groups), POST (supported for security groups and mail-enabled security groups), DELETE (supported only for security
groups) Read-only. Nullable. Supports $expand.
Aplicaciones administradas
ノ Expandir tabla
Directiva
ノ Expandir tabla
Get-AzPolicyAlias Get-AzPolicyAlias retrieves and outputs Azure provider resource types that have aliases defined and match the
given parameter values. If no parameters are provided, all provider resource types that contain an alias will be
output. The -ListAvailable switch modifies this behavior by listing all matching resource types including those
without aliases.
Get-AzRoleManagementPolicy Get the specified role management policy for a resource scope
Get- Get the specified role management policy assignment for a resource scope
AzRoleManagementPolicyAssignment
Recursos
ノ Expandir tabla
Get-AzDenyAssignment Lists Azure RBAC deny assignments at the specified scope. By default it lists all deny assignments in the
selected Azure subscription. Use respective parameters to list deny assignments to a specific user, or to
list deny assignments on a specific resource group or resource.
The cmdlet may call below Microsoft Graph API according to input parameters:
GET /directoryObjects/{id}
POST /directoryObjects/getByIds
Get-AzLocation Gets all locations and the supported resource providers for each location.
Get- Gets a template What-If result for a deployment at management group scope.
AzManagementGroupDeploymentWhatIfResult
Get-AzManagementGroupNameAvailability Checks if the Management Group name is available in the Tenant and a valid name.
Get-AzPrivateLinkAssociation Gets all the Azure Resource Management Private Link Association(s).
Get-AzProviderOperation Gets the operations for an Azure resource provider that are securable using Azure RBAC.
Get-AzProviderPreviewFeature Gets a feature registration in your account.
Get-AzResourceGroupDeploymentWhatIfResult Gets a template What-If result for a deployment at resource group scope.
Get-AzRoleAssignment Lists Azure RBAC role assignments at the specified scope. By default it lists all role assignments in the
selected Azure subscription. Use respective parameters to list assignments to a specific user, or to list
assignments on a specific resource group or resource.
The cmdlet may call below Microsoft Graph API according to input parameters:
GET /users/{id}
GET /servicePrincipals/{id}
GET /groups/{id}
GET /directoryObjects/{id}
POST /directoryObjects/getByIds
Please notice that this cmdlet will mark ObjectType as Unknown in output if the object of role
assignment is not found or current account has insufficient privileges to get object type.
Get-AzRoleAssignmentSchedule Get the specified role assignment schedule for a resource scope
Get-AzRoleDefinition Lists all Azure RBAC roles that are available for assignment.
Get-AzRoleEligibilitySchedule Get the specified role eligibility schedule for a resource scope
Get-AzRoleEligibleChildResource Get the child resources of a resource on which user has eligible access
Get-AzTag Gets predefined Azure tags | Gets the entire set of tags on a resource or subscription.
New-AzRoleAssignment Assigns the specified RBAC role to the specified principal, at the specified scope.
The cmdlet may call below Microsoft Graph API according to input parameters:
GET /users/{id}
GET /servicePrincipals/{id}
GET /groups/{id}
GET /directoryObjects/{id}
Please notice that this cmdlet will mark ObjectType as Unknown in output if the object of role
assignment is not found or current account has insufficient privileges to get object type.
New-AzRoleDefinition Creates a custom role in Azure RBAC. Provide either a JSON role definition file or a PSRoleDefinition
object as input. First, use the Get-AzRoleDefinition command to generate a baseline role definition
object. Then, modify its properties as required. Finally, use this command to create a custom role using
role definition.
New-AzTag Creates a predefined Azure tag or adds values to an existing tag | Creates or updates the entire set of
tags on a resource or subscription.
The cmdlet may call below Microsoft Graph API according to input parameters:
GET /users/{id}
GET /servicePrincipals/{id}
GET /groups/{id}
GET /directoryObjects/{id}
POST /directoryObjects/getByIds
Please notice that this cmdlet will mark ObjectType as Unknown in output if the object of role
assignment is not found or current account has insufficient privileges to get object type.
Remove-AzRoleDefinition Deletes a custom role in Azure RBAC. The role to be deleted is specified using the Id property of the
role. Delete will fail if there are existing role assignments made to the custom role.
Remove-AzTag Deletes predefined Azure tags or values | Deletes the entire set of tags on a resource or subscription.
The cmdlet may call below Microsoft Graph API according to input parameters:
GET /users/{id}
GET /servicePrincipals/{id}
GET /groups/{id}
GET /directoryObjects/{id}
POST /directoryObjects/getByIds
Please notice that this cmdlet will mark ObjectType as Unknown in output if the object of role
assignment is not found or current account has insufficient privileges to get object type.
Set-AzRoleDefinition Modifies a custom role in Azure RBAC. Provide the modified role definition either as a JSON file or as a
PSRoleDefinition. First, use the Get-AzRoleDefinition command to retrieve the custom role that you
wish to modify. Then, modify the properties that you wish to change. Finally, save the role definition
using this command.
Consulte también
Introducción a las aplicaciones administradas de Azure
Inicio rápido: Creación y publicación de una definición de aplicación administrada
Habilitación y solicitud de acceso Just-In-Time para Azure Managed Applications
Funciones CreateUiDefinition
Artículo • 01/06/2023
Sintaxis de la función
Para usar una función, encierre la invocación entre corchetes. Por ejemplo:
JSON
"[function()]"
Puede hacerse referencia a cadenas y otras funciones como parámetros para una
función, pero las cadenas deben encerrarse entre comillas simples. Por ejemplo:
JSON
JSON
"[func().prop1]"
Funciones de colección
Estas funciones se pueden usar con las colecciones, como las cadenas JSON, matrices y
objetos.
contains
empty
filter
first
last
length
map
skip
split
take
Funciones de conversión
Estas funciones se pueden usar para convertir valores entre tipos de datos JSON y
codificaciones.
bool
decodeBase64
decodeUriComponent
encodeBase64
encodeUriComponent
float
int
parse
string
Funciones de fecha
addHours
addMinutes
addSeconds
utcNow
Funciones lógicas
Estas funciones se pueden usar en los condicionales. Algunas funciones pueden no
admitir todos los tipos de datos JSON.
and
coalesce
equals
greater
greaterOrEquals
if
less
lessOrEquals
not
or
Funciones matemáticas
add
ceil
div
floor
max
min
mod
mul
rand
range
sub
Referencias a funciones
basics
ubicación
resourceGroup
steps
suscripción
Funciones de cadena
concat
endsWith
guid
indexOf
lastIndexOf
replace
startsWith
substring
toLower
toUpper
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Funciones de recopilación
CreateUiDefinition
Artículo • 01/06/2023
Estas funciones se pueden usar con las colecciones, como las cadenas JSON, matrices y
objetos.
contains
Devuelve true si una cadena contiene la subcadena especificada, una matriz contiene el
valor especificado o un objeto contiene la clave especificada.
JSON
"[contains('webapp', 'web')]"
JSON
"[contains(steps('demoStep').element1, 4)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
El siguiente ejemplo devuelve true :
JSON
"[contains(steps('demoStep').element1, 'key1')]"
empty
Devuelve true si la cadena, la matriz o el objeto es nulo o está vacío.
JSON
"[empty('')]"
JSON
"[empty(steps('demoStep').element1)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[empty(steps('demoStep').element1)]"
JSON
"[empty(steps('demoStep').element1)]"
filter
Devuelve una nueva matriz después de aplicar la lógica de filtrado proporcionada como
una función lambda. El primer parámetro es la matriz que se usará para el filtrado. El
segundo parámetro es la función lambda que especifica la lógica de filtrado.
JSON
first
Devuelve el primer carácter de la cadena especificada, el primer valor de la matriz
especificada o la primera clave y valor del objeto especificado.
JSON
"[first('contoso')]"
"[first(steps('demoStep').element1)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[first(steps('demoStep').element1)]"
last
Devuelve el último carácter de la cadena especificada, el último valor de la matriz
especificada o la última clave y valor del objeto especificado.
JSON
"[last('contoso')]"
JSON
"[last(steps('demoStep').element1)]"
Ejemplo: último elemento de objeto
Asuma que element1 devuelve:
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[last(steps('demoStep').element1)]"
length
Devuelve el número de caracteres de una cadena, el número de valores de una matriz o
el número de claves en un objeto.
JSON
"[length('Contoso')]"
JSON
"[length(steps('demoStep').element1)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[length(steps('demoStep').element1)]"
map
Devuelve una nueva matriz después de llamar una función lambda en una matriz
específica. El primer parámetro es la matriz que se usará para el la función lambda. El
segundo parámetro es la función lambda.
En el ejemplo siguiente se devuelve una nueva matriz con todos los valores duplicados.
El resultado es [2, 4, 6] .
JSON
JSON
skip
Omite un número especificado de elementos de una colección y, a continuación,
devuelve los elementos restantes.
JSON
"[skip('webapp', 3)]"
JSON
"[skip(steps('demoStep').element1, 2)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[skip(steps('demoStep').element1, 1)]"
split
Devuelve una matriz de string que contiene los elementos substring de la entrada
delimitada por el separador.
JSON
"[split('555-867-5309', '-')]"
take
Devuelve un número especificado de caracteres contiguos desde el principio de la
cadena, un número especificado de valores contiguos desde el principio de la matriz o
un número de claves y valores contiguos desde el principio del objeto especificado.
JSON
"[take('webapp', 3)]"
JSON
"[take(steps('demoStep').element1, 2)]"
JSON
{
"key1": "Linux",
"key2": "Windows"
}
JSON
"[take(steps('demoStep').element1, 1)]"
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Funciones de conversión
CreateUiDefinition
Artículo • 01/06/2023
Estas funciones se pueden usar para convertir valores entre tipos de datos JSON y
codificaciones.
bool
Convierte el parámetro en un booleano. Esta función admite parámetros de tipo
number, string y booleano. Similar a los booleanos en JavaScript, cualquier valor
excepto 0 o 'false' devuelve true .
JSON
"[bool(1)]"
JSON
"[bool(0)]"
JSON
"[bool(true)]"
JSON
"[bool('true')]"
decodeBase64
Decodifica el parámetro de una cadena de codificación Base 64. Esta función admite
parámetros solo de tipo string.
JSON
"[decodeBase64('Q29udG9zbw==')]"
decodeUriComponent
Decodifica el parámetro de una cadena de codificación con dirección URL. Esta función
admite parámetros solo de tipo string.
JSON
"[decodeUriComponent('https%3A%2F%[Link]%2F')]"
encodeBase64
Codifica el parámetro a una cadena de codificación Base 64. Esta función admite
parámetros solo de tipo string.
JSON
"[encodeBase64('Contoso')]"
encodeUriComponent
Codifica el parámetro a una cadena de codificación con dirección URL. Esta función
admite parámetros solo de tipo string.
JSON
"[encodeUriComponent('[Link]
FLOAT
Convierte el parámetro en un número de punto flotante. Esta función admite
parámetros de tipo number y string.
JSON
"[float('1.0')]"
JSON
"[float(2.9)]"
int
Convierte el parámetro en un número entero. Esta función admite parámetros de tipo
number y string.
JSON
"[int('1')]"
JSON
"[int(2.9)]"
parse
Convierte el parámetro en un tipo nativo. En otras palabras, esta función es el inverso de
string() . Esta función admite parámetros solo de tipo string.
"[parse('1')]"
JSON
"[parse('true')]"
JSON
"[parse('[1,2,3]')]"
JSON
"[parse('{\"type\":\"webapp\"}')]"
string
Convierte el parámetro en una cadena. Esta función admite parámetros de todos los
tipos de datos JSON.
JSON
"[string(1)]"
JSON
"[string(2.9)]"
JSON
"[string([1,2,3])]"
JSON
"[string({\"type\":\"webapp\"})]"
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Funciones de fecha CreateUiDefinition
Artículo • 01/06/2023
addHours
Agrega un número entero de horas a la marca de tiempo especificada.
JSON
"[addHours('1990-12-31T[Link]Z', 1)]"
addMinutes
Agrega un número entero de minutos a la marca de tiempo especificada.
JSON
"[addMinutes('1990-12-31T[Link]Z', 1)]"
addSeconds
Agrega un número entero de segundos a la marca de tiempo especificada.
JSON
"[addSeconds('1990-12-31T[Link]Z', 1)]"
utcNow
Devuelve una cadena en formato ISO 8601 de la fecha y hora actuales en el equipo
local.
El siguiente ejemplo podría devolver "1990-12-31T[Link].000Z" :
JSON
"[utcNow()]"
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Funciones lógicas CreateUiDefinition
Artículo • 01/06/2023
y
Devuelve true si todos los parámetros se evalúan como true . Esta función admite dos
o más parámetros solo de tipo booleano.
JSON
JSON
coalesce
Devuelve el valor del primer parámetro no nulo. Algunas funciones admiten todos los
tipos de datos JSON.
JSON
"[coalesce(steps('demoStep').element1, steps('demoStep').element2,
'Contoso')]"
Tenga en cuenta este elemento DropDown , que permite al usuario elegir entre varios
tipos de bases de datos diferentes:
{
"name": "databaseType",
"type": "[Link]",
"label": "Choose database type",
"toolTip": "Choose database type",
"defaultValue": "Oracle Database",
"visible": "[bool(steps('section_database').connectToDatabase)]"
"constraints": {
"allowedValues": [
{
"label": "Azure Database for PostgreSQL",
"value": "postgresql"
},
{
"label": "Oracle Database",
"value": "oracle"
},
{
"label": "Azure SQL",
"value": "sqlserver"
}
],
"required": true
},
"regex": "[concat('^jdbc:',
coalesce(steps('section_database').[Link], ''),
'.*$')]",
equals
Devuelve true si ambos parámetros tienen el mismo tipo y valor. Algunas funciones
admiten todos los tipos de datos JSON.
JSON
"[equals(0, 0)]"
JSON
"[equals('web', 'web')]"
JSON
greater
Devuelve true si el primer parámetro es estrictamente mayor que el segundo
parámetro. Esta función admite parámetros solo de tipo number y string.
JSON
"[greater(1, 2)]"
JSON
"[greater('9', '10')]"
greaterOrEquals
Devuelve true si el primer parámetro es estrictamente mayor o igual que el segundo
parámetro. Esta función admite parámetros solo de tipo number y string.
JSON
"[greaterOrEquals(2, 2)]"
if
Devuelve un valor dependiendo de si una condición es verdadera o falsa. El primer
parámetro es la condición que se va a probar. El segundo, es el valor que se va a
devolver si la condición es verdadera. El tercero, es el valor que se va a devolver si la
condición es falsa.
JSON
less
Devuelve true si el primer parámetro es estrictamente menor que el segundo
parámetro. Esta función admite parámetros solo de tipo number y string.
JSON
"[less(1, 2)]"
JSON
"[less('9', '10')]"
lessOrEquals
Devuelve true si el primer parámetro es estrictamente menor o igual que el segundo
parámetro. Esta función admite parámetros solo de tipo number y string.
JSON
"[lessOrEquals(2, 2)]"
not
Devuelve true si el parámetro se evalúa como false . Esta función admite parámetros
solo de tipo booleano.
JSON
"[not(false)]"
JSON
"[not(equals(0, 0))]"
or
Devuelve true si al menos uno de los parámetros se evalúa como true . Esta función
admite dos o más parámetros solo de tipo booleano.
JSON
JSON
add
Agrega dos números y devuelve el resultado.
JSON
"[add(1, 2)]"
ceil
Devuelve el valor entero más grande mayor o igual que el número especificado.
JSON
"[ceil(3.14)]"
div
Divide el segundo número por el primer número y devuelve el resultado. El resultado es
siempre un número entero.
JSON
"[div(6, 3)]"
floor
Devuelve el valor entero más grande menor o igual que el número especificado.
JSON
"[floor(3.14)]"
max
Devuelve el número más grande de los dos.
JSON
"[max(1, 2)]"
Min
Devuelve el más pequeño de dos números.
JSON
"[min(1, 2)]"
mod
Divide el primer número por el segundo número y devuelve el resto.
JSON
"[mod(6, 3)]"
JSON
"[mod(6, 4)]"
mul
Multiplica dos números y devuelve el resultado.
JSON
"[mul(2, 3)]"
rand
Genera un número integral aleatorio en el intervalo especificado. Esta función no genera
números aleatorios criptográficamente seguros.
JSON
"[rand(-100, 100)]"
range
Genera una secuencia de números enteros en el intervalo especificado.
JSON
"[range(1, 3)]"
sub
Resta el segundo número al primer número y devuelve el resultado.
JSON
"[sub(3, 2)]"
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Funciones de referencia
CreateUiDefinition
Artículo • 01/06/2023
Se trata de las funciones que se van a usar para hacer referencia a salidas de las
propiedades o el contexto de un archivo de CreateUiDefinition.
basics
Devuelve los valores de salida de un elemento que se define en el paso Aspectos
básicos. Pase el nombre del elemento como un parámetro a esta función.
Para obtener los valores de salida de los elementos en otros pasos, utilice la función
steps().
JSON
"[basics('clusterName')]"
Los valores devueltos varían en función del tipo de elemento que se recupera.
ubicación
Devuelve la ubicación seleccionada en el paso Basics o el contexto actual.
JSON
"[location()]"
resourceGroup
Devuelve detalles sobre la instancia de resourceGroup seleccionada en el paso Aspectos
básicos o en el contexto actual.
En el ejemplo siguiente:
JSON
"[resourceGroup()]"
JSON
{
"mode": "New" or "Existing",
"name": "{resourceGroupName}",
"location": "{resourceGroupLocation}"
}
JSON
"[resourceGroup().name]"
steps
Devuelve los elementos de un paso especificado. Pase el nombre del paso como un
parámetro a esta función. En los elementos devueltos, puede obtener valores concretos
de propiedad.
Para obtener los valores de salida de los elementos en el paso Aspectos básicos, use la
función basics().
JSON
"[steps('vmParameters').adminUsername]"
subscription
Devuelve propiedades para la suscripción seleccionada en el paso Aspectos básicos o el
contexto actual.
En el ejemplo siguiente:
JSON
"[subscription()]"
JSON
{
"id": "/subscriptions/{subscription-id}",
"subscriptionId": "{subscription-id}",
"tenantId": "{tenant-id}",
"displayName": "{name-of-subscription}"
}
Pasos siguientes
Para una introducción para desarrollar la interfaz del portal, vea
[Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Funciones de cadena CreateUiDefinition
Artículo • 01/06/2023
concat
Concatena una o varias cadenas.
JSON
endsWith
Determina si una cadena termina con un valor.
JSON
"[endsWith('tuvwxyz', 'xyz')]"
guid
Genera una cadena única global (GUID).
JSON
"[guid()]"
indexOf
Devuelve la primera posición de un valor dentro de una cadena o -1 si no se encuentra.
En el ejemplo siguiente se devuelve 2.
JSON
"[indexOf('abcdef', 'cd')]"
lastIndexOf
Devuelve la última posición de un valor en una cadena o -1 si no se encuentra.
JSON
"[lastIndexOf('test', 't')]"
replace
Devuelve una cadena en la que se reemplazan todas las instancias de la cadena
especificada en la cadena actual con otra cadena.
JSON
startsWith
Determina si una cadena empieza con un valor.
JSON
"[startsWith('abcdefg', 'ab')]"
substring
Devuelve la subcadena de la cadena especificada. La subcadena comienza en el índice
especificado y tiene la longitud especificada.
JSON
toLower
Devuelve una cadena convertida a minúsculas.
JSON
"[toLower('CONTOSO')]"
toUpper
Devuelve una cadena convertida a mayúsculas.
JSON
"[toUpper('contoso')]"
Pasos siguientes
Para ver una introducción a Azure Resource Manager, consulte Información
general sobre Azure Resource Manager.
Elementos CreateUiDefinition
Artículo • 01/06/2023
Schema
El esquema de la mayoría de los elementos es el siguiente:
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Some text box",
"defaultValue": "my value",
"toolTip": "Provide a descriptive name.",
"constraints": {},
"options": {},
"visible": true
}
Elementos
La documentación de cada elemento contiene un ejemplo de interfaz de usuario, un
esquema, comentarios sobre el comportamiento del elemento (normalmente sobre la
validación y personalización compatibles) y una salida de ejemplo.
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
[Link]
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
El control CheckBox permite que los usuarios activen o desactiven una opción. El control
devuelve true cuando el control se activa o false, cuando no se activa.
Schema
JSON
{
"name": "legalAccept",
"type": "[Link]",
"label": "I agree to the terms and conditions.",
"constraints": {
"required": true,
"validationMessage": "Please acknowledge the legal conditions."
}
}
Salida de ejemplo
JSON
true
Observaciones
Cuando establece required en true, el usuario debe activar la casilla. Si el usuario no
activa la casilla, se muestra el mensaje de validación.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 25/03/2023
Control de selección con una lista desplegable. Puede permitir la selección de un solo
elemento o de varios. De forma opcional, también puede incluir una descripción con los
elementos.
Cuando la selección múltiple está habilitada, el control agrega una opción Seleccionar
todo y casillas para activar más de un elemento:
Se pueden incluir descripciones con la selección múltiple habilitada.
Cuando el filtrado está habilitado, el control incluye un cuadro de texto para agregar el
valor de filtrado.
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Example drop down",
"placeholder": "",
"defaultValue": ["Value two"],
"toolTip": "",
"multiselect": true,
"selectAll": true,
"filter": true,
"filterPlaceholder": "Filter items ...",
"multiLine": true,
"defaultDescription": "A value for selection",
"constraints": {
"allowedValues": [
{
"label": "Value one",
"description": "The value to select for option 1.",
"value": "one"
},
{
"label": "Value two",
"description": "The value to select for option 2.",
"value": "two"
}
],
"required": true
},
"visible": true
}
Salida de ejemplo
JSON
"two"
Observaciones
Use multiselect para especificar si los usuarios pueden seleccionar más de un
elemento.
De forma predeterminada, selectAll es true cuando la selección múltiple está
habilitada.
La propiedad filter permite a los usuarios buscar en una larga lista de opciones.
La etiqueta de [Link] es el texto para mostrar de un
elemento, y su valor es el valor de salida del elemento cuando se selecciona.
Si se especifica, el valor predeterminado debe ser una etiqueta presente en
[Link] . Si no se especifica, se selecciona el primer elemento
de [Link] . El valor predeterminado es null.
[Link] debe tener al menos un elemento.
Para emular un valor que no es obligatorio, agregue un elemento con una etiqueta
y el valor "" (cadena vacía) a [Link] .
La propiedad defaultDescription se usa para los elementos que no tienen una
descripción.
La propiedad placeholder es el texto de ayuda que desaparece cuando el usuario
comienza a editar. Si se definen tanto placeholder como defaultValue ,
defaultValue tiene prioridad y se muestra.
Ejemplo
En el ejemplo siguiente, defaultValue se define mediante los valores de allowedValues
en lugar de las etiquetas. El valor predeterminado puede contener varios valores cuando
multiselect está habilitado.
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Example drop down",
"placeholder": "",
"defaultValue": [{"value": "one"}, {"value": "two"}],
"toolTip": "Multiple values can be selected",
"multiselect": true,
"selectAll": true,
"filter": true,
"filterPlaceholder": "Filter items ...",
"multiLine": true,
"defaultDescription": "A value for selection",
"constraints": {
"allowedValues": [
{
"label": "Value one",
"description": "The value to select for option 1.",
"value": "one"
},
{
"label": "Value two",
"description": "The value to select for option 2.",
"value": "two"
}
],
"required": true
},
"visible": true
}
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
Artículo • 01/06/2023
Se trata de un control para recopilar datos tabulares. Todos los campos de la cuadrícula
son editables y el número de filas puede variar.
Schema
JSON
{
"name": "people",
"type": "[Link]",
"ariaLabel": "Enter information per person",
"label": "People",
"constraints": {
"width": "Full",
"rows": {
"count": {
"min": 1,
"max": 10
}
},
"columns": [
{
"id": "colName",
"header": "Name",
"width": "1fr",
"element": {
"type": "[Link]",
"placeholder": "Full name",
"constraints": {
"required": true,
"validations": [
{
"isValid": "[startsWith(last(take(steps('grid').people,
$rowIndex)).colName, 'contoso')]",
"message": "Must start with 'contoso'."
},
{
"regex": "^[a-z0-9A-Z]{1,30}$",
"message": "Only alphanumeric characters are allowed, and
the value must be 1-30 characters long."
}
]
}
}
},
{
"id": "colGender",
"header": "Gender",
"width": "1fr",
"element": {
"name": "dropDown1",
"type": "[Link]",
"placeholder": "Select a gender...",
"constraints": {
"allowedValues": [
{
"label": "Female",
"value": "female"
},
{
"label": "Male",
"value": "male"
},
{
"label": "Other",
"value": "other"
}
],
"required": true
}
}
},
{
"id": "colContactPreference",
"header": "Contact preference",
"width": "1fr",
"element": {
"type": "[Link]",
"constraints": {
"allowedValues": [
{
"label": "Email",
"value": "email"
},
{
"label": "Text",
"value": "text"
}
],
"required": true
}
}
}
]
}
}
Salida de ejemplo
JSON
{
"colName": "contoso",
"colGender": "female",
"colContactPreference": "email"
}
Observaciones
Los únicos controles válidos dentro de la matriz de columnas son TextBox,
OptionsGroupy DropDown.
Por ejemplo:
last(take(<reference_to_grid>, $rowIndex))
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Control que permite al usuario especificar uno o varios archivos para cargar.
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Some file upload",
"toolTip": "",
"constraints": {
"required": true,
"accept": ".doc,.docx,.xml,application/msword"
},
"options": {
"multiple": false,
"uploadMode": "file",
"openMode": "text",
"encoding": "UTF-8"
},
"visible": true
}
Salida de ejemplo
Si [Link] es false y [Link] es file, la salida tiene el contenido del
archivo como una cadena JSON:
JSON
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua."
Si [Link] es true y [Link] es file, la salida incluye el contenido
del archivo como una matriz JSON:
JSON
[
"Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod
tempor incididunt ut labore et dolore magna aliqua.",
"Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi
ut aliquip ex ea commodo consequat.",
"Duis aute irure dolor in reprehenderit in voluptate velit esse cillum
dolore eu fugiat nulla pariatur.",
"Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia
deserunt mollit anim id est laborum."
]
JSON
"[Link]
15&st=2013-08-16&se=2013-08-17&sr=c&sp=r&rscd=file;%20attachment&rsct=binary
&sig=YWJjZGVmZw%3d%3d&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d"
JSON
[
"[Link]
15&st=2013-08-16&se=2013-08-17&sr=c&sp=r&rscd=file;%20attachment&rsct=binary
&sig=YWJjZGVmZw%3d%3d&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d",
"[Link]
15&st=2013-08-16&se=2013-08-17&sr=c&sp=r&rscd=file;%20attachment&rsct=binary
&sig=YWJjZGVmZw%3d%3d&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d",
"[Link]
15&st=2013-08-16&se=2013-08-17&sr=c&sp=r&rscd=file;%20attachment&rsct=binary
&sig=YWJjZGVmZw%3d%3d&sig=a39%2BYozJhGp6miujGymjRpN8tsrQfLo9Z3i8IRyIpnQ%3d"
]
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "text1",
"type": "[Link]",
"visible": true,
"options": {
"icon": "None",
"text": "Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim.
Sed et felis metus, rhoncus ornare nibh. Ut at magna leo.",
"uri": "[Link]
}
}
Salida de ejemplo
JSON
"Nullam eros mi, mollis in sollicitudin non, tincidunt sed enim. Sed et
felis metus, rhoncus ornare nibh. Ut at magna leo."
Observaciones
Para icon , use Ninguno, Información, Advertencia o Error.
La propiedad uri es opcional.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
El control OptionsGroup permite a los usuarios seleccionar una opción de dos o más
opciones. Un usuario solo puede seleccionar una opción.
7 Nota
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Some options group",
"defaultValue": "Value two",
"toolTip": "",
"constraints": {
"allowedValues": [
{
"label": "Value one",
"value": "one"
},
{
"label": "Value two",
"value": "two"
}
],
"required": true
},
"visible": true
}
Salida de ejemplo
JSON
"two"
Observaciones
La etiqueta de [Link] es el texto para mostrar de un
elemento, y su valor es el valor de salida del elemento cuando se selecciona.
Si se especifica, el valor predeterminado debe ser una etiqueta presente en
[Link] . Si no se especifica, se selecciona el primer elemento
de [Link] de forma predeterminada. El valor predeterminado
es null.
[Link] debe tener al menos un elemento.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"password": "Password",
"confirmPassword": "Confirm password"
},
"toolTip": "",
"constraints": {
"required": true,
"regex": "^[a-zA-Z0-9]{8,}$",
"validationMessage": "Password must be at least 8 characters long,
contain only numbers and letters"
},
"options": {
"hideConfirmation": false
},
"visible": true
}
Salida de ejemplo
JSON
"p4ssw0rd"
Observaciones
Este elemento no admite la propiedad defaultValue .
Para más detalles sobre la implementación de constraints , consulte
[Link].
Si [Link] está establecido en true, se oculta el segundo cuadro
de texto para confirmar la contraseña del usuario. El valor predeterminado es false.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "section1",
"type": "[Link]",
"label": "Example section",
"elements": [
{
"name": "text1",
"type": "[Link]",
"label": "Example text box 1"
},
{
"name": "text2",
"type": "[Link]",
"label": "Example text box 2"
}
],
"visible": true
}
Observaciones
elements debe tener al menos un elemento y puede tener todos los tipos de
Salida de ejemplo
Para obtener acceso a los valores de salida de los elementos en elements , use las
funciones basics() o steps() y la notación de puntos:
JSON
steps('configuration').section1.text1
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link].
ServicePrincipalSelector
Artículo • 01/06/2023
Control que permite a los usuarios seleccionar una entidad de servicio o registrar una
aplicación nueva. Al seleccionar Crear nuevo, se recorren los pasos para registrar una
nueva aplicación. Al seleccionar una aplicación existente, el control proporciona un
cuadro de texto para escribir una contraseña o una huella digital de certificado.
Después de registrar una nueva aplicación, use el Tipo de autenticación para escribir
una contraseña o una huella digital de certificado.
Uso de la aplicación existente
Para usar una aplicación existente, pulse Seleccionar existentes y, a continuación, Hacer
la selección. Use el cuadro de diálogo Seleccionar una aplicación para buscar el
nombre de la aplicación. En los resultados, seleccione la aplicación y, a continuación, el
botón Seleccionar. Después de seleccionar una aplicación, el control muestra el tipo de
autenticación para escribir una contraseña o una huella digital de certificado.
Schema
JSON
{
"name": "ServicePrincipal",
"type": "[Link]",
"label": {
"password": "Password",
"certificateThumbprint": "Certificate thumbprint",
"authenticationType": "Authentication Type",
"sectionHeader": "Service Principal"
},
"toolTip": {
"password": "Password",
"certificateThumbprint": "Certificate thumbprint",
"authenticationType": "Authentication Type"
},
"defaultValue": {
"principalId": "<default guid>",
"name": "(New) default App Id"
},
"constraints": {
"required": true,
"regex": "^[a-zA-Z0-9]{8,}$",
"validationMessage": "Password must be at least 8 characters long,
contain only numbers and letters"
},
"options": {
"hideCertificate": false
},
"visible": true
}
Observaciones
Las propiedades necesarias son las siguientes:
name
type
label
Ejemplo
A continuación se muestra un ejemplo del control
[Link] . La propiedad defaultValue establece
principalId en <default guid> como un marcador de posición para un GUID de
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [],
"steps": [
{
"name": "SPNcontrol",
"label": "SPNcontrol",
"elements": [
{
"name": "ServicePrincipal",
"type": "[Link]",
"label": {
"password": "Password",
"certificateThumbprint": "Certificate thumbprint",
"authenticationType": "Authentication Type",
"sectionHeader": "Service Principal"
},
"toolTip": {
"password": "Password",
"certificateThumbprint": "Certificate thumbprint",
"authenticationType": "Authentication Type"
},
"defaultValue": {
"principalId": "<default guid>",
"name": "(New) default App Id"
},
"constraints": {
"required": true,
"regex": "^[a-zA-Z0-9]{8,}$",
"validationMessage": "Password must be at least 8 characters
long, contain only numbers and letters"
},
"options": {
"hideCertificate": false
},
"visible": true
}
]
}
],
"outputs": {
"appId": "[steps('SPNcontrol').[Link]]",
"objectId": "[steps('SPNcontrol').[Link]]",
"password": "[steps('SPNcontrol').[Link]]",
"certificateThumbprint": "
[steps('SPNcontrol').[Link]]",
"newOrExisting": "
[steps('SPNcontrol').[Link]]",
"authenticationType": "
[steps('SPNcontrol').[Link]]"
}
}
}
Salida de ejemplo
appId es el identificador del registro de la aplicación que ha seleccionado o creado.
objectId es una matriz de los id. de objeto correspondientes a las entidades de servicio
configuradas para el registro de la aplicación seleccionada.
JSON
{
"appId": {
"value": "<default guid>"
},
"objectId": {
"value": ["<default guid>"]
},
"password": {
"value": "<password>"
},
"certificateThumbprint": {
"value": ""
},
"newOrExisting": {
"value": "new"
},
"authenticationType": {
"value": "password"
}
}
JSON
{
"appId": {
"value": "<guid>"
},
"objectId": {
"value": ["<guid>"]
},
"password": {
"value": "<password>"
},
"certificateThumbprint": {
"value": ""
},
"newOrExisting": {
"value": "existing"
},
"authenticationType": {
"value": "password"
}
}
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "memorySize",
"type": "[Link]",
"min": 1,
"max": 64,
"label": "Memory",
"subLabel": "MB",
"defaultValue": 24,
"showStepMarkers": false,
"toolTip": "Pick the size in MB",
"constraints": {
"required": false
},
"visible": true
}
Salida de ejemplo
JSON
26
Observaciones
Los valores min y max son obligatorios. Establecen los puntos inicial y final para el
control deslizante.
El valor predeterminado de la propiedad showStepMarkers es true. Los marcadores
de paso solo se muestran cuando el intervalo de mínimo a máximo es 100 o
menos.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"resources": [
"[Link]/storageAccounts",
"[Link]/virtualMachines"
]
}
Salida de ejemplo
JSON
{
"[Link]/storageAccounts": {
"Dept": "Finance",
"Environment": "Production"
},
"[Link]/virtualMachines": {
"Dept": "Finance"
}
}
Observaciones
Como mínimo, se debe especificar un elemento de la matriz resources .
JSON
"parameters": {
"tagsByResource": { "type": "object", "defaultValue": {} }
}
Para cada recurso que se pueda etiquetar, asigne la propiedad "tags" al valor del
parámetro para ese tipo de recurso:
JSON
{
"name": "saName1",
"type": "[Link]/storageAccounts",
"tags": "[ if(contains(parameters('tagsByResource'),
'[Link]/storageAccounts'), parameters('tagsByResource')
['[Link]/storageAccounts'], json('{}')) ]",
...
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Un control que se puede usar para agregar texto a la interfaz del portal.
Schema
JSON
{
"name": "text1",
"type": "[Link]",
"visible": true,
"options": {
"text": "Please provide the configuration values for your application.",
"link": {
"label": "Learn more",
"uri": "[Link]
}
}
}
Salida de ejemplo
JSON
"Please provide the configuration values for your application. Learn more"
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
El elemento de interfaz de usuario (UI) TextBox se puede usar para agregar texto sin
formato. El elemento es un campo de entrada de una sola línea, pero admite la entrada
de varias líneas con la propiedad multiLine .
Schema
JSON
{
"name": "nameInstance",
"type": "[Link]",
"label": "Name",
"defaultValue": "contoso123",
"toolTip": "Use only allowed characters",
"placeholder": "",
"multiLine": false,
"constraints": {
"required": true,
"validations": [
{
"regex": "^[a-z0-9A-Z]{1,30}$",
"message": "Only alphanumeric characters are allowed, and the value
must be 1-30 characters long."
},
{
"isValid": "[startsWith(steps('resourceConfig').nameInstance,
'contoso')]",
"message": "Must start with 'contoso'."
}
]
},
"visible": true
}
Salida de ejemplo
JSON
"contoso123"
Observaciones
Utilice la propiedad toolTip para mostrar texto encima del elemento cuando el
cursor del mouse se desplaza sobre el símbolo de información.
La propiedad placeholder es el texto de ayuda que desaparece cuando el usuario
comienza a editar. Si se definen tanto placeholder como defaultValue ,
defaultValue tiene prioridad y se muestra.
Ejemplos
En los ejemplos se muestra cómo usar un cuadro de texto de una sola línea y uno de
varias líneas.
Una línea
En el ejemplo siguiente se usa un cuadro de texto con el control
[Link] para comprobar la disponibilidad de un nombre de
recurso.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{
"name": "nameApi",
"type": "[Link]",
"request": {
"method": "POST",
"path": "[concat(subscription().id,
'/providers/[Link]/checkNameAvailability?api-version=2021-09-
01')]",
"body": {
"name": "[basics('txtStorageName')]",
"type": "[Link]/storageAccounts"
}
}
},
{
"name": "txtStorageName",
"type": "[Link]",
"label": "Storage account name",
"constraints": {
"validations": [
{
"isValid": "[basics('nameApi').nameAvailable]",
"message": "[basics('nameApi').message]"
}
]
}
}
],
"steps": [],
"outputs": {
"textBox": "[basics('txtStorageName')]"
}
}
}
Varias líneas
En este ejemplo se usa la propiedad multiLine para crear un cuadro de texto de varias
líneas con texto de marcador de posición.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{
"name": "demoTextBox",
"type": "[Link]",
"label": "Multi-line text box",
"defaultValue": "",
"toolTip": "Use 1-60 alphanumeric characters, hyphens, spaces,
periods, and colons.",
"placeholder": "This is a multi-line text box:\nLine 1.\nLine
2.\nLine 3.",
"multiLine": true,
"constraints": {
"required": true,
"validations": [
{
"regex": "^[a-z0-9A-Z -.:\n]{1,60}$",
"message": "Only 1-60 alphanumeric characters, hyphens,
spaces, periods, and colons are allowed."
}
]
},
"visible": true
}
],
"steps": [],
"outputs": {
"textBox": "[basics('demoTextBox')]"
}
}
}
Pasos siguientes
Para ver una introducción sobre cómo crear definiciones de UI, consulte
[Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Para más información sobre las funciones, consulte Funciones CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Para Linux con una clave pública SSH seleccionada, se muestra el control de clave SSH:
Generar un par de claves nuevo: proporcione un nombre para crear un nuevo par
de claves SSH en Azure.
Usar la clave existente almacenada en Azure: seleccione una clave pública SSH
existente almacenada en Azure.
Usar la clave pública existente: use una clave pública SSH que ya haya creado. Por
ejemplo, una clave pública SSH que se creó en un equipo local.
Schema
Para Windows, use el esquema siguiente:
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"password": "Password",
"confirmPassword": "Confirm password"
},
"toolTip": {
"password": ""
},
"constraints": {
"required": true,
"customPasswordRegex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{12,}$",
"customValidationMessage": "The password must be alphanumeric, contain
at least 12 characters, and have at least 1 letter and 1 number."
},
"options": {
"hideConfirmation": false
},
"osPlatform": "Windows",
"visible": true
}
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"authenticationType": "Authentication type",
"password": "Password",
"confirmPassword": "Confirm password",
"sshPublicKey": "SSH public key"
},
"toolTip": {
"authenticationType": "",
"password": "",
"sshPublicKey": ""
},
"constraints": {
"required": true,
"customPasswordRegex": "^(?=.*[A-Za-z])(?=.*\\d)[A-Za-z\\d]{12,}$",
"customValidationMessage": "The password must be alphanumeric, contain
at least 12 characters, and have at least 1 letter and 1 number."
},
"options": {
"hideConfirmation": false,
"hidePassword": false
},
"osPlatform": "Linux",
"visible": true
}
Salida de ejemplo
Si osPlatform es Windows o osPlatform es Linux y el usuario proporcionó una
contraseña en lugar de una clave pública SSH, el control devuelve la siguiente salida:
JSON
{
"authenticationType": "password",
"password": "p4ssw0rddem0",
}
JSON
{
"authenticationType": "sshPublicKey",
"sshPublicKey":
"AAAAB3NzaC1yc2EAAAABIwAAAIEA1on8gxCGJJWSRT4uOrR13mUaUk0hRf4RzxSZ1zRbYYFw8pf
GesIFoEuVth4HKyF8k1y4mRUnYHP1XNMNMJl1JcEArC2asV8sHf6zSPVffozZ5TT4SfsUu/iKy9l
UcCfXzwre4WWZSXXcPff+EHtWshahu3WzBdnGxm5Xoi89zcE=",
"sshKeyName": "demo-public-key-name",
"generateNewSshKey": false
}
Observaciones
osPlatform debe especificarse y puede ser Windows o Linux.
Si [Link] está establecido en true, los cuadros de texto de clave
pública SSH o contraseña deben contener valores para que la validación sea
correcta. El valor predeterminado es true.
Si [Link] está establecido en true, se oculta el segundo cuadro
de texto para confirmar la contraseña del usuario. El valor predeterminado es false.
Si [Link] está establecido en true, se oculta la opción para utilizar
la autenticación de contraseña. Se puede utilizar solo cuando osPlatform es Linux.
El valor predeterminado es false.
Se pueden implementar restricciones adicionales en las contraseñas permitidas
con la propiedad customPasswordRegex . La cadena de customValidationMessage se
muestra cuando se produce un error de validación personalizada en una
contraseña. El valor predeterminado para ambas propiedades es null. El esquema
muestra un ejemplo de cada propiedad.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Control para seleccionar un tamaño para una o varias instancias de máquina virtual.
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": "Size",
"toolTip": "",
"recommendedSizes": [
"Standard_D1",
"Standard_D2",
"Standard_D3"
],
"constraints": {
"allowedSizes": [],
"excludedSizes": [],
"numAvailabilityZonesRequired": 3,
"zone": "3"
},
"options": {
"hideDiskTypeFilter": false
},
"osPlatform": "Windows",
"imageReference": {
"publisher": "MicrosoftWindowsServer",
"offer": "WindowsServer",
"sku": "2012-R2-Datacenter"
},
"count": 2,
"visible": true
}
Salida de ejemplo
JSON
"Standard_D1"
Observaciones
recommendedSizes debe tener al menos un tamaño. El primer tamaño
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": "User name",
"defaultValue": "",
"toolTip": "",
"constraints": {
"required": true,
"regex": "^[a-z0-9A-Z]{1,30}$",
"validationMessage": "Only alphanumeric characters are allowed, and the
value must be 1-30 characters long."
},
"osPlatform": "Windows",
"visible": true
}
Salida de ejemplo
JSON
"Example name"
Observaciones
Si [Link] está establecido en true, el cuadro de texto debe
contener un valor para que la validación sea correcta. El valor predeterminado es
true.
osPlatform debe especificarse y puede ser Windows o Linux.
[Link] es un patrón de expresión regular de JavaScript. Si se
especifica, el valor del cuadro de texto debe coincidir con el patrón para que la
validación sea correcta. El valor predeterminado es null.
[Link] es una cadena que se muestra cuando el valor del
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
elector
Artículo • 01/06/2023
{
"name": "keyVaultCertificateSelection",
"type": "[Link]",
"visible": true,
"toolTip": "Select certificate",
"label": "KeyVault certificates selection"
}
Salida de ejemplo
JSON
{
"keyVaultName": "azuretestkeyvault1",
"keyVaultId": "/subscriptions/{subscription-
id}/resourceGroups/resourcegroup1/providers/[Link]/vaults/azuret
estkeyvault1",
"certificateName": "certificate1",
"certificateUrl":
"[Link]
"certificateThumbprint": "1B721E84DDDD1BB69282B4A54F18C6ADB1C174F2"
}
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
ctor
Artículo • 01/06/2023
{
"name": "identity",
"type": "[Link]",
"label": "Managed Identity Configuration",
"toolTip": {
"systemAssignedIdentity": "Enable system assigned identity to grant the
resource access to other existing resources.",
"userAssignedIdentity": "Add user assigned identities to grant the
resource access to other existing resources."
},
"defaultValue": {
"systemAssignedIdentity": "Off"
},
"options": {
"hideSystemAssignedIdentity": false,
"hideUserAssignedIdentity": false
},
"visible": true
}
Salida de ejemplo
JSON
{
"identity": {
"value": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/xxxx/resourceGroups/TestResourceGroup/providers/[Link]
nagedIdentity/userAssignedIdentities/TestUserIdentity1": {}
}
}
}
}
Observaciones
Use [Link] para establecer un valor inicial para el
control de opciones de la identidad asignada por el sistema. El valor
predeterminado es Off. Se admiten los valores siguientes:
On: se asigna una identidad asignada por el sistema al recurso.
Off: no se asigna una identidad asignada por el sistema al recurso.
OnOnly: se asigna una identidad asignada por el sistema al recurso. Los
usuarios no pueden editar este valor durante la implementación.
OffOnly: no se asigna una identidad asignada por el sistema al recurso. Los
usuarios no pueden editar este valor durante la implementación.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
bo
Artículo • 01/06/2023
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"publicIpAddress": "Public IP address",
"domainNameLabel": "Domain name label"
},
"toolTip": {
"publicIpAddress": "",
"domainNameLabel": ""
},
"defaultValue": {
"publicIpAddressName": "ip01",
"domainNameLabel": "mydomain"
},
"constraints": {
"required": {
"domainNameLabel": true
}
},
"options": {
"hideNone": false,
"hideDomainNameLabel": false,
"hideExisting": false,
"zone": 3
},
"visible": true
}
Salida de ejemplo
Si el usuario no selecciona ninguna dirección IP pública, el control devuelve la siguiente
salida:
JSON
{
"newOrExistingOrNone": "none"
}
JSON
{
"name": "ip01",
"resourceGroup": "rg01",
"domainNameLabel": "mydomain",
"publicIPAllocationMethod": "Dynamic",
"sku": "Basic",
"newOrExistingOrNone": "new"
}
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
bo
Artículo • 01/06/2023
Cuando el usuario selecciona una red virtual existente, debe asignar cada subred que
requiere la plantilla de implementación a una subred existente. En este caso, la
configuración de subredes es obligatoria.
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"virtualNetwork": "Virtual network",
"subnets": "Subnets"
},
"toolTip": {
"virtualNetwork": "",
"subnets": ""
},
"defaultValue": {
"name": "vnet01",
"addressPrefixSize": "/16"
},
"constraints": {
"minAddressPrefixSize": "/16"
},
"options": {
"hideExisting": false
},
"subnets": {
"subnet1": {
"label": "First subnet",
"defaultValue": {
"name": "subnet-1",
"addressPrefixSize": "/24"
},
"constraints": {
"minAddressPrefixSize": "/24",
"minAddressCount": 12,
"requireContiguousAddresses": true
}
},
"subnet2": {
"label": "Second subnet",
"defaultValue": {
"name": "subnet-2",
"addressPrefixSize": "/26"
},
"constraints": {
"minAddressPrefixSize": "/26",
"minAddressCount": 8,
"requireContiguousAddresses": true
}
}
},
"visible": true
}
Salida de ejemplo
JSON
{
"name": "vnet01",
"resourceGroup": "demoRG",
"addressPrefixes": [
"[Link]/16"
],
"addressPrefix": "[Link]/16",
"newOrExisting": "new",
"subnets": {
"subnet1": {
"name": "subnet-1",
"addressPrefix": "[Link]/24",
"startAddress": "[Link]"
},
"subnet2": {
"name": "subnet-2",
"addressPrefix": "[Link]/26",
"startAddress": "[Link]"
}
}
}
Observaciones
Si se ha especificado, el primer prefijo de dirección que no se superponga del
tamaño [Link] se determina automáticamente en
función de las redes virtuales existentes en la suscripción del usuario.
El valor predeterminado de [Link] y [Link]
es null.
[Link] debe especificarse. Las redes virtuales
existentes con un espacio de direcciones menor que el valor especificado no se
pueden seleccionar.
subnets debe especificarse y [Link] debe
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de UI
[Link]
Artículo • 01/06/2023
Schema
En el ejemplo siguiente se muestra el esquema del control.
JSON
{
"name": "testApi",
"type": "[Link]",
"request": {
"method": "{HTTP-method}",
"path": "{path-for-the-URL}",
"body": {
"key1": "value1",
"key2": "value2"
}
}
}
Salida de ejemplo
La salida del control no se muestra al usuario. En su lugar, los resultados de la operación
se usan en otros controles.
Observaciones
La propiedad [Link] especifica el método HTTP. Solo se permiten GET o
POST.
La propiedad [Link] especifica una dirección URL que debe ser una ruta de
acceso relativa a un punto de conexión de Azure Resource Manager. Puede ser una
ruta de acceso estática o se puede crear dinámicamente mediante la referencia a
los valores de salida de los demás controles.
JSON
"path":
"/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/pro
viders/[Link]/expressRouteCircuits/{circuitName}?api-
version=2022-01-01"
Ejemplo
En el ejemplo siguiente, el elemento providersApi usa ArmApiControl y llama a una API
para obtener una matriz de objetos de proveedor.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{
"name": "providersApi",
"type": "[Link]",
"request": {
"method": "GET",
"path": "[concat(subscription().id,
'/providers/[Link]/expressRouteServiceProviders?api-version=2022-
01-01')]"
}
},
{
"name": "providerDropDown",
"type": "[Link]",
"label": "Provider",
"toolTip": "The provider that offers the express route connection.",
"constraints": {
"allowedValues": "[map(basics('providersApi').value, (item) =>
parse(concat('{\"label\":\"', [Link], '\",\"value\":\"', [Link],
'\"}')))]",
"required": true
},
"visible": true
}
],
"steps": [],
"outputs": {
"providerName": "[basics('providerDropDown')]"
}
}
}
Para ver un ejemplo del objeto ArmApiControl que usa la propiedad [Link] ,
consulte el ejemplo de línea única [Link]. En ese ejemplo se
comprueba la disponibilidad de un nombre de cuenta de almacenamiento y se devuelve
un mensaje si el nombre no está disponible.
Pasos siguientes
Para ver una introducción sobre cómo crear definiciones de UI, consulte
[Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Para obtener más información sobre funciones como map , basics y parse ,
consulte Funciones CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "storageSelector",
"type": "[Link]",
"label": "Select storage accounts",
"resourceType": "[Link]/storageAccounts",
"options": {
"filter": {
"subscription": "onBasics",
"location": "onBasics"
}
}
}
Salida de ejemplo
JSON
"id": "/subscriptions/{subscription-id}/resourceGroups/{resource-
group}/providers/{resource-provider-namespace}/{resource-type}/{resource-
name}",
"location": "{deployed-location}",
"name": "{resource-name}"
Observaciones
En la propiedad resourceType , proporcione el espacio de nombres del proveedor
de recursos y el nombre del tipo de recurso que quiere mostrar en la lista. Para
obtener más información, vea la documentación de referencia sobre proveedores
de recursos.
La propiedad filter restringe las opciones disponibles para los recursos. Puede
restringir los resultados por ubicación o suscripción.
all : muestra todos los recursos. Es el valor predeterminado.
pestaña Básico.
Si omite la propiedad filter del archivo [Link], se muestran en
la lista todos los recursos del tipo de recurso especificado.
Pasos siguientes
Para ver una introducción sobre cómo crear definiciones de UI, consulte
[Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de la interfaz de usuario
[Link]
Combo
Artículo • 01/06/2023
Un grupo de controles para crear varias cuentas de almacenamiento con nombres que
comienzan con un prefijo común.
Schema
JSON
{
"name": "element1",
"type": "[Link]",
"label": {
"prefix": "Storage account prefix",
"type": "Storage account type"
},
"toolTip": {
"prefix": "",
"type": ""
},
"defaultValue": {
"prefix": "sa",
"type": "Premium_LRS"
},
"constraints": {
"allowedTypes": [],
"excludedTypes": []
},
"count": 2,
"visible": true
}
Salida de ejemplo
JSON
{
"prefix": "sa",
"count": 2,
"resourceGroup": "rg01",
"type": "Premium_LRS"
}
Observaciones
El valor de [Link] se concatena con uno o varios números enteros
para generar la secuencia de nombres de cuenta de almacenamiento. Por ejemplo,
si [Link] es sa y count es 2, se generan los nombres de cuenta de
almacenamiento sa1 y sa2. La unicidad de los nombres de cuenta de
almacenamiento generados se valida automáticamente.
Los nombres de cuenta de almacenamiento se generan lexicográficamente en
función de count . Por ejemplo, si count es 10, los nombres de cuenta de
almacenamiento terminan en enteros de dos dígitos (01, 02, 03).
El valor predeterminado de [Link] es null, mientras que el de
[Link] es Premium_LRS.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
or
Artículo • 21/03/2023
Control que se usa para seleccionar una cuenta de almacenamiento nueva o existente.
Los nombres de cuenta de almacenamiento deben ser únicos globalmente en Azure con
una longitud de 3 a 24 caracteres e incluir solo letras en minúsculas o números.
{
"name": "element1",
"type": "[Link]",
"label": "Storage account selector",
"toolTip": "",
"defaultValue": {
"name": "storageaccount01",
"type": "Premium_LRS"
},
"constraints": {
"allowedTypes": [],
"excludedTypes": []
},
"options": {
"hideExisting": false
},
"visible": true
}
Salida de ejemplo
JSON
{
"name": "storageaccount01",
"resourceGroup": "demoRG",
"type": "Standard_LRS",
"newOrExisting": "new",
"kind": "StorageV2"
}
Observaciones
El elemento [Link] es necesario y el valor se valida automáticamente
para la unicidad. Si el nombre de la cuenta de almacenamiento no es único, el
usuario debe especificar otro nombre o elegir una cuenta de almacenamiento
existente.
El valor predeterminado de [Link] es Premium_LRS. Puede establecer
cualquier tipo de cuenta de almacenamiento como valor predeterminado. Por
ejemplo, Standard_LRS o Standard_GRS.
Los tipos no especificados en [Link] está oculto, mientras que
los tipos no especificado en [Link] se muestran. Tanto
[Link] como [Link] son opcionales, pero
Ejemplo
Los valores predeterminados para el nombre y el tipo de la cuenta de almacenamiento
son ejemplos. Puede establecer sus propios valores predeterminados para su entorno.
JSON
{
"$schema": "[Link]
preview/[Link]#",
"handler": "[Link]",
"version": "0.1.2-preview",
"parameters": {
"basics": [
{}
],
"steps": [
{
"name": "StorageAccountSelector",
"label": "Storage account selector",
"elements": [
{
"name": "storageSelectorElement",
"type": "[Link]",
"label": "Storage account name",
"toolTip": "",
"defaultValue": {
"name": "storageaccount01",
"type": "Premium_LRS"
},
"options": {
"hideExisting": false
},
"visible": true
}
]
}
],
"outputs": {
"location": "[location()]",
"storageSelector": "
[steps('StorageAccountSelector').storageSelectorElement]",
"storageKind": "
[steps('StorageAccountSelector').[Link]]",
"storageName": "
[steps('StorageAccountSelector').[Link]]"
}
}
}
Salida de ejemplo
Salida de una nueva cuenta de almacenamiento.
JSON
{
"location": {
"value": "westus3"
},
"storageSelector": {
"value": {
"name": "demostorageaccount01",
"resourceGroup": "demoRG",
"type": "Standard_GRS",
"newOrExisting": "new",
"kind": "StorageV2"
}
},
"storageKind": {
"value": "StorageV2"
},
"storageName": {
"value": "demostorageaccount01"
}
}
JSON
{
"location": {
"value": "westus3"
},
"storageSelector": {
"value": {
"name": "demostorage99",
"resourceGroup": "demoRG",
"type": "Standard_LRS",
"newOrExisting": "existing",
"kind": "StorageV2"
}
},
"storageKind": {
"value": "StorageV2"
},
"storageName": {
"value": "demostorage99"
}
}
Pasos siguientes
Para ver una introducción sobre cómo crear definiciones de UI, consulte
[Link] para la experiencia de creación de aplicaciones
administradas de Azure.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Elemento de interfaz de usuario
[Link]
Artículo • 01/06/2023
Schema
JSON
{
"name": "storageBlobSelection",
"type": "[Link]",
"visible": true,
"toolTip": "Select storage blob",
"label": "Package (.zip, .cspkg)",
"options": {
"text": "Select Package"
},
"constraints": {
"allowedFileExtensions": [ "zip", "cspkg" ]
}
}
Salida de ejemplo
JSON
{
"blobName": "[Link]",
"sasUri":
"[Link]
sp=r&se=2020-10-10T[Link]Z&sv=2019-12-
12&sr=b&sig=X4EL8ZsRmiP1TVxkVfTcGyMj2sHg1zCbFBXsDmnNOyg%3D"
}
Observaciones
La propiedad [Link] especifica los tipos de archivo
permitidos.
Pasos siguientes
Para ver una introducción sobre la creación de definiciones de interfaz de usuario,
consulte Introducción a CreateUiDefinition.
Para ver una descripción de las propiedades comunes de los elementos de interfaz
de usuario, consulte Elementos CreateUiDefinition.
Definiciones integradas de Azure Policy
para Azure Managed Applications
Artículo • 06/02/2024
Esta página es un índice de las definiciones de directivas integradas de Azure Policy para
Azure Managed Applications. Puede encontrar elementos integrados adicionales de
Azure Policy para otros servicios en Definiciones de elementos integrados de Azure
Policy.
Pasos siguientes
Los elementos integrados se pueden encontrar en el repositorio de GitHub de
Azure Policy .
Revise la estructura de definición de Azure Policy.
Vea la Descripción de los efectos de directivas.