Implementación de un flujo de trabajo de Azure Logic Apps con una plantilla de Azure Resource Manager
Si ha usado Azure durante un tiempo, probablemente haya oído hablar de Azure Resource Manager. Vamos a repasar cuál es el papel que Resource Manager desempeña y a ver qué conforma una plantilla de Resource Manager.
¿Qué es Azure Resource Manager?
Azure Resource Manager es la interfaz para administrar y organizar los recursos en la nube. Podríamos considerar Resource Manager como un método para implementar recursos en la nube.
Si está familiarizado con los grupos de recursos de Azure, sabe que le permiten tratar conjuntos de recursos relacionados como una sola unidad. Resource Manager organiza los grupos de recursos que permiten implementar, administrar y eliminar todos los recursos a la vez mediante una única acción.
Pensemos en los modelos financieros que ejecutamos para nuestros analistas. Para ejecutar un modelo, es posible que necesite una o varias máquinas virtuales, una base de datos para almacenar los datos y una red virtual para que haya conectividad entre todos los elementos. Con Resource Manager, puede implementar estos recursos en el mismo grupo de recursos y administrarlos y supervisarlos juntos. Cuando terminemos, podemos eliminar todos los recursos de un grupo de recursos con una sola operación.
¿Qué son las plantillas de Resource Manager?
Una plantilla de Resource Manager define con exactitud todos los recursos de Resource Manager de una implementación. Una plantilla de Resource Manager se puede implementar en un grupo de recursos con una sola operación.
Una plantilla de Resource Manager es un archivo JSON, lo que la convierte en una forma de automatización declarativa. La automatización declarativa significa que define qué recursos necesita, pero no cómo crearlos. Dicho de otro modo, definimos lo que necesitamos y luego es Resource Manager el responsable de garantizar que los recursos se implementen correctamente.
Podemos pensar en la automatización declarativa como algo parecido al modo en que los exploradores web muestran los archivos HTML. Un archivo HTML describe qué elementos aparecen en la página, pero no describe cómo mostrarlos. El "cómo" es responsabilidad del explorador web.
Nota:
Puede que haya oído hacer referencia a las plantillas de Resource Manager como plantillas de ARM. Nosotros preferimos la denominación completa plantillas de Azure Resource Manager o plantillas de Resource Manager.
Razones para usar plantillas de Resource Manager
Usar plantillas de Resource Manager le permite realizar implementaciones más rápidas y repetibles. Así, por ejemplo, ya no tendrá que crear una máquina virtual en el portal, esperar a que finalice, crear la siguiente máquina virtual, y así sucesivamente. Resource Manager se encarga de toda la implementación automáticamente.
Estas son otras ventajas que se deben tener en cuenta:
Las plantillas mejoran la coherencia.
Las plantillas de Resource Manager proporcionan un lenguaje común para que todos describan sus implementaciones. De este modo, la estructura, el formato y las expresiones dentro de la plantilla serán las mismas, independientemente de la herramienta o el SDK que se use para implementar la plantilla.
Las plantillas permiten expresar implementaciones complejas.
Las plantillas permiten implementar varios recursos en el orden correcto. Por ejemplo, no es conveniente implementar una máquina virtual antes de crear la interfaz de red o el disco de sistema operativo. Resource Manager asigna cada recurso y sus recursos dependientes y crea los recursos dependientes en primer lugar. La asignación de dependencias ayuda a garantizar que la implementación se lleva a cabo en el orden correcto.
Las plantillas reducen las tareas manuales y propensas a errores.
Crear y conectar los recursos manualmente pueden conllevar mucho tiempo y es fácil cometer errores en el camino. Resource Manager garantiza que las implementaciones se llevan a cabo de la misma manera cada vez.
Las plantillas son código.
Las plantillas expresan sus requisitos mediante código. Una plantilla es un tipo de infraestructura como código que se puede compartir, probar y versionar como cualquier otro producto de software. Además, dado que las plantillas son código, se puede crear un "rastro" que permita seguirlas. El código de plantilla documenta la implementación. La mayoría de los usuarios somete a sus plantillas a algún tipo de control de versiones, como Git. Cuando la plantilla cambia, el historial de revisiones también deja constancia de cómo dicha plantilla (y su implementación) ha evolucionado con el tiempo.
Las plantillas fomentan la reutilización.
La plantilla puede contener parámetros que se rellenan cuando la plantilla se ejecuta. Un parámetro puede definir un nombre de usuario, una contraseña, un nombre de dominio, etc. Los parámetros de plantilla permiten crear varias versiones de la infraestructura, como ensayo y producción, si bien siguen usando exactamente la misma plantilla.
Las plantillas se pueden vincular.
Puede vincular plantillas de Resource Manager para que estas se puedan modular. Puede escribir plantillas más pequeñas que definan una parte de la solución y combinarlas para crear un sistema completo.
Los modelos que los analistas financieros ejecutan son únicos, pero nosotros vemos los patrones de la infraestructura subyacente. Por ejemplo, la mayoría de los modelos requiere una base de datos para almacenar los datos. Muchos modelos usan los mismos lenguajes de programación, marcos y sistemas operativos para establecer los detalles. Puede definir plantillas que describen cada componente individual, como proceso, almacenamiento y redes. A continuación, puede combinar los componentes para satisfacer las necesidades específicas de cada analista.
¿Qué hay en una plantilla de Resource Manager?
Nota:
Aquí veremos algunos ejemplos de código para hacernos una idea de cómo se estructura cada sección. No se preocupe si lo que ve es desconocido para usted. Puede revisar las plantillas de otros usuarios y escribir las suyas propias a medida que obtenga más experiencia práctica.
Es posible que haya usado notación de objetos JavaScript (JSON) para enviar datos entre servidores y aplicaciones web. JSON es también una forma bastante extendida de describir cómo se configuran las aplicaciones y la infraestructura.
JSON nos permite expresar como texto datos almacenados como un objeto (por ejemplo, una máquina virtual). Un documento JSON es, básicamente, una colección de pares clave-valor. Cada clave es una cadena. El valor de cada clave puede ser una cadena, un número, una expresión booleana, una lista de valores o un objeto (que es una colección de otros pares clave-valor).
Una plantilla de Resource Manager puede contener las siguientes secciones:
{
"$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "",
"parameters": { },
"variables": { },
"functions": [ ],
"resources": [ ],
"outputs": { }
}
Aunque estas secciones se expresan mediante JSON, no están relacionadas con el lenguaje JSON real. Ahora se analizará cada tarea con más detalle.
Parámetros
En esta sección se especifica qué valores son configurables cuando la plantilla se ejecuta. Por ejemplo, puede permitir que los usuarios de la plantilla escriban un nombre de usuario, una contraseña o un nombre de dominio.
Este es un ejemplo que muestra dos parámetros: uno para el nombre de usuario de una máquina virtual y otro para su contraseña.
"parameters": {
"adminUsername": {
"type": "string",
"metadata": {
"description": "Username for the Virtual Machine."
}
},
"adminPassword": {
"type": "securestring",
"metadata": {
"description": "Password for the Virtual Machine."
}
}
}
Variables
En esta sección se definen los valores que se usan en toda la plantilla. Las variables contribuyen a que las plantillas sean fáciles de mantener. Por ejemplo, es posible definir un nombre de cuenta de almacenamiento una vez como una variable y, luego, usar esa variable en toda la plantilla. Si el nombre de cuenta de almacenamiento cambia, solo será necesario actualizar la variable.
Este es un ejemplo que muestra algunas variables que describen las características de red de una máquina virtual.
"variables": {
"nicName": "myVMNic",
"addressPrefix": "10.0.0.0/16",
"subnetName": "Subnet",
"subnetPrefix": "10.0.0.0/24",
"publicIPAddressName": "myPublicIP",
"virtualNetworkName": "MyVNET"
}
Functions
En esta sección se definen los procedimientos que no desea que se repitan a lo largo de la plantilla. Al igual que las variables, las funciones contribuyen a que las plantillas sean fáciles de mantener. En el siguiente ejemplo se crea una función que genera un nombre único que podría usarse al crear los recursos que tienen requisitos de nomenclatura únicos globalmente.
"functions": [
{
"namespace": "contoso",
"members": {
"uniqueName": {
"parameters": [
{
"name": "namePrefix",
"type": "string"
}
],
"output": {
"type": "string",
"value": "[concat(toLower(parameters('namePrefix')), uniqueString(resourceGroup().id))]"
}
}
}
}
],
Resources
En esta sección es donde se definen los recursos de Azure que conforman la implementación.
En el siguiente ejemplo se crea un recurso de dirección IP pública.
{
"type": "Microsoft.Network/publicIPAddresses",
"name": "[variables('publicIPAddressName')]",
"location": "[parameters('location')]",
"apiVersion": "2018-08-01",
"properties": {
"publicIPAllocationMethod": "Dynamic",
"dnsSettings": {
"domainNameLabel": "[parameters('dnsLabelPrefix')]"
}
}
}
Aquí, el tipo de recurso es Microsoft.Network/publicIPAddresses
. Su nombre se lee desde la sección variables y su ubicación (o región de Azure) se lee en la sección de parámetros.
Dado que los tipos de recursos pueden cambiar con el tiempo, apiVersion
hace referencia a la versión del tipo de recurso que queremos usar. A medida que los tipos de recursos evolucionan y cambian, podemos modificar las plantillas para que funcionen con las características más recientes cuando estemos listos.
Outputs
En esta sección se define la información que le gustaría recibir cuando se ejecute la plantilla. Por ejemplo, es posible que quiera recibir la dirección IP o el FQDN de la máquina virtual, que es una información desconocida hasta que la implementación se ejecuta.
En el ejemplo siguiente se muestra una salida denominada hostname
. El valor de FQDN se obtiene de la configuración de dirección IP pública de la máquina virtual.
"outputs": {
"hostname": {
"type": "string",
"value": "[reference(variables('publicIPAddressName')).dnsSettings.fqdn]"
}
}
¿Cómo se puede implementar un flujo de trabajo de Azure Logic Apps en una plantilla?
Un flujo de trabajo de Azure Logic Apps es un recurso de Azure. Por lo tanto, podemos implementarla en una plantilla agregándola a la lista de recursos que se van a implementar en la sección resources
de la plantilla de Resource Manager. ¿Qué se agrega exactamente a la sección de recursos para que se defina el flujo de trabajo? Agregamos la definición de flujo de trabajo JSON del flujo de trabajo en cuestión a la sección de recursos. De hecho, el fragmento de código JSON siguiente muestra una plantilla de Resource Manager para implementar el flujo de trabajo básico que describimos en la unidad anterior. Como puede ver en el resalado, la sección de recursos contiene la definición de flujo de trabajo completa.
{
"$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"variables": {},
"resources": [
{
"type": "Microsoft.Logic/workflows",
"apiVersion": "2017-07-01",
"name": "HelloLogicAppsTemplate",
"location": "westus2",
"properties": {
"state": "Enabled",
"definition": {
"$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
"contentVersion": "1.0.0.0",
"parameters": {},
"triggers": {
"manual": {
"type": "Request",
"kind": "Http",
"inputs": {
"method": "GET",
"schema": {}
}
}
},
"actions": {
"Response": {
"runAfter": {},
"type": "Response",
"kind": "Http",
"inputs": {
"body": "Hello Logic Apps Template!",
"statusCode": 200
}
}
},
"outputs": {}
},
"parameters": {}
}
}
],
"outputs": {
"logicAppUrl": {
"type": "string",
"value": "[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows/', 'HelloLogicAppsTemplate'), '/triggers/manual'), '2017-07-01').value]"
}
}
}
Podemos implementar esta plantilla con uno de los métodos siguientes:
- Implementación mediante Azure Portal.
- Implementación mediante el módulo
Az
de PowerShell. - Implementación desde la Interfaz de la línea de comandos (CLI) de Azure
En este módulo implementaremos plantillas con la CLI de Azure y los comandos az deployment group
.
¿Cómo se escribe una plantilla de Resource Manager?
Existen muchos métodos para escribir plantillas de Resource Manager. Aunque podemos escribir una plantilla desde cero, lo normal es comenzar con una plantilla existente y modificarla para adaptarla a nuestras necesidades.
Estas son algunas formas de obtener una plantilla de inicio:
- Use Azure Portal para crear una plantilla según los recursos de un grupo de recursos existente.
- Empiece con una plantilla que usted o su equipo hayan creado y que guarde un propósito similar.
- Comience con una plantilla de inicio rápido de Azure; verá cómo hacerlo en la unidad siguiente.
Independientemente del método que elija, escribir una plantilla conlleva trabajar con un editor de texto. Puede usar su editor favorito, pero la extensión Azure Resource Manager Tools de Visual Studio Code está diseñada expresamente para la creación de plantillas. Esta extensión facilita el desplazamiento por el código de la plantilla y permite finalizar automáticamente muchas de las tareas habituales.
Mientras explora y escribime las plantillas, conviene revisar la documentación para saber qué tipos de recursos hay disponibles y cómo usarlos.
En la unidad siguiente, examinaremos e implementaremos una plantilla existente desde la CLI de Azure.