Compartir a través de


Infraestructura como código

Sugerencia

Este contenido es un extracto del libro electrónico, Arquitectura de aplicaciones .NET nativas de nube para Azure, disponible en .NET Docs o como un PDF descargable gratuito que se puede leer sin conexión.

Miniatura de la portada del libro electrónico

Los sistemas nativos en la nube adoptan microservicios, contenedores y diseño moderno del sistema para lograr velocidad y agilidad. Proporcionan fases de compilación y versión automatizadas para garantizar un código coherente y de calidad. Pero eso es solo parte de la historia. ¿Cómo aprovisiona 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 le permiten generar scripts declarativos de la infraestructura en la nube que necesita.

Las plantillas de Azure Resource Manager

ARM significa Azure Resource Manager. Es un motor de aprovisionamiento de API integrado en Azure y expuesto como servicio de API. ARM permite implementar, actualizar, eliminar y administrar los recursos contenidos en el grupo de recursos de Azure en una sola operación coordinada. Proporcione al motor una plantilla basada en JSON que especifique los recursos que necesita y su configuración. ARM orquesta automáticamente la implementación en el orden correcto que respeta 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 a 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. Puede eliminar todos los recursos de un entorno mediante la eliminación del propio grupo de recursos. El análisis de costos también se puede ejecutar en el nivel de grupo de recursos, lo que permite 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 nueva plantilla o la modificación de una existente.

Las plantillas de Resource Manager se pueden ejecutar de muchas maneras. Quizás 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 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.

Terraformación

A menudo, las aplicaciones nativas de la nube se construyen como 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 (Lenguaje de Configuración Hashicorp), que es ligeramente más conciso.

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 plantillas de problemas. 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 interfaz de línea de comandos (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, si lo hace, el script se puede volver inflado y difícil de administrar.

Estos scripts también se pueden incrustar 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 muestra la versión de la CLI de Azure y los detalles de la suscripción. Observe cómo se incluyen los comandos de la CLI de Azure en un script en línea.

- 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?, el 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 al representar el 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 desfase de configuración o las dependencias que faltan. Los equipos de DevOps pueden trabajar conjuntamente con un conjunto unificado de prácticas y herramientas para ofrecer aplicaciones y su infraestructura auxiliar de forma rápida, confiable y a gran escala".