Implementación de pruebas de cumplimiento con Terraform y Azure

Terraform habilita la definición, vista previa e implementación de la infraestructura en la nube. Con Terraform, se crean archivos de configuración mediante la sintaxis de HCL. La sintaxis de HCL permite especificar el proveedor de la nube, como Azure, y los elementos que componen la infraestructura de la nube. Después de crear los archivos de configuración, se crea un plan de ejecución que permite obtener una vista previa de los cambios de infraestructura antes de implementarlos. Una vez que compruebe los cambios, aplique el plan de ejecución para implementar la infraestructura.

Muchas veces, las pruebas de cumplimiento forman parte del proceso de integración continua y se usan para asegurarse de que se siguen las directivas definidas por el usuario. Por ejemplo, puede definir convenciones de nomenclatura geopolítica para los recursos de Azure. Otro ejemplo común es la creación de máquinas virtuales a partir de un subconjunto definido de imágenes. Las pruebas de cumplimiento se usarían para aplicar reglas en estos escenarios, entre otros muchos.

En este artículo aprenderá a:

  • Descubra cuándo usar las pruebas de cumplimiento
  • Descubrir cómo hacer una prueba de cumplimiento.
  • Ver y ejecutar un ejemplo de prueba de cumplimiento.

1. Configurar su entorno

  • Suscripción de Azure: si no tiene una suscripción a Azure, cree una cuenta gratuita antes de empezar.
  • Docker:Install Docker.

  • Python:Instalar Python.

  • Herramienta de cumplimiento de Terraform: para instalar la herramienta de cumplimiento de Terraform, ejecute el siguiente comando: pip install terraform-compliance.

  • Código de ejemplo y recursos: use la herramienta DownGit para descargar de GitHub el proyecto de pruebas de cumplimiento y descomprímalo en un nuevo directorio para que contenga el código de ejemplo. Este directorio se conoce como el directorio de ejemplo.

2. Descripción de las pruebas y comprobaciones de cumplimiento

Las pruebas de cumplimiento son una técnica de prueba no funcional para determinar si un sistema cumple los estándares prescritos. Las pruebas de cumplimiento también se conocen como pruebas de conformidad.

La mayoría de los equipos de software realizan un análisis para comprobar que los estándares se aplican e implementan correctamente. A menudo funcionan simultáneamente para mejorar los estándares que, a su vez, aumentan la calidad.

En las pruebas de cumplimiento hay dos conceptos importantes que se deben tener en cuenta: las pruebas de cumplimiento y las comprobaciones de cumplimiento.

  • Las pruebas de cumplimiento garantizan que la salida de cada fase del ciclo de vida de desarrollo se ajuste a los requisitos acordados.
  • Las comprobaciones de cumplimiento deben integrarse en el ciclo de desarrollo al principio de los proyectos. Intentar agregar comprobaciones de cumplimiento en una fase posterior es cada vez más difícil cuando el propio requisito no está documentado adecuadamente.

Realizar comprobaciones de cumplimiento es sencillo. Se desarrolla y documenta un conjunto de estándares y procedimientos para cada fase del ciclo de vida de desarrollo. Los resultados de cada fase se comparan con los requisitos documentados. Los resultados de la prueba son los "huecos" que no se ajustan a los estándares predeterminados. Las pruebas de cumplimiento se realizan a través del proceso de inspección y el resultado del proceso de revisión se debe documentar.

Veamos un ejemplo concreto.

Un problema común son los entornos que se interrumpen cuando varios desarrolladores aplican cambios incompatibles. Supongamos que una persona trabaja en un cambio y aplica recursos como la creación de una VM en un entorno de prueba. A continuación, otra persona aplica otra versión del código que aprovisiona otra versión de esa VM. Lo que se necesita aquí es una supervisión que garantice la conformidad con las reglas indicadas.

Una manera de solucionar este problema sería definir una directiva de etiquetado de los recursos, como las etiquetas role y creator. Una vez que se definen las directivas, se usa una herramienta como Terraform-compliance para garantizar que se siguen las directivas.

El cumplimiento de Terraform se centra en las pruebas negativas. Una prueba negativa es el proceso de asegurarse de que un sistema puede controlar correctamente una entrada inesperada o un comportamiento no deseado. Las pruebas de vulnerabilidad ante datos aleatorios o inesperados son un ejemplo de prueba negativa. Con las pruebas de vulnerabilidad ante datos aleatorios o inesperados, se prueba un sistema que recibe una entrada para garantizar que puede controlar de forma segura una entrada inesperada.

Afortunadamente, Terraform es una capa de abstracción para cualquier API que cree, actualice o destruya entidades de infraestructura en la nube. Terraform también garantiza que la configuración local y las respuestas de api remota estén sincronizadas. Dado que Terraform se usa principalmente en las API en la nube, todavía necesitamos una manera de asegurarse de que el código implementado en la infraestructura sigue directivas específicas. Terraform-compliance, una herramienta gratuita y de código abierto, proporciona esta funcionalidad para las configuraciones de Terraform.

Con el ejemplo de máquina virtual, una directiva de cumplimiento podría ser la siguiente: "Si va a crear un recurso de Azure, debe contener una etiqueta".

La herramienta Terraform-compliance proporciona un marco de pruebas en el que se crean directivas como en el ejemplo. Después, esas directivas se ejecutan en el plan de ejecución de Terraform.

Terraform-compliance le permite aplicar BDD o principios de desarrollo basado en el comportamiento. BDD es un proceso colaborativo en el que todas las partes interesadas trabajan juntas para definir lo que debe hacer un sistema. Estas partes interesadas suelen incluir a los desarrolladores, evaluadores y cualquier persona con un interés particular en el sistema que se implementa o que se vea afectada por este. El objetivo de BDD es animar a los equipos a crear ejemplos concretos que expresen una comprensión común de cómo debe comportarse el sistema.

3. Examen de un ejemplo de prueba de cumplimiento

Antes, en este artículo, ha leído acerca de un ejemplo de pruebas de cumplimiento para crear una VM para un entorno de ejemplo. En esta sección se muestra cómo traducir ese ejemplo en una característica y escenario de BDD. La regla se expresa, en primer lugar, mediante Cucumber, que es una herramienta que se usa para admitir BDD.

when creating Azure resources, every new resource should have a tag

La regla anterior se traduce de la siguiente manera:

If the resource supports tags
Then it must contain a tag
And its value must not be null

A continuación, el código HCL de Terraform se adhiere a la regla como se indica a continuación.

resource "random_uuid" "uuid" {}

resource "azurerm_resource_group" "rg" {
  name     = "rg-hello-tf-${random_uuid.uuid.result}"
  location = var.location

  tags = {
    environment = "dev"
    application = "Azure Compliance"
  } 
}

La primera directiva podría escribirse como un escenario de características de BDD de la siguiente manera:

Feature: Test tagging compliance  # /target/src/features/tagging.feature
    Scenario: Ensure all resources have tags
        If the resource supports tags
        Then it must contain a tag
        And its value must not be null

En el código siguiente se muestra una prueba para una etiqueta específica:

Scenario Outline: Ensure that specific tags are defined
    If the resource supports tags
    Then it must contain a tag <tags>
    And its value must match the "<value>" regex

    Examples:
      | tags        | value              |
      | Creator     | .+                 |
      | Application | .+                 |
      | Role        | .+                 |
      | Environment | ^(prod\|uat\|dev)$ |

4. Ejecución del ejemplo de prueba de cumplimiento

En esta sección, se descarga y se prueba el ejemplo.

  1. En el directorio de ejemplo, vaya al directorio src.

  2. Ejecute terraform init para inicializar el directorio de trabajo.

    terraform init
    
  3. Ejecute terraform validate para validar la sintaxis de los archivos de configuración.

    terraform validate
    

    Puntos clave:

    • Aparece un mensaje que indica que la configuración es válida.
  4. Ejecute terraform plan para crear un plan de ejecución.

    terraform plan -out main.tfplan
    
  5. Ejecute terraform show para convertir el plan de ejecución en JSON para el paso de cumplimiento.

    terraform show -json main.tfplan > main.tfplan.json
    
  6. Ejecute docker pull para descargar la imagen de terraform-compliance.

    docker pull eerkunt/terraform-compliance
    
  7. Ejecute docker run para ejecutar las pruebas en un contenedor de Docker.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Puntos clave:

    • Se producirá un error en la prueba porque, aunque la primera regla que requiere la existencia de etiquetas se realiza correctamente, la segunda regla produce un error porque faltan las etiquetas Role y Creator.

    Example of a failed test

  8. Corrija el error modificando main.tf como se muestra a continuación (se agregan las etiquetas Role y Creator).

      tags = {
        Environment = "dev"
        Application = "Azure Compliance"
        Creator     = "Azure Compliance"
        Role        = "Azure Compliance"
      } 
    
    

    Puntos clave:

    • La configuración ahora cumple con la directiva.

5. Verificación de los resultados

  1. Vuelva a ejecutar terraform validate para comprobar la sintaxis.

    terraform validate
    
  2. Vuelva a ejecutar terraform plan para crear un nuevo plan de ejecución.

    terraform plan -out main.tfplan
    
  3. Ejecute terraform show para convertir el plan de ejecución en JSON para el paso de cumplimiento.

    terraform show -json main.tfplan > main.tfplan.json
    
  4. Vuelva a ejecutar docker run para probar la configuración. SI se ha implementado la especificación completa, la prueba se realiza correctamente.

    docker run --rm -v $PWD:/target -it eerkunt/terraform-compliance -f features -p main.tfplan.json
    

    Example of a successful test

  5. Ejecute terraform apply para aplicar el plan de ejecución.

    terraform apply main.tfplan -target=random_uuid.uuid
    

    Puntos clave:

    • Se crea un grupo de recursos con un nombre que sigue el patrón: rg-hello-tf-<random_number>.

Solución de problemas de Terraform en Azure

Solución de problemas comunes al usar Terraform en Azure

Pasos siguientes