Compartir a través de


Infraestructura como código

Sugerencia

Este contenido es un extracto del libro electrónico “Architecting Cloud Native .NET Applications for Azure” (Diseño de la arquitectura de aplicaciones .NET nativas en la nube para Azure), disponible en Documentos de .NET o como un PDF descargable y gratuito que se puede leer sin conexión.

Cloud Native .NET apps for Azure eBook cover thumbnail.

Los sistemas nativos en la nube adoptan microservicios, contenedores y diseño moderno del sistema para lograr velocidad y agilidad. Proporcionan fases automatizadas de compilación y versión para garantizar código coherente y de calidad. Pero eso es solo parte de la historia. ¿Cómo se aprovisionan los entornos en la nube en los que se ejecutan estos sistemas?

Las aplicaciones nativas de nube modernas adoptan la práctica ampliamente aceptada de infraestructura como código o IaC. Con IaC, automatiza el aprovisionamiento de plataformas. Básicamente, aplica prácticas de ingeniería de software como pruebas y control de versiones a las prácticas de DevOps. La infraestructura y las implementaciones son automatizadas, coherentes y repetibles. Al igual que la entrega continua automatiza el modelo tradicional de implementaciones manuales, la infraestructura como código (IaC) está evolucionando cómo se administran los entornos de aplicación.

Las herramientas como Azure Resource Manager (ARM), Terraform y la interfaz de la línea de comandos (CLI) de Azure permiten crear scripts declarativos de la infraestructura en la nube que necesite.

Plantillas del Administrador de recursos de Azure

ARM significa Azure Resource Manager. Es un motor de aprovisionamiento de API integrado en Azure y expuesto como un servicio de API. ARM le permite implementar, actualizar, eliminar y administrar los recursos contenidos en el grupo de recursos de Azure en una sola operación coordinada. El motor se proporciona con una plantilla basada en JSON que especifica los recursos que necesita y su configuración. ARM organiza automáticamente la implementación en el orden correcto respetando las dependencias. El motor garantiza la idempotencia. Si ya existe un recurso deseado con la misma configuración, se omitirá el aprovisionamiento.

Las plantillas de Azure Resource Manager son un lenguaje basado en JSON para definir varios recursos en Azure. El esquema básico tiene un aspecto similar al de la figura 10-14.

{
  "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
  "contentVersion": "",
  "apiProfile": "",
  "parameters": {  },
  "variables": {  },
  "functions": [  ],
  "resources": [  ],
  "outputs": {  }
}

Figura 10-14: esquema de una plantilla de Resource Manager

Dentro de esta plantilla, puede definir un contenedor de almacenamiento dentro de la sección de recursos de la siguiente manera:

"resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "name": "[variables('storageAccountName')]",
      "location": "[parameters('location')]",
      "apiVersion": "2018-07-01",
      "sku": {
        "name": "[parameters('storageAccountType')]"
      },
      "kind": "StorageV2",
      "properties": {}
    }
  ],

Figura 10-15: ejemplo de una cuenta de almacenamiento definida en una plantilla de Resource Manager

Una plantilla de ARM se puede parametrizar con información de configuración y entorno dinámico. Al hacerlo, se puede reutilizar para definir diferentes entornos, como desarrollo, control de calidad o producción. Normalmente, la plantilla crea todos los recursos dentro de un único grupo de recursos de Azure. Es posible definir varios grupos de recursos en una sola plantilla de Resource Manager, si es necesario. Para eliminar todos los recursos de un entorno, elimine el propio grupo de recursos. El análisis de costos también se puede ejecutar en el nivel de grupo de recursos, lo que permite realizar una contabilidad rápida de cuánto cuesta cada entorno.

Hay muchos ejemplos de plantillas de ARM disponibles en el proyecto Plantillas de inicio rápido de Azure en GitHub. Pueden ayudar a acelerar la creación de una plantilla o la modificación de una existente.

Las plantillas de Resource Manager se pueden ejecutar de muchas maneras. Tal vez la manera más sencilla es simplemente pegarlas en Azure Portal. En el caso de las implementaciones experimentales, este método puede ser rápido. También se pueden ejecutar como parte de un proceso de compilación o versión en Azure DevOps. Hay tareas que aprovecharán las conexiones en Azure para ejecutar las plantillas. Los cambios en las plantillas de Resource Manager se aplican de forma incremental, lo que significa que para agregar un nuevo recurso solo es necesario agregarlo a la plantilla. Las herramientas conciliarán las diferencias entre los recursos actuales y los definidos en la plantilla. Los recursos se crearán o modificarán para que coincidan con lo que se define en la plantilla.

Terraform

A menudo, las aplicaciones nativas de la nube se construyen para que sean cloud agnostic. Ser así significa que la aplicación no está estrechamente acoplada a un proveedor de nube determinado y se puede implementar en cualquier nube pública.

Terraform es una herramienta de plantillas comercial que puede aprovisionar aplicaciones nativas de la nube en todos los principales actores de la nube: Azure, Google Cloud Platform, AWS y AliCloud. En lugar de usar JSON como lenguaje de definición de plantilla, usa el HCL (HashiCorp Configuration Language) ligeramente más terso.

Un archivo de Terraform de ejemplo que hace lo mismo que la plantilla de Resource Manager anterior (figura 10-15) se muestra en la figura 10-16:

provider "azurerm" {
  version = "=1.28.0"
}

resource "azurerm_resource_group" "testrg" {
  name     = "production"
  location = "West US"
}

resource "azurerm_storage_account" "testsa" {
  name                     = "${var.storageAccountName}"
  resource_group_name      = "${azurerm_resource_group.testrg.name}"
  location                 = "${var.region}"
  account_tier             = "${var.tier}"
  account_replication_type = "${var.replicationType}"

}

Figura 10-16: ejemplo de una plantilla de Resource Manager

Terraform también proporciona mensajes de error intuitivos para las plantillas de problema. También hay una tarea de validación práctica que se puede usar en la fase de compilación para detectar los errores de plantilla al principio.

Al igual que con las plantillas de Resource Manager, las herramientas de línea de comandos están disponibles para implementar plantillas de Terraform. También hay tareas creadas por la comunidad en Azure Pipelines que pueden validar y aplicar plantillas de Terraform.

A veces, las plantillas de Terraform y ARM generan valores significativos, como una cadena de conexión a una base de datos recién creada. Esta información se puede capturar en la canalización de compilación y usarse en tareas posteriores.

Scripts y tareas de la CLI de Azure

Por último, puede aprovechar la CLI de Azure para crear scripts declarativos de la infraestructura en la nube. Los scripts de la CLI de Azure se pueden crear, encontrar y compartir para aprovisionar y configurar casi cualquier recurso de Azure. La CLI es fácil de usar con una curva de aprendizaje suave. Los scripts se ejecutan en PowerShell o Bash. También son sencillos de depurar, especialmente cuando se comparan con las plantillas de ARM.

Los scripts de la CLI de Azure funcionan bien cuando es necesario anular y volver a implementar la infraestructura. La actualización de un entorno existente puede resultar complicada. Muchos comandos de la CLI no son idempotentes. Esto significa que volverán a crear el recurso cada vez que se ejecuten, incluso si el recurso ya existe. Siempre es posible agregar código que compruebe la existencia de cada recurso antes de crearlo. Pero, al hacerlo, el script puede hincharse y ser difícil de administrar.

Estos scripts también se pueden insertar en canalizaciones de Azure DevOps como Azure CLI tasks. La ejecución de la canalización invoca el script.

En la figura 10-17 se muestra un fragmento de código YAML que enumera la versión de la CLI de Azure y los detalles de la suscripción. Tenga en cuenta cómo se incluyen los comandos de la CLI de Azure en un script insertado.

- task: AzureCLI@2
  displayName: Azure CLI
  inputs:
    azureSubscription: <Name of the Azure Resource Manager service connection>
    scriptType: ps
    scriptLocation: inlineScript
    inlineScript: |
      az --version
      az account show

Figura 10-17: script de la CLI de Azure

En el artículo ¿Qué es la infraestructura como código?, su autor Sam Guckenheimer describe cómo los equipos que implementan IaC pueden ofrecer entornos estables rápidamente y a escala. Los equipos evitan la configuración manual de entornos y aplican la coherencia mediante la representación del estado deseado de sus entornos a través del código. Las implementaciones de infraestructura con IaC son repetibles y evitan problemas en tiempo de ejecución causados por el desviado de configuración o dependencias que faltan. Los equipos de DevOps pueden trabajar junto con un conjunto unificado de prácticas y herramientas para ofrecer aplicaciones y su infraestructura de apoyo de forma rápida, confiable y a escala".